Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Funkcja tabeli Oracle z CTE

Podczas pracy z Objects zachowaj szczególną ostrożność podczas select . W Twoim kodzie wystąpiły błędy, które powodowały problemy. Nie jestem też pewien, czy bezpośrednie przypisanie wykonane poniżej jest rzeczywiście dozwolone:

rec := PART_TEST(record);

Jednak proponuję tutaj 2 rozwiązania. Najpierw z Pipeline i inne bez niego. Zobacz poniżej:

--Przygotowanie tabel i obiektów

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;
/

--Funkcja z potoku

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;
/

Wynik:

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

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

--Bez potoku

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;
/

Wynik:

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

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

Wybierz, który Ci odpowiada, ale wszyscy znamy zalety korzystania z Pipeline funkcje, dlatego byłoby to najlepiej dopasowane.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TO_CHAR(liczba) Funkcja zwraca ORA-01722:nieprawidłowa liczba

  2. pl/sql Procedura składowana... gdzie upływa czas wykonania?

  3. Oracle ORA-00979 — nie jest wyrażeniem GROUP BY

  4. Zmień tekst zapytania SQL Oracle przed przesłaniem

  5. jak zwrócić dynamiczny zestaw wyników w funkcji Oracle