来自iSQL PLUS的Oracle存储过程调用无效标识符

时间:2013-01-23 05:44:13

标签: oracle stored-procedures plsql isql

我在Firefox上使用iSQL Plus使用以下代码创建了一个过程。该过程成功编译。

create or replace procedure get_staff  (
    product_no in varchar2,
    o_cursor out sys_refcursor)
is
begin
        open o_cursor for
        'select sr.name, sr.bonus from sales_staff sr inner join product p on p.sales_staff_id = sr.staff_id where product_no = ' || product_no ;
end;

我正在尝试使用以下代码调用此过程

var rc refcursor
exec get_staff('A56',:rc)
print rc

我收到以下错误。

ERROR at line 1: 
ORA-00904: "A56": invalid identifier 
ORA-06512: at "AA2850.GET_STAFF", line 6 
ORA-06512: at line 1 
ERROR: 
ORA-24338: statement handle not executed 
SP2-0625: Error printing variable "rc" 

1 个答案:

答案 0 :(得分:1)

如果你有,那就不需要动态的sql:

open o_cursor for
        select sr.name, sr.bonus 
          from sales_staff sr 
               inner join product p 
                       on p.sales_staff_id = sr.staff_id
         where p.product_no = product_no;

如果您使用的是动态SQL,那么理想情况下您可能会想要绑定:

open o_cursor for
        'select sr.name, sr.bonus 
          from sales_staff sr 
               inner join product p 
                       on p.sales_staff_id = sr.staff_id
         where p.product_no = :b1' using product_no;

如果失败(边缘情况,有时你想避免偏斜数据的绑定变量),varchar2s需要用引号括起来:

open o_cursor for
        'select sr.name, sr.bonus 
          from sales_staff sr 
               inner join product p 
                       on p.sales_staff_id = sr.staff_id
         where p.product_no = ''' ||product_no||'''';

但你应该转义单引号并验证product_no没有半冒号等(即小心SQL注入)