Подтвердить что ты не робот

Получить результаты из хранимой процедуры оракула

Я работаю над преобразованием хранимой процедуры с SQL-сервера в Oracle. Эта хранимая процедура предоставляет прямой набор результатов. Я имею в виду, что если вы вызываете хранимую процедуру, например, в Management Studio, вы напрямую получаете набор результатов.

Преобразуясь в Oracle, я перехожу к проблеме, которая в Oracle не отображает результаты

Я искал в Интернете и видел, что хранимая процедура должна давать REF CURSOR, но я все еще хожу с проблемой написать небольшой кусок кода, чтобы получить процесс resultet en.

Псевдокод:

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

У кого-то есть идея?

4b9b3361

Ответ 1

В SQL Plus:

SQL> create procedure myproc (prc out sys_refcursor)
  2  is
  3  begin
  4     open prc for select * from emp;
  5  end;
  6  /

Procedure created.

SQL> var rc refcursor
SQL> execute myproc(:rc)

PL/SQL procedure successfully completed.

SQL> print rc

     EMPNO ENAME      JOB              MGR HIREDATE           SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ----------- ---------- ---------- ----------
      7839 KING       PRESIDENT            17-NOV-1981       4999                    10
      7698 BLAKE      MANAGER         7839 01-MAY-1981       2849                    30
      7782 CLARKE     MANAGER         7839 09-JUN-1981       2449                    10
      7566 JONES      MANAGER         7839 02-APR-1981       2974                    20
      7788 SCOTT      ANALYST         7566 09-DEC-1982       2999                    20
      7902 FORD       ANALYST         7566 03-DEC-1981       2999                    20
      7369 SMITHY     CLERK           7902 17-DEC-1980       9988         11         20
      7499 ALLEN      SALESMAN        7698 20-FEB-1981       1599       3009         30
      7521 WARDS      SALESMAN        7698 22-FEB-1981       1249        551         30
      7654 MARTIN     SALESMAN        7698 28-SEP-1981       1249       1400         30
      7844 TURNER     SALESMAN        7698 08-SEP-1981       1499          0         30
      7876 ADAMS      CLERK           7788 12-JAN-1983       1099                    20
      7900 JAMES      CLERK           7698 03-DEC-1981        949                    30
      7934 MILLER     CLERK           7782 23-JAN-1982       1299                    10
      6668 Umberto    CLERK           7566 11-JUN-2009      19999          0         10
      9567 ALLBRIGHT  ANALYST         7788 02-JUN-2009      76999         24         10

Ответ 2

Oracle не является сервером sql. Попробуйте следующее в SQL Developer

variable rc refcursor;
exec testproc(:rc2);
print rc2

Ответ 3

Проверьте эту страницу, в ней есть примеры того, как обрабатывать REF CURSOR для нескольких разных языков программирования:

http://asktom.oracle.com/tkyte/ResultSets/index.html

Обновление: Вышеуказанная ссылка мертва, содержимое было перемещено здесь:

http://tkyte.blogspot.com/2009/10/httpasktomoraclecomtkyte.html

Бит о курсорах и наборах результатов теперь находится здесь:

http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551171813078805685

Ответ 4

В SQL Plus:

SQL> var r refcursor
SQL> set autoprint on
SQL> exec :r := function_returning_refcursor();

Заменить последнюю строку вызовом вашей процедуры/функции, и будет отображаться содержимое refcursor

Ответ 5

Привет, я знаю, что это было задано некоторое время назад, но я только что понял это, и это может помочь кому-то другому. Не уверен, что это именно то, что вы ищете, но я так называю хранимую процедуру и просматриваю вывод с помощью SQL Developer. В SQL Developer при просмотре proc щелкните правой кнопкой мыши и выберите "Выполнить" или выберите Ctrl + F11, чтобы открыть окно Run PL/SQL. Это создает шаблон с параметрами ввода и вывода, которые необходимо изменить. Мой proc возвращает sys_refcursor. Сложная часть для меня заключалась в объявлении типа строки, который в точности эквивалентен select stmt/sys_refcursor, возвращаемому proc:

DECLARE
  P_CAE_SEC_ID_N NUMBER;
  P_FM_SEC_CODE_C VARCHAR2(200);
  P_PAGE_INDEX NUMBER;
  P_PAGE_SIZE NUMBER;
  v_Return sys_refcursor;
  type t_row is record (CAE_SEC_ID NUMBER,FM_SEC_CODE VARCHAR2(7),rownum number, v_total_count number);
  v_rec t_row;

BEGIN
  P_CAE_SEC_ID_N := NULL;
  P_FM_SEC_CODE_C := NULL;
  P_PAGE_INDEX := 0;
  P_PAGE_SIZE := 25;

  CAE_FOF_SECURITY_PKG.GET_LIST_FOF_SECURITY(
    P_CAE_SEC_ID_N => P_CAE_SEC_ID_N,
    P_FM_SEC_CODE_C => P_FM_SEC_CODE_C,
    P_PAGE_INDEX => P_PAGE_INDEX,
    P_PAGE_SIZE => P_PAGE_SIZE,
    P_FOF_SEC_REFCUR => v_Return
  );
  -- Modify the code to output the variable
  -- DBMS_OUTPUT.PUT_LINE('P_FOF_SEC_REFCUR = ');
  loop
    fetch v_Return into v_rec;
    exit when v_Return%notfound;
    DBMS_OUTPUT.PUT_LINE('sec_id = ' || v_rec.CAE_SEC_ID || 'sec code = ' ||v_rec.FM_SEC_CODE);
  end loop;

END;

Ответ 6

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

  • select * from table(yourfunction(param1, param2));
  • Вы можете присоединить свои результаты к другим таблицам или фильтровать или отсортировать их по своему усмотрению.
  • результаты отображаются как регулярные результаты запроса, поэтому вы можете легко ими манипулировать.

Чтобы определить функцию, вам нужно сделать что-то вроде следующего:

  -- Declare the record columns
  TYPE your_record IS RECORD(
     my_col1 VARCHAR2(50), 
     my_col2 varchar2(4000)
  );
  TYPE your_results IS TABLE OF your_record;

  -- Declare the function
  function yourfunction(a_Param1 varchar2, a_Param2 varchar2)
  return your_results pipelined is
    rt          your_results;
  begin
    -- Your query to load the table type
    select s.col1,s.col2
    bulk collect into rt
    from your_table s
    where lower(s.col1) like lower('%'||a_Param1||'%');

    -- Stuff the results into the pipeline..
    if rt.count > 0 then 
      for i in rt.FIRST .. rt.LAST loop 
        pipe row (rt(i)); 
      end loop; 
    end if;

    -- Add more results as you please....
    return;
  end find;

И как уже упоминалось выше, все, что вы могли бы сделать, чтобы просмотреть ваши результаты:

select * from table(yourfunction(param1, param2)) t order by t.my_col1;