pl/sql 如何将用户定义的记录从过程传递回调用程序?

How to pass a user-defined record from a procedure back to the calling program in pl/sql?

下面的包会将10条记录插入到table中,然后我需要将这些记录传递回调用程序并显示它们。我已经尝试了我能想到的不同的事情,并且在互联网上进行了许多搜索,但都没有成功找到我想要做的事情。

包装规格:

CREATE OR REPLACE PACKAGE Hospital AS 

  TYPE TrtRecTyp IS RECORD (
      Pat_Nbr Treatment.Pat_Nbr%TYPE, 
      Trt_Procedure Treatment.Trt_Procedure%TYPE,
      Phys_ID Physician.Phys_ID%TYPE,
      Phys_Name Physician.Phys_Name%TYPE,
      Phys_Specialty Physician.Phys_Specialty%TYPE);          

 PROCEDURE BuildPatTbl                                                 
  (p_trt_rec OUT TrtRecTyp,
   p_num_rows IN OUT NUMBER);

包体:

PROCEDURE BuildPatTbl                                                 
  (p_trt_rec OUT TrtRecTyp,
   p_num_rows IN OUT NUMBER) AS   

    CURSOR pat_cur  IS    
    SELECT trt.Pat_Nbr, Trt_Procedure, trt.Phys_ID, Phys_Name, Phys_Specialty   
    FROM Treatment trt, Physician phys 
    WHERE trt.Phys_ID = phys.Phys_ID;    

    lv_rec_cnt_num NUMBER(2);

BEGIN
      lv_rec_cnt_num := p_num_rows;
      FOR lv_trt_rec IN pat_cur  LOOP  
         INSERT INTO t_patTrt (T_patTrt_ID, Pat_Nbr, Trt_Procedure, 
                 Phys_ID, Phys_Name,  Phys_Specialty)  
         VALUES(T_patTrt_ID_seq.NEXTVAL, lv_trt_rec.Pat_Nbr,
                 lv_trt_rec.Trt_Procedure, lv_trt_rec.Phys_ID, 
                 lv_trt_rec.Phys_Name, lv_trt_rec.Phys_Specialty);

           lv_rec_cnt_num := lv_rec_cnt_num + 1 ;         

      END LOOP;     

      p_num_rows := lv_rec_cnt_num;

END BuildPatTbl;

调用程序:

DECLARE
treat_rec Hospital.TrtRecTyp;
lv_cnt_num NUMBER(2) := 0;
lv_row_cnt_num NUMBER(2);

BEGIN    

   i Hospital.BuildPatTbl(treat_rec, lv_cnt_num);     

    FOR i IN 1..10 LOOP

           DBMS_OUTPUT.PUT_LINE('Pat_Nbr = ' || treat_rec.Pat_Nbr);
           DBMS_OUTPUT.PUT_LINE('Trt_Procedure = ' || treat_rec.Trt_Procedure);
           DBMS_OUTPUT.PUT_LINE('Phys_ID = ' || treat_rec.Phys_ID);
           DBMS_OUTPUT.PUT_LINE('Phys_Name = ' || treat_rec.Phys_Name);
           DBMS_OUTPUT.PUT_LINE('Phys_Specialty = ' || treat_rec.Phys_Specialty);   

    END LOOP;

    DBMS_OUTPUT.PUT_LINE('The number of rows returned in the table is: ' || lv_cnt_num);

END;

你遇到了什么错误?

对于初学者来说,您似乎没有选择任何数据到您的 p_trt_rec 变量中,因此您不会 return 在您的程序中做任何事情。

您应该将每一行保存到一个集合中(您目前没有这样做)并将整个集合从 BuildPatTbl 传回,然后遍历它。

您需要另一个变量和类型声明。它会是这样的-

TYPE my_tbl IS TABLE OF TrtRecTyp; my_list my_tbl;

然后将每条记录存储在my_list和return中。

查看 this page 以获得更多指导。