Можно ли параметризовать запрос внутри PL SQL? - PullRequest
1 голос
/ 16 января 2009

Хранимые процедуры, которые здесь пишутся, в настоящее время согласовывают параметры с запросами:

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

Ответы [ 3 ]

4 голосов
/ 16 января 2009

Для динамического запроса со значениями связывания сделайте следующее:

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;
4 голосов
/ 16 января 2009

Абсолютно. Используйте курсоры .

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;
0 голосов
/ 16 января 2009

Для более сложной процедуры, которая поддерживает необязательные значения параметров (но использует контекст sys), ознакомьтесь со следующим постом на Asktom.com

PRATTY - Спасибо за вопрос по поводу "CURSOR" ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...