ORACLE вызов хранимой процедуры внутри пакета с типом курсора - PullRequest
0 голосов
/ 18 апреля 2020

Я действительно борюсь с вызовом хранимой процедуры ниже. Я использую oracle sql разработчика, версия 19.2. Я попробовал этот ответ , но я получаю ошибки (те же, что описаны в комментариях). Почему так сложно вызвать такую ​​простую хранимую процедуру от sql разработчика?

create or replace PACKAGE BODY "PCK_FIRST" IS
      PROCEDURE GET_GETNAMES(
        USER_ID IN NUMBER,    
        M_RESULT OUT TYPES.CURSOR_TYPE
      ) IS
      BEGIN
        OPEN M_RESULT FOR
        SELECT * FROM PER_NAMES WHERE ID = USER_ID;
      END;

END PCK_FIRST;

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Объявите переменную с типом TYPES.CURSOR_VALUE, а затем используйте ее как вывод курсора:

DECLARE
  cur    TYPES.CURSOR_TYPE;
  p_id   PER_NAMES.ID%TYPE;
  p_name PER_NAMES.NAME%TYPE;
BEGIN
  PCK_FIRST.get_getnames( 1, cur );
  LOOP
    FETCH cur INTO p_id, p_name;
    EXIT WHEN cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE( p_id || ': ' || p_name );
  END LOOP;
  CLOSE cur;
END;
/

db <> fiddle здесь


Если вы хотите вызвать его в SQL Developer, тогда:

VARIABLE cur REFCURSOR;
EXECUTE pck_first.get_getnames(1, :cur);
PRINT cur;

И запустите его как скрипт, используя F5 (а не как отдельные операторы используя Ctrl-Enter ).

1 голос
/ 18 апреля 2020

Как сначала я предлагаю вам запустить это, затем попробуйте снова выполнить c вашу процедуру

create or replace package types as
   type cursor_type is ref cursor;
end
/

в противном случае попробуйте это изменение TYPES.CURSOR_TYPE with sys_refcursor

--example
create table test_user (
   user_id number(19) not null,
   username varchar2(50)
);

insert into test_user values (1, 'user1');

insert into test_user values (2, 'user2');

create or replace procedure test_proc (
   p_user_id in number,
   p_out_rec out sys_refcursor
)
is
   l_out SYS_REFCURSOR;
begin
   open l_out for
      select * 
        from test_user
       where user_id = p_user_id;
end;
/

declare
   l_output sys_refcursor;
   l_userid number := 1;
begin
  test_proc(1, l_output);
end;

PL/SQL procedure successfully completed.
...