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 以获得更多指导。
下面的包会将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 以获得更多指导。