准备好的语句中的占位符

Posted

技术标签:

【中文标题】准备好的语句中的占位符【英文标题】:Placeholder in prepared statement 【发布时间】:2020-08-22 10:52:00 【问题描述】:

我在准备好的语句中使用以下查询。之前我在过程中使用并使用可调用但现在我试图在 jdbc 准备语句中使用选择查询。

我知道在preparestatement中我们写insert into abc values(?,?,?);

但在这里我有插入选择。许多地方都使用了相同的变量。在这个查询中,我有 2 个变量 p_entity_typep_update_mode

INSERT INTO dynamicEntitynotgett
    (entity_type, entity_id, entity_code, synonyms, action)
    WITH data_view AS
     ( -- ITEM table
      SELECT 'ITEM' entity_type, -- This separates inserted values
              item_id data_id,
              item_name data_name,
              item_desc data_desc,
              creation_date
        FROM itemde
      UNION ALL
      -- ORG table
      SELECT 'ORG' entity_type, -- This separates inserted values
              org_id,
              org_name,
              org_desc,
              creation_date
        FROM orgde
        UNION ALL
      -- Feature table
              SELECT 'FEATURES' entity_type, -- This separates inserted values
              FEATURE_id data_id,
              FEATURE_NAME data_name,
              FEATURE_DESC data_desc,
              CREATION_DATE
        FROM FEATURESDE
      )
    SELECT upper(t.entity_type),
           t.data_id,
           t.data_name,
           t.data_desc,
           CASE lower(p_update_mode)
             WHEN 'INCREMENTAL' THEN
               CASE
                 WHEN t.creation_date > b.last_update_date THEN
                   'update'
                 WHEN t.creation_date < b.last_update_date THEN
                   'add'
               END
             WHEN 'full' THEN
              'add' 
           END action
      FROM data_view t
           LEFT JOIN ODA_REFRESH_DETAILS b
                  ON b.entity_type = t.entity_type
                 AND lower(p_update_mode )='incremental'
     WHERE (upper(p_entity_type) = t.entity_type OR p_entity_type IS NULL)
       AND (lower(p_update_mode) = 'full'
            OR (lower(p_update_mode) = 'incremental' AND b.entity_type IS NOT NULL)
           );

我将从上游接收 p_entity_type 和 p_update_mode。哪种解决方案会更好?结果集或 Preparedstatement 以及如何在查询中替换这些值或使用 setXXX()。

【问题讨论】:

【参考方案1】:

我想你正在寻找namedParameterStatement。这将允许您命名参数。

我不确定您在声明中指的是什么,但例如,这一行:

SELECT 'ITEM' entity_type

可以替换为:

SELECT :ITEM as entity_type

其中:ITEM? 一样传入,但可以在语句中多次使用。

【讨论】:

谢谢@Gordon。它实际上是春季班。我们有类似香草java的东西吗?我的意思是我没有使用 spring 框架。 @Shruti 。 . .它应该可以直接使用——命名参数是一种非常典型的 SQL 编写方式。 嗨,戈登,你能帮我做同样的事情吗? ***.com/questions/63541003/… 先生,我面临着类似的问题。此查询在 pl/sql ***.com/questions/63553154/… 中的过程中正常工作

以上是关于准备好的语句中的占位符的主要内容,如果未能解决你的问题,请参考以下文章

带有命名占位符的 PDO 准备好的语句 IN 子句无法按预期工作 [重复]

Golang使用准备好的SQL语句

使用带占位符的 LIKE 准备语句 [重复]

更新语句的 JDBC 占位符限制的解决方法失败

mysqli使用IN运算符和另一个占位符准备语句

为 EXECUTE IMMEDIATE 解析 PL/SQL 语句中的占位符