2013-04-01 57 views
0

我使用的Oracle SQL Developer写一个存储过程,它接受由“”分开的值的列表(动态SQL),并在使用该变量“”子句中激发表中的查询。 PLS-00103:错误在存储过程的参数时动态SQL使用

但我在

@p_case_nbr  varchar2(100), 

错误(4,5)结束了一个错误出现符号“@”在需要下列之一时:当前存在删除之前

的SP使用:

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没有必要的可变因素之前给只是尝试删除从@p_case_nbr在以往任何时候指定的@,并尝试再次 ,也没有必要指定如@p_case_nbr varchar2(100) 参数的大小只是给@p_case_nbr varchar

+0

嗨, 我试过这种方法没有@符号在Oracle中,但这并没有帮助。 它始终将字符串视为直接值来搜索,而不是**准备动态查询**。 但是,当我试图调试,以检查传递给p_case_nbr的值是什么。它被作为完美的','分开的值传递。 'p_case_nbr \t '00100999996544413869', '00100999996544414064', '00100999996544413470' \t VARCHAR2.' 但是查询的思想与价值观 “” 是搜索整个价值。 –

+0

什么是您要删除'@' – Aspirant

+0

后面临什么叫'动态sql'意思是,如果你想在'其中(p_case_nbr)t.column1进行检查值在你的程序 错误消息;'然后同时呼吁该proc只是通过 ''00100999996544413869,00100999996544414064,00100999996544413470'' – Aspirant