1

ここで記述されているストアドプロシージャは、現在、パラメータをクエリに連結しています。

   SELECT * 
     FROM Names 
    WHERE Name = ' || prmName || ' 
 ORDER BY ' || prmSortField

ストアドプロシージャ内でこのクエリをパラメータ化することは可能ですか?おそらく好き:

query = 'select * From Names Where Name = @name Order By ' || prmSortField
call(query, prmName)

注:
なぜそうするのか疑問に思われるかもしれませんが、spには2つの一般的なパラメーターがあります:sortFieldIndexsortDirection。これらを直接パラメータ化することはできないため、クエリは動的に生成されます。ただし、他のパラメーターを使用すると、クエリをインジェクション用に開くことができます。だから私はいくつかのパラメーターをパラメーター化する方法を探しています。

4

3 に答える 3

4

絶対。カーソルを使用します。

DECLARE
  CURSOR c1 (job VARCHAR2, max_wage NUMBER) IS
    SELECT * FROM employees WHERE job_id = job AND salary > max_wage;
BEGIN
  FOR person IN c1('CLERK', 3000)
  LOOP
     -- process data record
    DBMS_OUTPUT.PUT_LINE('Name = ' || person.last_name || ', salary = ' ||
                         person.salary || ', Job Id = ' || person.job_id );
  END LOOP;
END;
于 2009-01-16T09:45:59.823 に答える
4

バインド値を使用する動的クエリの場合は、次のようにします。

procedure p (prmName varchar2, prmSortField varchar2)
is
    query varchar2(100);
    rc sys_refcursor;
    names_rec names%rowtype;
begin
    query = 'select * From Names Where Name = :name Order By ' || prmSortField
    open rc for query using prmName;
    loop
        fetch rc into names_rec;
        exit when rc%notfound;
        -- process this row
    end loop;
    close rc;
end;
于 2009-01-16T10:30:35.380 に答える
-1

オプションのパラメーター値をサポートする (ただし sys コンテキストを使用する) より複雑な手順については、Asktom.com の次の投稿を確認してください。

PRATTY -- 「CURSOR」に関するご質問ありがとうございます...

于 2009-01-16T12:30:35.727 に答える