我有一个查询,用于查询最后一小时内下的订单。根据客户端的不同,某些条件会应用于查询的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')@