【问题标题】:Error in Parameters of Stored Procedure when Dynamic SQL is used使用动态SQL时存储过程参数错误
【发布时间】:2013-04-01 12:38:24
【问题描述】:

我正在使用 Oracle Sql Developer 编写一个存储过程,它接受由“,”(动态 sql)分隔的值列表,并在“ in" 子句从表中触发查询。

但我在

处遇到错误
@p_case_nbr       varchar2(100),

错误(4,5):PLS-00103:在预期以下情况之一时遇到符号“@”:当前删除之前存在

使用的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;

【问题讨论】:

    标签: sql stored-procedures dynamic-sql oracle-sqldeveloper


    【解决方案1】:

    ORACLE 中不需要在变量前给出@ 只需尝试从@p_case_nbr 中删除@,然后再试一次 也不需要像@p_case_nbr varchar2(100)这样指定参数的大小 只要给@p_case_nbr varchar

    【讨论】:

    • 嗨,我在 oracle 中尝试了没有@符号的这种方法,但这没有帮助。它始终将字符串视为要搜索的直接值,而不是准备动态查询。但是当我尝试调试以检查传递给 p_case_nbr 的值是什么时。它作为完美的“,”分隔值传递。 p_case_nbr '00100999996544413869','00100999996544414064','00100999996544413470' VARCHAR2. 但是查询认为带有“,”的值是要搜索的整个值。
    • 程序中的dynamic sql 是什么意思,如果你想在where t.column1 in (p_case_nbr); 检查值,那么在调用proc 时只需传递'00100999996544413869,00100999996544414064,00100999996544413470'
    • 如果我删除@符号但也没有输出,我不会遇到任何错误。我用set serveroutput on; variable out_var1 varchar2; exec TEST_PROC ('00100999996544413869,00100999996544414064,00100999996544413470', :out_var1 ); print :out_var1;exec TEST_PROC ('''00100999996544413869'',''00100999996544414064'',''00100999996544413470''', :out_var1 ); 试过这个,但仍然没有输出。但是,当我手动运行它时,此查询会获取结果select t.COLUMN1 from test_table t where t.column1 in ('00100999996544413869','00100999996544414064','00100999996544413470')
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多