Oracle动态参数

时间:2014-12-22 21:58:53

标签: oracle plsql

我正在努力创建一个动态的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'。它似乎不像我想象的那样工作。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

正如上面评论中的 GriffeyDog 所解释的, bind 参数只能用作的占位符。不要替换关键字或标识符。

但是,这不是真正的问题,因为您正在使用动态SQL 。关键的想法是,如果您将查询构建为字符串 - 当您调用EXECUTEOPEN .. 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;