отобразить набор результатов из хранимой процедуры oracle 10g

Я использую PL/SQL Developer, и я написал процедуру для запуска отчета, и мне нужна процедура для вывода набора результатов.

Процедура принимает входные параметры и должна вывести набор результатов.

Я не могу использовать представление, потому что процедура вызывает несколько API, которые принимают параметры, которые я передаю в процедуру.

Из большого количества поисков я понял, что можно использовать ref_cursor, но я не могу заставить его работать.

Упрощенный вариант процедуры:

CREATE OR REPLACE PROCEDURE IFSINFO.SHORTAGE_SHEET (vSite     IN VARCHAR2,
                                                    vBuyer    IN VARCHAR2,
                                                    vSupplier IN VARCHAR2,
                                                    vCursor   OUT SYS_REFCURSOR)   
AS                                                    
BEGIN
    OPEN vCursor FOR                   
        SELECT blah blah blah blah blah blah;
END;

Я попытался выполнить процедуру и отобразить набор результатов, используя:

BEGIN
    vsite       := 'S03';
    vbuyer      := 'AW';
    vsupplier   := '%';    
    vcursor     refcursor;

    IFSINFO.SHORTAGE_SHEET(vsite => :vsite,
                           vbuyer => :vbuyer,
                           vsupplier => :vsupplier,
                           vcursor => :vcursor);                           
    print vcursor;                           
END;

А также:

variable rc refcursor; 
exec IFSINFO.SHORTAGE_SHEET('S03','AW','TQ1',:rc2); 
print rc2

Но ни работы. Пожалуйста, может кто-нибудь посоветовать, я в своем уме.

Спасибо, Роб.


person RobLaw84    schedule 07.12.2010    source источник
comment
Вы должны добавить тег оракула, это не относится к 10g.   -  person redcayuga    schedule 07.12.2010


Ответы (4)


Есть ли ошибка, которую вы видите, когда выполняете эту процедуру или запускаете ее в SQLPLUS? Можете ли вы опубликовать свой сеанс sqlplus как есть?

PRINT — это специальная команда sqlplus, и ее нельзя вызывать внутри процедурного блока. Если вам нужно распечатать результаты refcursor внутри процедуры, вам нужно будет извлечь из нее и распечатать каждую запись в нужном вам формате.

SQL> create or replace procedure test_REFCURSOR (
  2     i_number in number,
  3     o_cursor out sys_refcursor) 
  4  as
  5  begin
  6     open o_cursor for
  7        'select empno, ename from emp
  8             where rownum < ' || i_number ;
  9  end;
 10  /

Procedure created.

SQL> variable rc refcursor;
SQL> exec test_refcursor(5, :rc);

PL/SQL procedure successfully completed.

SQL> print rc;

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES

Вы также должны изменить свою процедуру (или) вызов процедуры, чтобы иметь разные имена переменных. В общем, я добавляю ко всем входным переменным префикс «i_», а ко всем выходным переменным — «o_». Таким образом, объявление вашей процедуры будет выглядеть так..

CREATE OR REPLACE PROCEDURE IFSINFO.SHORTAGE_SHEET (i_Site     IN VARCHAR2,
                                                    i_Buyer    IN VARCHAR2,
                                                    i_Supplier IN VARCHAR2,
                                                    o_Cursor   OUT SYS_REFCURSOR) AS ....

и вызов процедуры будет..

IFSINFO.SHORTAGE_SHEET(    i_site     => vsite,
                           i_buyer    => vbuyer,
                           i_supplier => vsupplier,
                           o_cursor   => vcursor);

Вам не нужно использовать «:» в начале для этих переменных, поскольку они не являются переменными среды хоста (это случай вашего второго выполнения с использованием SQLPLUS, где вы используете переменную sqlplus «rc» внутри вызова процедуры)

person Rajesh Chamarthi    schedule 07.12.2010
comment
Я не использую SQL PLus, я использую PL/SQL Developer, к сожалению, в данном случае я не могу использовать SQL plus. - person RobLaw84; 08.12.2010
comment
нет ошибки, когда я запускаю его в разработчике pl/sql, он просто ничего не выводит. - person RobLaw84; 08.12.2010
comment
Похоже, что настройка set serveroutput on не включена для вашего разработчика pl/sql. Вы можете установить set serveroutput в сценарии Login.sql в каталоге, где находится PL/SQL Developer, и перезапустить его, чтобы исправить это. - person Rajesh Chamarthi; 08.12.2010

В нижней части этого в разработчике pl/sql код выглядит следующим образом.

Создайте объект для хранения набора результатов

CREATE OR REPLACE TYPE ABC.TEST_TYPE
AS OBJECT
( 
  "Site"                       VARCHAR2(25),
);

Создайте тип в виде таблицы объекта выше

CREATE OR REPLACE TYPE ABC.TEST_COL 
    AS TABLE OF ABC.TEST_TYPE

Создайте пакет для выполнения SQL

CREATE OR REPLACE PACKAGE ABC.TEST_RPT AS
    FUNCTION get_report(vPart     VARCHAR2,
                        vBuyer    VARCHAR2,
                        vSupplier VARCHAR2) RETURN ABC.TEST_COL 
    PIPELINED;
END;

Создайте тело пакета для выполнения SQL

CREATE OR REPLACE PACKAGE BODY ABC.TEST_RPT AS
  FUNCTION get_report(vPart     VARCHAR2,
                      vBuyer    VARCHAR2,
                      vSupplier VARCHAR2) RETURN ABC.TEST_COL 
    PIPELINED IS
    CURSOR cTest(vPart     VARCHAR2,
                 vBuyer    VARCHAR2,
                 vSupplier VARCHAR2) IS

          SELECT Site
            FROM table
           WHERE Part = vPart
             AND Buyer = vBuyer
             AND Supplier = vSupplier;



  BEGIN
    FOR part_rec IN cTest(vSite, vBuyer, vSupplier) LOOP
      PIPE ROW(ABC.TEST_TYPE(part_rec.Site));

    END LOOP;
    RETURN;
    CLOSE cTest;
  END;
END;

Код для выполнения и вывода набора результатов

ВЫБЕРИТЕ * ИЗ ТАБЛИЦЫ (ABC.TEST_RPT.get_report ('','',''))

person RobLaw84    schedule 09.12.2010

Ваша переменная курсора ref — rc. Но тогда вы используете rc2.

Измените rc2 на rc и все должно работать

person user3177508    schedule 09.01.2014

person    schedule
comment
Обратите внимание, что решение, опубликованное Раджешем, проще. Команда exec создает минимальный блок pl/sql, которого должно хватить для этого примера. - person redcayuga; 07.12.2010
comment
Я не использую SQL PLus, я использую PL/SQL Developer, к сожалению, в данном случае я не могу использовать SQL plus. - person RobLaw84; 08.12.2010