2014-12-22 3 views
0

Я изо всех сил пытаюсь создать динамический sql-параметризованный запрос. Она включает в себя использование 'IS NULL' или 'IS NOT NULL'Динамические параметры Oracle

Вот простой 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; 

В то время как параметр (: A) в (С ИСПОЛЬЗОВАНИЕМ PARAM_CONDITION) должен иметь 'NULL' или 'НЕ НОЛЬ'. Кажется, он не работает так, как я себе представлял.

Я что-то упустил?

+1

параметры Bind не могут быть использованы в этой моде. Кроме того, вам, похоже, не хватает закрывающей одинарной кавычки. Если вы собираетесь использовать динамический SQL, просто создайте свое строковое значение, чтобы прямо содержать 'is null 'или' is not null'. – GriffeyDog

ответ

1

Как поясняет GriffeyDog в выше комментарий, связывают параметры могут быть использованы только в качестве держателя место для значений. Не заменять ключевые слова или идентификаторы.

Однако, это не проблема, поскольку вы используете динамический SQL. Основная идея ifs заключается в том, что вы создаете свой запрос в виде строки - и он будет анализироваться во время выполнения PL/SQL-движком при вызове EXECUTE или OPEN .. FOR.

Проще говоря, вам нужна конкатенация - не связанный параметр:

... 
    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; 
Смежные вопросы