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

Oracle Table Function fra CTE

Mens du beskæftiger dig med Objects du skal være ekstra forsigtig, mens du foretager select . Der var fejl i din kode, som resulterede i problemer. Jeg er heller ikke sikker på, om direkte tildeling udført nedenfor faktisk er tilladt:

rec := PART_TEST(record);

Jeg foreslår dog 2 løsninger her. Først med Pipeline og andet uden det. Se nedenfor:

--Forberedelse af tabel og objekter

CREATE TABLE part_table (
    part_no   NUMBER,
    col1      NUMBER
);

INSERT INTO PART_TABLE VALUES(1,11);
INSERT INTO PART_TABLE VALUES(1,33);
INSERT INTO PART_TABLE VALUES(2,22);

SELECT * FROM PART_TABLE;

CREATE OR REPLACE TYPE part_test IS OBJECT (
    part_no   NUMBER,
    col1      NUMBER
);

CREATE OR REPLACE TYPE part_test_t IS  TABLE OF part_test;
/

--Funktion med Pipeline

CREATE OR replace FUNCTION part_test_f(search_part IN number)
RETURN part_test_t PIPELINED 
AS 

 rec part_test; --<--Variable of type Object since we want to piperow.

 CURSOR cur(part_num number) IS 
      WITH A AS 
      (       --Make sure you cast your select statement of object type    
              SELECT part_test(PART_NO,col1) FROM PART_TABLE WHERE PART_NO LIKE part_num
       )
       SELECT * FROM A;        
BEGIN        
   OPEN cur(search_part) ;
    LOOP
      Fetch cur into rec;    --<-- Note here am not using `Bulk Collect` even though its being a collection since we are `piping` the rows.    
      exit when cur%NOTFOUND;
       pipe row(rec);         
    END LOOP;
RETURN ;
END;
/

Resultat:

SQL> SELECT * FROM TABLE (PART_TEST_F(1));

     PART_NO       COL1
    ---------- ----------
      1            11
      1            33

--Uden rørledning

CREATE OR REPLACE FUNCTION part_test_f (search_part IN NUMBER) 
RETURN part_test_t 
 AS
    rec   part_test_t;
    CURSOR cur ( part_num NUMBER) IS 
    WITH a AS 
    ( SELECT part_test( part_no,col1 )
       FROM part_table
       WHERE part_no LIKE part_num       
    ) 
    SELECT *  FROM a;
BEGIN
    OPEN cur(search_part);
    LOOP
        FETCH cur BULK COLLECT INTO rec;
        EXIT WHEN cur%notfound;      
    END LOOP;
    RETURN rec;
END;
/

Resultat:

SQL> Select * from table (part_test_f(1));

   PART_NO       COL1
---------- ----------
         1         11
         1         33

Vælg hvad der passer dig, men vi kender alle fordelene ved at bruge Pipeline funktioner, så det ville være bedst egnet.




  1. MySQL dynamisk JOIN

  2. vælg mulighed for at opdatere anden valgmulighed baseret på mysql-befolkede rullemenuer

  3. Formular i PDO for at opdatere data

  4. Udvikling af et modul med Java 9 i Eclipse IDE, del 2