我正在努力创建一个动态的sql参数化查询。它涉及使用'IS NULL'或'IS NOT NULL'
这是一个简单的pl / sql查询:
CREATE OR REPLACE PROCEDURE GET_ALL_INFORMATION
(
"PARAM_START_DATE" IN DATE,
"PARAM_END_DATE" IN DATE,
"PARAM_IS_SUBMITTED" IN NUMBER,
"EXTRACT_SUBMITTED_CONTACTS" OUT sys_refcursor
) IS
sql_stmt VARCHAR2(3000);
PARAM_CONDITION VARCHAR2(20);
BEGIN
IF PARAM_IS_SUBMITTED = 1 THEN
PARAM_CONDITION := 'NOT NULL';
ELSE
PARAM_CONDITION := 'NULL';
END IF;
sql_stmt := ' SELECT
REGISTRATION_NUMBER,
NAME PROVIDER_TYPE,
ORGANIZATION
FROM TABLE_A
WHERE
P.DATE_FINALIZED IS :A;
OPEN EXTRACT_SUBMITTED_CONTACTS FOR sql_stmt USING PARAM_CONDITION;
而(USING PARAM_CONDITION)中的参数(:A)应该为'NULL'或'NOT NULL'。它似乎不像我想象的那样工作。
我错过了什么吗?
答案 0 :(得分:1)
正如上面评论中的 GriffeyDog 所解释的, bind 参数只能用作值的占位符。不要替换关键字或标识符。
但是,这不是真正的问题,因为您正在使用动态SQL 。关键的想法是,如果您将查询构建为字符串 - 当您调用EXECUTE
或OPEN .. FOR
时,PL / SQL引擎将在运行时解析它
简单地说,你需要一个连接 - 而不是一个绑定参数:
...
sql_stmt := ' SELECT
REGISTRATION_NUMBER,
NAME PROVIDER_TYPE,
ORGANIZATION
FROM TABLE_A
WHERE
P.DATE_FINALIZED IS ' || PARAM_CONDITION;
-- ^^
OPEN EXTRACT_SUBMITTED_CONTACTS FOR sql_stmt;