Записываемые здесь хранимые процедуры в настоящее время объединяют параметры с запросами:
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. Поскольку мы не можем напрямую параметризовать их, запрос создается динамически. Но другие параметры делают запросы открытыми для внедрения. Итак, я ищу способ параметризации некоторых параметров.





Абсолютно. Используйте курсоры.
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;
Для динамического запроса со значениями привязки сделайте следующее:
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;
Для более сложной процедуры, которая поддерживает значения необязательных параметров (но использует контекст sys), ознакомьтесь со следующим сообщением на Asktom.com.
А как насчет переменной prmSortField OP? Как можно параметризовать поле упорядочивания без динамических запросов?