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.