13.64 SQL_MACRO句
SQL_MACRO
句は、表式で使用できるSQLマクロとしてファンクションにマークを付けます。
ビューで参照されるSQLマクロは、常にビューの所有者の権限で実行されます。
AUTHID
プロパティは指定できません。SQLマクロは呼び出されると、実行者の正しいファンクションのように動作します。SQLマクロ所有者は、起動元のファンクションに継承権限を付与する必要があります。
マクロ注釈付きファンクションをPL/SQLで使用する場合は、通常のファンクション戻り文字またはCLOB
型のようにマクロ拡張なしで動作します。
SQL_MACROの注釈は、次のSQL文で使用できます。
- SQLマクロは、問合せ表式の
FROM
句でのみ使用できます。 - SQLマクロは、仮想列式、ファンクション索引、エディショニング・ビューまたはマテリアライズド・ビューでは使用できません。
- タイプ・メソッドには、
SQL_MACRO
で注釈を付けることはできません。
構文
sql_macro_clause ::=
セマンティクス
sql_macro_clause
sql_macro_clauseは、ファンクション内で1回のみ使用できます。SQLマクロ・ファンクションを作成するには、ファンクション定義にsql_macro_clauseを含めます。SQLマクロ・ファンクションを定義前に宣言する場合は、ファンクションの宣言でsql_macro_clauseを指定する必要があります。
sql_macro_clauseの制限
SQL_MACRO
の注釈は、RESULT_CACHE
、PARALLEL_ENABLE
およびPIPELINED
には使用できません。DETERMINISTIC
プロパティは指定できませんが、SQLマクロは常に暗黙で決定的になります。
SQLマクロ・ファンクションには、VARCHAR2
、CHAR
またはCLOB
の戻り型が必要です。
例
例13-22 Budget: 表式でのSQLマクロの使用
この例は、表式で使用するbudgetというSQLマクロを示しています。このマクロは、特定の役職の従業員に対する部署ごとの合計給与を返します。
CREATE FUNCTION budget(job VARCHAR2) RETURN VARCHAR2 SQL_MACRO IS
BEGIN
RETURN q'{SELECT deptno, SUM(sal) budget
FROM scott.emp
WHERE job = budget.job
GROUP BY deptno}';
END;
/
この問合せは、表式で使用されるSQLマクロbudgetを表示します。
SELECT * FROM budget('MANAGER');
結果:
DEPTNO BUDGET ---------- ---------- 20 2975 30 2850 10 2450
例13-23 Take: 多相ビューでの表マクロの使用
CREATE FUNCTION take (n NUMBER, t DBMS_TF.TABLE_T)
RETURN VARCHAR2 SQL_MACRO IS
BEGIN
RETURN 'SELECT * FROM t FETCH FIRST take.n ROWS ONLY';
END;
/
この問合せでは、表部門の最初の2行が戻されます。SELECT * FROM take(2, dept);
DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS
VAR row_count NUMBER;
EXEC :row_count := 5
WITH t AS (SELECT * FROM emp NATURAL JOIN dept ORDER BY ename)
SELECT ename, dname FROM take(:row_count, t);
ENAME DNAME ---------- -------------- ADAMS RESEARCH ALLEN SALES BLAKE SALES CLARK ACCOUNTING FORD RESEARCH
関連トピック
- 多相テーブル・ファンクションの概要
-
PTF実装パッケージの指定方法と
DBMS_TF
ユーティリティの使用方法の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』