2017-06-21 70 views
0

我有一种这样的...如何将数据追加到数组的输出参数?

CREATE OR REPLACE TYPE TYPE_X 
AS 
    TABLE OF VARCHAR2(4000); 

...这是在一个封装中使用:

CREATE OR REPLACE PACKAGE PACKAGE_TEST 
AS 
TYPE DETAILS 
IS 
RECORD 
    (
    EMPNO NUMBER, 
    ENAME VARCHAR2(4000), 
    DEPTNO NUMBER); 
TYPE DETAILS_ARRAY 
IS 
TABLE OF DETAILS; 
PROCEDURE PROC_TESTING_2(
    X TYPE_X, 
    Y OUT DETAILS_ARRAY); 
END; 

CREATE OR REPLACE PACKAGE BODY PACKAGE_TEST 
AS 
PROCEDURE PROC_TESTING_2(
    X TYPE_X, 
    Y OUT DETAILS_ARRAY) 
AS 
BEGIN 
FOR I IN 1..X.COUNT 
LOOP 
    DBMS_OUTPUT.PUT_LINE(X(I)); 
    SELECT EMPNO,ENAME,DEPTNO INTO Y FROM EMP WHERE DEPTNO=X(I); 
END LOOP; 
END; 
END; 

我想通过执行所有打印数据到记录类型TYPE_X列表中的值。数据需要追加直到循环结束。感谢你的帮助。谢谢!!

回答

1

要求对现有代码进行最少更改的方法是填充记录类型的局部变量,然后将其附加到OUT数组。

CREATE OR REPLACE PACKAGE BODY PACKAGE_TEST 
AS 
    PROCEDURE PROC_TESTING_2(
     X TYPE_X, 
     Y OUT DETAILS_ARRAY) 
    AS 
     l_rec DETAILS; 
    BEGIN 
     -- initialize output array 
     y := package_test.details_array(); 
     FOR I IN 1..X.COUNT 
     LOOP 
      DBMS_OUTPUT.PUT_LINE(X(I)); 
      SELECT EMPNO,ENAME,DEPTNO INTO lrec 
      FROM EMP 
      WHERE DEPTNO=X(I); 
      y.extend(); 
      y(y.count) := lrec; 
     END LOOP; 

    END; 
END; 

这对于大量的行将是低效的。在这种情况下,您应该看看使用BULK COLLECT代替:

CREATE OR REPLACE PACKAGE BODY PACKAGE_TEST 
AS 
    PROCEDURE PROC_TESTING_2(
     X TYPE_X, 
     Y OUT DETAILS_ARRAY) 
    AS 
     l_rec DETAILS; 
    BEGIN 

     SELECT EMPNO,ENAME,DEPTNO 
     bulk collect INTO y 
      FROM EMP 
      WHERE DEPTNO in (select * from table (X)); 

    END; 
END; 
+0

谢谢!我试图将表(x)连接到EMP。不确定,但我在某个地方出了问题,这导致在这里提出问题。 :) – user1720827