【问题标题】:Adding DB2 dynamic SQL code within an existing where clause在现有 where 子句中添加 DB2 动态 SQL 代码
【发布时间】:2021-06-04 20:45:20
【问题描述】:

我有一个针对过去一小时内下达的订单运行的查询。根据客户端,某些条件将应用于查询的 WHERE 子句。 SQL WHERE 子句存储在每个客户端的单独表中。

查询将如下所示:

SELECT * FROM ORDERS
WHERE <INSERT SQL STATEMEMT>

我创建了一个函数来从表中提取 SQL 语句。

CREATE OR REPLACE FUNCTION QUERY_SQL( 
iCLIENTID VARCHAR(10)) 
RETURNS VARCHAR(4000)
LANGUAGE SQL 
SPECIFIC FN_QUERY_SQL
READS SQL DATA 
NO EXTERNAL ACTION 
DETERMINISTIC 
BEGIN ATOMIC 

DECLARE SQLQUERY VARCHAR(4000);

SET SQLQUERY=(SELECT CAST(SQL_STMT AS VARCHAR(4000)) 
FROM CONSUMER_NOTIFICATION 
            WHERE 
    CLIENT_ID=iCLIENTID
    FETCH FIRST ROW ONLY
    );
  RETURN SQLQUERY; 

  END

我在将代码插入 WHERE 子句时遇到了问题。我尝试准备 SQL 代码,但这似乎不起作用,因为 SQL 只是 WHERE 子句而不是完整的查询。

我见过的 DB2 动态 SQL 基于 SQL 状态相当固定的参数值生成。我需要更改每个客户端的整个 WHERE 子句。

感谢您的帮助。

【问题讨论】:

    标签: dynamic-sql db2-luw


    【解决方案1】:

    您尚未准确描述如何使用最终语句。
    简而言之:您不能在WHERE 中对整个表达式使用参数标记。
    看下面的例子。

    --#SET TERMINATOR @
    
    CREATE OR REPLACE PROCEDURE TEST_WHERE (P_WHERE VARCHAR(500)) 
    DYNAMIC RESULT SETS 1
    BEGIN
      DECLARE C1 CURSOR WITH RETURN FOR S1;
    
      PREPARE S1 FROM 'SELECT TABSCHEMA, TABNAME FROM SYSCAT.TABLES WHERE ' || P_WHERE;  
      OPEN C1;
    
      -- Don't try something like below
      -- It will expect a BOOLEAN parameter there, but it's proabably not what you need:
      -- call test_where('FALSE') / call test_where('TRUE')
    
      -- PREPARE S1 FROM 'SELECT TABSCHEMA, TABNAME FROM SYSCAT.TABLES WHERE ?';
      -- OPEN C1 USING P_WHERE;
    END
    @
    
    call test_where('TABSCHEMA = ''SYSCAT'' FETCH FIRST 5 ROWS ONLY')@
    

    【讨论】:

    • 所以我必须将整个查询生成为动态 SQL,而不是仅仅能够动态插入 WHERE 子句,对吗?
    • 您使用的措辞不正确。 1. 您必须使用动态 SQL(而不是静态 SQL,当您的语句的访问计划在例程编译时生成时)。 2. 此动态语句中不得使用参数生成器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2014-03-03
    • 1970-01-01
    相关资源
    最近更新 更多