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



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

查询如下所示:

SELECT * FROM ORDERS
WHERE <INSERT SQL STATEMEMT>

我创建了一个FUNCTION来从表中提取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子句时遇到了问题。我尝试过PREPARE 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')@

最新更新