2017-06-21 1 views
0

Ich habe einen Typ wie dieser ...Wie fügt man Daten an einen Ausgabeparameter an, der ein Array ist?

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

..., die in einem Paket verwendet wird:

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; 

Ich möchte die Daten in den Datensatztyp drucken, alle durch die Ausführung die Werte aus der TYPE_X-Liste. Die Daten müssen angehängt werden, bis die Schleife beendet ist. Schätze deine Hilfe. Vielen Dank!!

Antwort

1

Der Ansatz, der die geringste Änderung an Ihrem vorhandenen Code erfordert, wäre, eine lokale Variable des Datensatztyps aufzufüllen und diese dann an das OUT-Array anzuhängen. Dies würde für eine große Anzahl von Zeilen ineffizient sein

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; 

. In diesem Fall sollten Sie stattdessen BULK COLLECT verwenden:

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

danke! Ich habe versucht, den Tisch (x) mit dem EMP zu verbinden. Nicht sicher, aber ich bin irgendwo falsch gelaufen, was dazu geführt hat, hier eine Frage zu stellen. :) – user1720827

Verwandte Themen