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

Cách trả về kết quả của nhiều câu lệnh select dưới dạng một bảng tùy chỉnh

Trong trường hợp của bạn, bạn đang cố gắng điền động một tập hợp và kết quả mong muốn trong một tập hợp duy nhất. Trong trường hợp của bạn, không thể thực hiện điều đó trong một vòng lặp. Cũng như đã đề cập bởi @OldProgrammer, piperow sẽ là một giải pháp tốt hơn từ điểm hiệu suất. Xem bản trình diễn dưới đây:

--Bảng và giá trị:

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

--Đối tượng đã được tạo

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

- Chức năng:

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

Đầu ra:

    SQL>  Select *  from table(MY_FUNCTION);

    VALUE1     VALUE2
---------- ----------
         1          2
         3          4
         5          6
         7          8
         9         10
        11         12

6 rows selected.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Excel VBA - Kết nối Oracle DB - Thực thi Truy vấn Cập nhật không hoạt động

  2. Thứ tự hàng mặc định cho truy vấn chọn trong oracle

  3. Điều gì có thể gây ra lỗi ORA-12519 không liên tục (TNS:không tìm thấy trình xử lý thích hợp)

  4. một truy vấn sql để so sánh kết quả của các truy vấn sau

  5. Oracle Sql Check Constraint! =Bảng khác