2013-04-01 1 views
0

Я использую Oracle SQL Developer написать ХП, которая принимает список значений, разделенных «» (динамический SQL) и использовать эту переменную "in", чтобы вызвать запрос из таблицы.Ошибка параметров хранимой процедуры, когда динамический SQL используется

Но я кончаю с ошибкой в ​​

@p_case_nbr  varchar2(100), 

Error (4,5): PLS-00103: Обнаружен символ "@", когда ожидает одно из следующих действий: ток удаления существует до

СП б:

create or replace 
procedure TEST_PROC 
( 
    @p_case_nbr  varchar2(100), 
    p_out_case_nbr out varchar2 
) 
as 
    cursor test_cur is 
     select t.COLUMN1 
     from test_table t 
     where t.column1 in (@p_case_nbr); 

     test_cur_line test_cur%ROWTYPE; 
begin 

p_out_case_nbr := null; 

    open test_cur; 
    LOOP 
     FETCH test_cur INTO test_cur_line; 
     EXIT WHEN test_cur%NOTFOUND; 

     p_out_case_nbr := p_out_case_nbr || ' ' || test_cur_line.COLUMN1; 
     dbms_output.put_line(test_cur_line.COLUMN1); 

    end loop; 
    close test_cur; 

    dbms_output.put_line('Final Value ' || p_out_case_nbr); 
    dbms_output.put_line('SP Completed Succesfully'); 
end; 

ответ

0

В ORACLE нет необходимости давать @ перед тем varibles Просто попробуйте удалить @ из @p_case_nbr, где когда-либо указанный и попробуйте еще раз , а также нет необходимости указания размера параметра, как @p_case_nbr varchar2(100) просто дать @p_case_nbr varchar

+0

Привет, Я попробовал этот подход без символа @ в оракула, но это не помогло. Он всегда обрабатывал строку как прямое значение для поиска вместо ** подготовки динамического запроса **. Но когда я попытался отладить, чтобы проверить, какое значение было передано p_case_nbr. Это было передано как идеальное «разделенное» значение. 'p_case_nbr \t '00100999996544413869', '00100999996544414064', '00100999996544413470' \t VARCHAR2.' Однако запрос думал значение с "" есть все значение для поиска. –

+0

Какое сообщение об ошибке вы столкнулись после удаления '@' – Aspirant

+0

Что вы подразумеваете под 'dynamic sql' в вашей программе , если вы хотите, чтобы значения проверялись на' where t.column1 in (p_case_nbr); 'тогда при вызове proc просто проходит '' 00100999996544413869,00100999996544414064,00100999996544413470'' – Aspirant

Смежные вопросы