0

FirefoxでiSQLPlusを使用して、次のコードを使用してプロシージャを作成しました。プロシージャは正常にコンパイルされます。

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;

これに失敗した場合 (エッジ ケース、歪んだデータのバインド変数を回避したい場合があります)、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 インジェクションに注意してください)。

于 2013-01-23T07:36:11.230 に答える