1

此处编写的存储过程当前将参数连接到查询:

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

是否可以在存储过程中参数化此查询?可能喜欢:

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

注意:
如果您想知道我们为什么这样做,我们的 sp 有两个常用参数: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 回答