在现有 where 子句中添加 DB2 动态 SQL 代码

Adding DB2 dynamic SQL code within an existing where clause

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

查询将如下所示:

SELECT * FROM ORDERS
WHERE <INSERT SQL STATEMEMT>

我创建了一个函数来从 table 中提取 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 子句。

感谢您的帮助。

您没有准确描述如何使用最终语句。
简而言之:您不能对 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')@