2017-02-20 9 views
0

У меня есть 2 типа:Не удается получить данные от типа процедуры. Oracle SQL Developer

create or replace 
    type CASES_TYPE_N IS object(
    CASEID VARCHAR2(128), 
    FirstNumber VARCHAR2(32), 
    DLR number 
); 

create or replace 
TYPE CASES_TABLE_N AS TABLE OF CASES_TYPE_N; 

и пакет с его телом:

create or replace 
PACKAGE BANKRUPT_TEST AS 
    procedure BANKRUPT_TEST_p(
          pType   in integer, 
          pRequestDate   in varchar2, 
          CasesList_1  out CASES_TABLE_N, 
          ResultCode  out integer, 
          ErrorText  out varchar2); 
END BANKRUPT_TEST; 

create or replace 
    PACKAGE BODY BANKRUPT_TEST AS 
     procedure BANKRUPT_TEST_p(
           pType    in integer, 
           pRequestDate  in varchar2, 
           CasesList_1   out CASES_TABLE_N, 
           ResultCode  out integer, 
           ErrorText  out varchar2) AS 
     BEGIN 
     ResultCode := pType; 
     ErrorText := pRequestDate; 

     select CASES_TYPE_N(CaseID, 
          FirstNumber, 
          dlr 
        ) bulk collect 
        into CasesList_1 
       from (select 
         'CaseID' as CaseID, 
         'Fnum' as FirstNumber, 
         15 as dlr 
         from dual 
       ) 
      ; 
     NULL; 
     END BANKRUPT_TEST_p; 
    END BANKRUPT_TEST; 

Все это было написано и работает с Oracle SQL Developer.
В результате я получаю только переменные ResultCode и ErrorText. И я также должен иметь данные из CasesList_1. Но я этого не делаю. Я не получаю ошибок компиляции. Он должен работать с типами, а не с курсорами. Не могли бы вы помочь?

+1

Это должно сработать. Как вы называете процедуру и проверяете результат? – Aleksej

+0

Я просто нажимаю кнопку RUN. И установите параметры «IN»: – LameDancer

ответ

0

Вы можете назвать свою процедуру небольшим PLSQL-блоком; например, следующие запускает свой порядок и выводит результат:

declare 
    p1_in integer := 10; 
    p2_in varchar2(10) := 'xxx'; 
    p1_out CASES_TABLE_N; 
    p2_out integer; 
    p3_out varchar2(10); 
begin  
    BANKRUPT_TEST.BANKRUPT_TEST_p(      
            pType  => p1_in , 
            pRequestDate => p2_in , 
            CasesList_1 => p1_out , 
            ResultCode => p2_out , 
            ErrorText => p3_out 
           ); 
    if p1_out.count > 0 then 
     for i in p1_out.first .. p1_out.last loop 
      dbms_output.put_line(i || ' - ' || 
            p1_out(i).caseId || ' - ' || 
            p1_out(i).firstNumber || ' - ' || 
            p1_out(i).dlr 
            ); 
     end loop; 
    end if; 
    dbms_output.put_line(p2_out); 
    dbms_output.put_line(p3_out); 
end; 

результат:

1 - CaseID - Fnum - 15 
10 
xxx 

Если вы запустите в SQLPLUS, вы должны сначала Отдайте SET SERVEROUTPUT ON, чтобы разрешить печать.

Если вы запустите это в другом клиенте, вы должны проверить, включен ли SERVEROUTPUT в вашей среде; путь отличается от клиента к клиенту.

+0

Добро пожаловать. [Здесь] (http://stackoverflow.com/help/someone-answers) вы найдете что-то еще, что делать, когда кто-то отвечает на вас. – Aleksej

+0

Спасибо! Я изменил ваш код, и теперь он работает! – LameDancer

0

В результате это рабочий код.

create or replace 
    procedure BANKRUPT_TEST_p1(
           pType    in integer, 
           in varchar2, 
          CasesList_1  out CASES_TABLE_N, 
          ResultCode  out integer, 
          ErrorText  out varchar2) IS 
    nCur   number; 

     BEGIN 
     ResultCode := pType; 
     ErrorText := pRequestDate; 

     begin 
     CasesList_1:=CASES_TABLE_N(); 
     exception when others then null; 
     end; 

    for rec in(
     select distinct CaseID, 
         FirstNumber, 
         DLR 
      from AA_TABLE 
       where DownloadDate = pRequestDate and ClientID is not null 
    ) loop 
      CasesList_1.extend; 
      nCur       := CasesList_1.last; 
      CasesList_1(nCur)    := CASES_TYPE_N(null, null, null); 

      begin 
       CasesList_1(nCur).CASEID := rec.caseid; 
      exception when others then null; 
      end; 

      begin 
       CasesList_1(nCur).FirstNumber := rec.firstnumber; 
      exception when others then null; 
      end; 

      begin 
       CasesList_1(nCur).DLR := rec.dlr; 
      exception when others then null; 
      end; 
    end loop; 
    NULL; 
    END BANKRUPT_TEST_p1; 
END BANKRUPT_TEST1;