sql >> Database teknologi >  >> RDS >> Oracle

Sådan returneres resultatet af mange udvalgte udsagn som én tilpasset tabel

I dit tilfælde forsøger du at udfylde en samling dynamisk og ønsket resultat i en enkelt samling. I dit tilfælde er det ikke muligt at gøre det i en enkelt løkke. Også som nævnt af @OldProgrammer, ville piperow være en bedre løsning fra ydeevne. Se nedenstående demo:

--tabeller og værdier:

CREATE TABLE SOURCE_TAB(TAB_NAME VARCHAR2(100),   DESCRIPTION  VARCHAR2(100));
/

SELECT * FROM SOURCE_TAB;
/

INSERT INTO SOURCE_TAB VALUES('table1','some_desc1');
INSERT INTO SOURCE_TAB VALUES('table2','some_desc2');
/

CREATE TABLE TABLE1(COL1 NUMBER, COL2 NUMBER);
/

INSERT INTO TABLE1 VALUES(1,2);
INSERT INTO TABLE1 VALUES(3,4);
INSERT INTO TABLE1 VALUES(5,6);
/

Select * from TABLE1;
/

CREATE TABLE TABLE2(COL1 NUMBER, COL2 NUMBER);
/

INSERT INTO TABLE2 VALUES(7,8);
INSERT INTO TABLE2 VALUES(9,10);
INSERT INTO TABLE2 VALUES(11,12);
/

Select * from TABLE2;
/
 

--Objekt oprettet

--UDT 
CREATE OR REPLACE TYPE NEWLY_CREATED_TABLE_TYPE IS OBJECT (
     VALUE1                        NUMBER,
     VALUE2                        NUMBER
);
/

--Type of UDT
CREATE OR  TYPE NEWLY_CRTD_TYP AS TABLE OF NEWLY_CREATED_TABLE_TYPE;
/
 

--Funktion:

--Function
CREATE OR REPLACE FUNCTION MY_FUNCTION
     RETURN NEWLY_CRTD_TYP PIPELINED
AS
     CURSOR CUR_TAB
     IS
          SELECT *
            FROM SOURCE_TAB;

     RET_TAB_TYPE                  NEWLY_CRTD_TYP;
BEGIN
     FOR I IN CUR_TAB
     LOOP
          --Here i made sure that all the tables have col1 & col2 columns since you are using dynamic sql. 
          EXECUTE IMMEDIATE    'select  NEWLY_CREATED_TABLE_TYPE(COL1, COL2)  from '|| I.TAB_NAME
          BULK COLLECT INTO RET_TAB_TYPE;

          EXIT WHEN CUR_TAB%NOTFOUND;

          FOR REC IN 1 .. RET_TAB_TYPE.COUNT
          LOOP
               PIPE ROW (RET_TAB_TYPE (REC) );
          END LOOP;
     END LOOP;

     RETURN;
END;
/
 

Output:

SQL> Select * from table(MY_FUNCTION); VALUE1 VALUE2 ---------- ---------- 1 2 3 4 5 6 7 8 9 10 11 12 6 rows selected.

  1. Er der en måde at få adgang til den forrige rækkeværdi i en SELECT-sætning?

  2. Hvilken JDBC-drivertype skal jeg bruge til at få adgang til en Oracle-database?

  3. Sådan udsender du PL/SQL korrekt

  4. Paginering på forespørgsel (Søg optegnelser på anmodning fra bruger)