Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Chức năng bảng Oracle từ CTE

Trong khi xử lý Objects bạn phải hết sức thận trọng khi thực hiện select . Có lỗi trong mã của bạn dẫn đến sự cố. Ngoài ra, tôi không chắc chắn liệu việc chỉ định trực tiếp được thực hiện dưới đây có thực sự được phép hay không:

rec := PART_TEST(record);

Tuy nhiên tôi đề xuất 2 giải pháp ở đây. Đầu tiên với Pipeline và khác mà không có nó. Xem bên dưới:

- Chuẩn bị bàn và đối tượng

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

- Chức năng với 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;
/

Kết quả:

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

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

--Không có đường ống dẫn

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

Kết quả:

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

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

Chọn cái nào phù hợp với bạn nhưng tất cả chúng ta đều biết những lợi ích của việc sử dụng Pipeline do đó các chức năng đó sẽ phù hợp nhất.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Phân tích cú pháp json qua json_table trong oracle 18

  2. Thêm 2 tháng vào dấu thời gian hiện tại

  3. ORA-00933:Lệnh SQL không kết thúc đúng cách khi chèn nhiều hàng

  4. Thực thi nhiều câu lệnh SQL trong java

  5. Xếp tầng Xóa truy vấn