0

我使用以下代码在 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" 
4

1 回答 1

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 注入)

于 2013-01-23T07:36:11.230 回答