无法接收程序中输入的数据。 Oracle SQL Developer中

问题描述:

我有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

你可以用一个小的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://*.com/help/someone-answers)你可以找到更多的东西来回答你的问题。 – Aleksej

+0

谢谢! 我修改了你的代码,它现在可以工作了! – LameDancer

因此,这是工作代码。

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;