Я хочу создать процедуру, которая использует курсор в качестве входных данных в Oracle. Я попробовал что-то вроде этого:
cursor cur is select * from table t1;
а затем также:
create or replace procedure (I want to input cursor cur here)
is
begin
end;/
Как мне это сделать?
Если вам нужно передать курсор, вы должны использовать REF CURSOR. Используйте тип sys_refcursor для легкодоступного курсора слабой ссылки, откройте его для нужного запроса и передайте его процедуре, которая должна ожидать аргумент типа sys_refcursor. Затем он может выполнить выборку из курсора, но ответственность за то, чтобы он извлекался в правильно выровненную структуру строк, лежит на нем. Это очень помогает стандартизировать список столбцов для курсоров, передаваемых определенному процессу. Имейте в виду, что использование реф-курсоров — это промежуточный метод, а не тот, который следует использовать без необходимости.
@NickW Я не могу использовать таблицу в процедуре, поскольку таблица существует в другой базе данных, и у меня нет прав на создание ссылки на базу данных и нет доступа для создания таблицы или процедуры в другой базе данных
@Mark - Если нет ссылки на базу данных и вы не можете создать ссылку на базу данных, я не понимаю, как можно открыть курсор, который запрашивает удаленную таблицу в базе данных, где существует процедура, чтобы передать sys_refcursor процедуре. Вы не можете подключиться к удаленной базе данных, открыть там курсор, а затем передать его локальной процедуре, если вы об этом думаете. Вам придется решить основную проблему: вам нужны данные из удаленной базы данных, но локальный администратор базы данных не хочет подключений к этой удаленной базе данных.


Вот пример, который показывает один из способов сделать это.
Процедура, которая принимает курсор в качестве параметра, проходит по нему и отображает его содержимое:
SQL> create or replace procedure p_test (par_cursor in sys_refcursor)
2 is
3 l_ename emp.ename%type;
4 l_sal emp.sal%type;
5 begin
6 loop
7 fetch par_cursor into l_ename, l_sal;
8 exit when par_cursor%notfound;
9 dbms_output.put_line(l_ename ||' - '|| l_sal);
10 end loop;
11 end;
12 /
Procedure created.
Как это использовать?
SQL> set serveroutput on
SQL> declare
2 l_rc sys_refcursor;
3 begin
4 open l_rc for
5 select ename, sal
6 from emp
7 where deptno = 10;
8 p_test (l_rc);
9 end;
10 /
CLARK - 2450
KING - 5000
MILLER - 1300
PL/SQL procedure successfully completed.
SQL>
Привет! Как вы думаете, каким будет тип данных параметра, который вы передаете в SP? Почему бы просто не запустить курсор внутри SP — это кажется гораздо более простым подходом?