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