Bạn có thể thử một cái gì đó như thế này với một khối PL / SQL và CURSOR
động Lưu ý rằng ở đây tôi đang sử dụng ID =1 và 2 như một biến mà bạn nên biết và đang chuyển từ đâu đó.
DBMS_SQL.RETURN_RESULT
(12c trở lên) được sử dụng để hiển thị đầu ra từ con trỏ được xây dựng động. Ngoài ra, bạn có thể sử dụng PRINT
lệnh tìm nạp và hiển thị o / p từ REFCURSOR
.
SET serveroutput ON
DECLARE
v_ref SYS_REFCURSOR;
id1 X.ID%TYPE := 1;
id2 X.ID%TYPE := 2;
v_col VARCHAR2(32);
v_cols VARCHAR2(1000);
BEGIN
FOR r IN
( SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = 'X'
)
LOOP
EXECUTE IMMEDIATE '
SELECT
CASE
WHEN a.'||r.column_name|| ' = ' || 'b.'|| r.column_name ||'
THEN a.'||r.column_name || ' END
FROM
X a
CROSS JOIN X b WHERE
a.ID = :Id1 AND b.ID = :Id2' INTO v_col USING id1,id2 ;
v_cols := v_cols ||
CASE
WHEN v_col IS NULL THEN
','||r.column_name
END;
END LOOP;
v_cols := TRIM(BOTH ',' FROM v_cols);
OPEN v_ref FOR 'select ' || v_cols || ' FROM X WHERE ID = '||id1||'
UNION ALL select ' || v_cols || ' FROM X WHERE ID = '||id2 ;
DBMS_SQL.RETURN_RESULT(v_ref);
END;
/
ResultSet #1
ID CITY ZIP SEGMENT_ONE
------------------ --------- ------------ -----------
1 14228 X71
2 JamesTown 14845 X72
PL/SQL procedure successfully completed.