2013-01-23 70 views
0

調用存儲過程我一直在使用的Firefox使用isql加上下面的代碼創建的過程。該過程成功編譯。甲骨文從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
在你的情況下

,沒有必要對動態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; 

做不到這一點(邊緣的情況下,有時要避免偏斜數據綁定變量)的varchar2需要在引號引起:

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

+0

謝謝你。非常感謝您的幫助。 – waqas