2017-02-20 84 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

不客氣。 [Here](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; 
相關問題