此处编写的存储过程当前将参数汇总到查询:
SELECT *
FROM Names
WHERE Name = ' || prmName || '
ORDER BY ' || prmSortField
是否可以在存储过程中参数化此查询?可能就像:
query = 'select * From Names Where Name = @name Order By ' || prmSortField
call(query, prmName)
注意:
如果您想知道我们为什么这样做,我们的sp有两个常见参数:sortFieldIndex
和sortDirection
。由于我们无法直接参数化这些,因此动态生成查询。但是其他参数使查询打开以进行注入。所以我正在寻找一种参数化一些参数的方法。
答案 0 :(得分:4)
绝对。使用cursors。
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;
答案 1 :(得分: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;
答案 2 :(得分:-1)
对于支持可选参数值的更复杂的过程(但使用sys上下文),请查看Asktom.com上的以下帖子