재사용 가능한 SQL 템플릿: SQL 매크로 알아보기🤯



👉SQL 테이블 매크로: 런타임에 테이블 및 기타 매개변수를 전달할 수 있는 재사용 가능한 SQL 템플릿(FROM 절)을 생성합니다.

문서: https://docs.oracle.com/en/database/oracle/oracle-database/19/newft/sql-macros-sqm.html

SQL 테이블 매크로는 19.7 릴리스 업데이트로 백포트된 21c 기능입니다.

CREATE TABLE planets (
    json_document BLOB,
    CONSTRAINT json_document_is_json CHECK (json_document IS JSON)
);

INSERT INTO planets (json_document) 
VALUES ( '[ {"name":"Mercury"}, {"name":"Venus"}, {"name":"Earth"}, 
            {"name":"Mars"}, {"name":"Jupiter"}, {"name":"Saturn"}, 
            {"name":"Uranus"}, {"name":"Neptune"} ]' );
COMMIT;

-- One row retrieved containing a JSON array
SELECT JSON_SERIALIZE(json_document) AS array FROM planets;

                                                       ARRAY
-------------------------------------------------------------
[ {"name":"Mercury"}, {"name":"Venus"}, {"name":"Earth"}, … ]


-- Second version where the column table is also a parameter
CREATE OR REPLACE FUNCTION unwind(t DBMS_TF.TABLE_T, c DBMS_TF.COLUMNS_T) 
       RETURN VARCHAR2 SQL_MACRO IS
BEGIN
  RETURN := q'{
      SELECT d.array_item AS JSON_DOCUMENT, d.order_id
        FROM unwind.t nested }'|| unwind.c(1) ||q'{ COLUMNS (
                 NESTED PATH '$[*]' COLUMNS (
                     array_item CLOB FORMAT JSON PATH '$',
                     order_id FOR ORDINALITY
                 )
             ) d}';
END;
/
-- Using a table and one of its columns as parameters of SQL Macro
SELECT * FROM unwind( planets, COLUMNS( json_document ) );         

     JSON_DOCUMENT   ORDER_ID
------------------ ----------
{"name":"Mercury"}          1
  {"name":"Venus"}          2
  {"name":"Earth"}          3
   {"name":"Mars"}          4
{"name":"Jupiter"}          5
 {"name":"Saturn"}          6
 {"name":"Uranus"}          7
{"name":"Neptune"}          8


위의 예에서는 열을 매개변수로 전달할 수도 있는 SQL 매크로의 두 번째 버전(위의 애니메이션 GIF와 비교)을 사용합니다!



명왕성에 대한 설명: NASA에 따르면 이것은 더 이상 9번째 행성으로 간주되지 않습니다 🙂

훌륭한 기능에 대한 요약을 찾는 데 많은 도움을 준 Chris Saxon에게 찬사를 보냅니다!

좋은 웹페이지 즐겨찾기