Как передать SQL запрос в качестве параметра? - PullRequest
0 голосов
/ 27 августа 2018
create or replace procedure sqldynamic(sqlquery sys_refcursor)
is 
cursor c1 is sqlquery;
begin
open c1;

end;

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Если вы хотите передать SQL-запрос в качестве параметра, попробуйте следующее

CREATE OR REPLACE PROCEDURE sqldynamic (sqlquery IN SYS_REFCURSOR)
IS
BEGIN
   LOOP
      FETCH sqlquery INTO <your variables>;
      EXIT WHEN sqlquery %NOTFOUND;
   END LOOP;

END

и выполните описанную выше процедуру как

DECLARE
   my_cursor SYS_REFCURSOR;
BEGIN
   OPEN my_cursor FOR
      SELECT  <columns>
      FROM <your_table>;
   sqldynamic (my_cursor);
   CLOSE my_cursor;
END;

Замените все, что сочтено необходимым, внутри <>

Например

CREATE OR REPLACE PROCEDURE sqldynamic (sqlquery IN SYS_REFCURSOR)
IS
   v_emp_number   employees.emp_number%TYPE;
   v_emp_name     employees.employee_name%TYPE;
BEGIN
   LOOP
      FETCH sqlquery INTO v_emp_number, v_emp_name;
      DBMS_OUTPUT.put_line (
     'v_emp_number   ' || v_emp_number || '  v_emp_name  ' || v_emp_name);
      EXIT WHEN sqlquery%NOTFOUND;
   END LOOP;
END;

И выполнить описанную выше процедуру в виде блока PL / SQL

DECLARE
   my_cursor   SYS_REFCURSOR;
BEGIN
   OPEN my_cursor FOR SELECT emp_number, employee_name FROM employees WHERE emp_number=108;

   sqldynamic (my_cursor);

   CLOSE my_cursor;
END;
0 голосов
/ 27 августа 2018

Вам не нужно открывать курсор, он уже открыт.Просто наберите

create or replace procedure sqldynamic(sqlquery sys_refcursor) is 
begin
   LOOP
      FETCH sqlquery INTO ...;
      EXIT WHEN sqlquery%NOTFOUND; 
      ...
   END LOOP;

end;

Вы бы назвали процедуру так:

DECLARE
   curSel SYS_REFCURSOR;
BEGIN
   OPEN curSel FOR ...;
   sqldynamic(curSel);

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