Dynamiczne Używanie Nazwy Tabeli W Instrukcji SELECT
Wstrzyknięcie nazwy tabeli w zapytanie SQL nie jest tak oczywiste jak mogłoby się wydawać, Poniżej prezentuje dwa sposoby, z których sam korzystam.
- Pierwsze z wykorzystaniem dynamicznej funkcji
- Drugie z wykorzystaniem XMLType.
DROP TABLE T1 / DROP TABLE T2 / CREATE TABLE T1(id NUMBER, table_name VARCHAR2(100)) / CREATE TABLE T2(id NUMBER, creation_date DATE) / INSERT INTO T1 VALUES(1, 'T2') / INSERT INTO T2 VALUES(1, SYSDATE) /
Pierwsza propozycja oparta o dynamiczne tworzenie funkcji. To rozwiązanie działa na wersji od 12c.
WITH FUNCTION creation_date(p_table_name VARCHAR2, p_id NUMBER) RETURN DATE IS cur SYS_REFCURSOR; v_sql VARCHAR2(200); v_date DATE; BEGIN v_sql := 'SELECT creation_date FROM '||p_table_name||' WHERE id='||p_id; OPEN cur FOR v_sql; FETCH cur INTO v_date; CLOSE cur; RETURN v_date; END; SELECT id, table_name, creation_date(table_name, id) AS creation_date FROM T1 /
ID TABLE_NAME CREATION_DATE
------ ---------- ----------------------
1 T2 13-MAR-23 09.30.58
Druga propozycja oparta o XMLType. Działa również na 11g.
SELECT id, table_name, extractvalue(dbms_xmlgen.getxmltype('SELECT creation_date FROM '||table_name||' WHERE id='||id), '//text()' ) AS creation_date FROM T1 /
ID TABLE_NAME CREATION_DATE
------ ---------- ----------------------
1 T2 13-MAR-23 09.30.58