как вызвать хранимую процедуру из другой хранимой процедуры в Oracle - PullRequest
4 голосов
/ 11 ноября 2010

У меня есть существующая хранимая процедура, которая принимает 2 параметра и возвращает обратно курсор оракула.Курсор содержит от 30 до 60 строк данных.

Я хочу использовать вышеупомянутую ранее существующую хранимую процедуру в другой хранимой процедуре в виде таблицы ... в основном я хочу вызвать ранее существующую хранимую процедуру ипосмотрите, содержат ли возвращаемые строки определенное значение.

Например:

SP 1 = get_data_1 (returns oracle cursor)
SP 2 = get_data_2 

в get_data_2

select count(*) from get_data_1 (pass_input_parms) A where A.ID = '12345'

Концептуально это кажется тривиальнойОднако, будучи новичком в мире оракулов, я не знаю, как использовать уже существующие хранимые процедуры, которые возвращают курсоры.

Как бы я это сделал?

Ответы [ 2 ]

5 голосов
/ 11 ноября 2010

Вы не можете повторно использовать REF CURSOR из get_data_1 в последующем операторе SQL, потому что это просто указатель на дескриптор оператора.Сам курсор не содержит данных.

Вы можете сделать что-то вроде

CREATE PROCEDURE get_data_2( p_cnt OUT NUMBER )
AS
  l_rc  <<your cursor type>>;
  l_rec <<the type your cursor returns>>;
BEGIN
  get_data_1(<<parameter 1>>, <<parameter 2>>, l_rc);
  p_cnt := 0;
  LOOP
    FETCH l_rc INTO l_rec;
    EXIT WHEN l_rc%NOTFOUND;

    IF( l_rec.id = '12345' )
    THEN
      p_cnt := p_cnt + 1;
    END IF;
  END LOOP;
  CLOSE l_rc;
END;

Как вы можете себе представить, однако, это имеет тенденцию стареть относительно быстро.Учитывая это, в Oracle обычно не существует хранимых процедур, которые возвращают параметры REF CURSOR, за исключением случаев, когда вы возвращаете законченное представление данных клиентскому приложению.Например, если бы было общее представление, что и GET_DATA_1, и GET_DATA_2 могли запрашивать, вместо того чтобы GET_DATA_2 вызывал GET_DATA_1, это упростило бы программу.Если GET_DATA_1 была конвейерной табличной функцией, а не процедурой, возвращающей REF CURSOR, то было бы намного проще вызвать GET_DATA_1 из GET_DATA_2.

Если вы хотите начать работу с конвейерными табличными функциями (используя схему SCOTT)

create or replace type emp_obj as object (
  empno number,
  ename varchar2(10),
  job   varchar2(9),
  mgr   number,
  hiredate date );
/

create type emp_tbl
as
table of emp_obj;
/

create function emp_pipe( p_deptno IN NUMBER )
  return emp_tbl pipelined
is
begin
  FOR x IN (SELECT * FROM emp WHERE deptno = p_deptno)
  LOOP
    PIPE ROW( emp_obj( x.empno,
                       x.ename,
                       x.job,
                       x.mgr,
                       x.hiredate ) );
  END LOOP;
END;
/

SQL> select * from table( emp_pipe( 10 ) );

     EMPNO ENAME      JOB              MGR HIREDATE
---------- ---------- --------- ---------- ---------
      7782 CLARK      MANAGER         7839 09-JUN-81
      7839 KING       PRESIDENT            17-NOV-81
      7934 MILLER     CLERK           7782 23-JAN-82
0 голосов
/ 11 ноября 2010

На этом этапе вы можете также определить новый пакет и узнать, как использовать циклы курсора, чтобы справиться с этим, это даст вам больше программного управления. PL / SQL - это то, что вам нужно для поиска.

...