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

Komentarze |0|

Legenda *) Pola oznaczone gwiazdką są wymagane
**) Możesz używać tych znaczników i atrybutów HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Kategoria: Oracle 11g | Oracle 19c | SQL