【问题标题】:How to use proper syntax when creating SQL Macro?创建 SQL 宏时如何使用正确的语法?
【发布时间】:2021-11-18 16:12:32
【问题描述】:

使用 Oracle SQL Developer,我正在尝试使这个 web (link) 示例工作:

CREATE OR REPLACE FUNCTION concat_self(str VARCHAR2, cnt PLS_INTEGER)
                    RETURN VARCHAR2 SQL_MACRO(SCALAR)
IS BEGIN            RETURN 'rpad(str, cnt * length(str), str)';
END;
/

但我得到了那些我不明白的错误:

Function CONCAT_SELF compiled

LINE/COL  ERROR
--------- -------------------------------------------------------------
2/37      PLS-00103: Encountered the symbol "SQL_MACRO" when expecting one of the following:     . @ % ; is authid as cluster order using external character    deterministic parallel_enable pipelined aggregate    result_cache accessible 
3/4       PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following:     not null of nan infinite dangling a empty 
5/0       PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:     end not pragma final instantiable order overriding static    member constructor map 
Errors: check compiler log

【问题讨论】:

  • 您的数据库是什么 Oracle 版本?该链接适用于 Oracle 21 中的新功能,因此如果您使用的是早期版本,那么它将无法使用。
  • 你是对的。来自其他语言,我认为宏不可能是一个新概念......

标签: macros oracle-sqldeveloper


【解决方案1】:

您的代码对于任何 Oracle 实例都完全“有效”,其中SQL_MACRO 关键字被 PL/SQL 引擎识别。

一旦您意识到数据库不理解您所要求的内容,错误就会开始变得更有意义 - 它不承认“SQL_MACRO”是 CREATE OR REPLACE FUNCTION PL/ 的有效组件SQL 库。

这些错误让您可以看到数据库的 PL/SQL 和 SQL 解析器如何处理您的请求并将其分解为它知道如何处理的内容。

第一个错误之后的一切都是关于解析器无法解决它遇到的第一个问题。

此功能是在数据库版本 21c 中引入的,如 21c New Features Guide. 中所述

您可以创建 SQL 宏 (SQM) 来分解常见的 SQL 表达式 和语句转换成可重用的、参数化的结构,可以 在其他 SQL 语句中使用。 SQL 宏可以是标量 表达式,通常用于 SELECT 列表、WHERE、GROUP BY 和 HAVING 子句,封装计算和业务逻辑或者可以 是表表达式,通常用在 FROM 子句中。

SQL 宏可提高开发人员的工作效率,简化协作 开发,并提高代码质量。

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 2013-08-13
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多