Вопрос по oracle, plsql, stored-procedures – Получить набор результатов из хранимой процедуры Oracle

29

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

Конвертируя в Oracle, я иду против проблемы, что я в Oracle не буду отображать набор результатов

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

Псевдокод:

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

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

@ Dr.MAF Вопрос имеет почти 110 000 просмотров сейчас. Довольно удивительно, если вы спросите меня. Wilson
@ Уилсон Извините, я не понял вашу идею. Что я тебе спрошу? Dr. MAF
Я болтаюсь. Этот вопрос имеет & gt; 90K просмотров и получил только 20 голосов. Это заслуживает голосования за просмотр. : D Dr. MAF

Ваш Ответ

5   ответов
1

В SQL Plus:

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

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

58

В 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
Печать RC хорошо в SQL плюс, как я могу отобразить RC в сетке в SQL Developer?
Отлично! Спасибо за ответ, Тони. Могу ли я экспортировать эти результаты в CSV через скрипт Unix / Linux?
Я болтаюсь. Этот вопрос имеет & gt; 90K просмотров и получил только 20 голосов. Это заслуживает голосования за просмотр. И ваш ответ заслуживает 10 голосов за просмотр. Большое спасибо.
4

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

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

Привет, я знаю, что это спросили некоторое время назад, но я только что понял это, и это может помочь кому-то еще. Не уверен, что это именно то, что вы ищете, но именно так я называю сохраненный процесс и просматриваю результаты с помощью SQL Developer.
В SQL Developer при просмотре процесса щелкните правой кнопкой мыши и выберите «Запустить». или нажмите 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;
1

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

select * from table(yourfunction(param1, param2)); You can join your results to other tables or filter or sort them as you please.. the results appear as regular query results so you can easily manipulate them.

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

  -- 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;

Похожие вопросы