在子查询中使用内联函数(在 WHERE 子句中)

Use inline function in subquery (in a WHERE clause)

COTS system, I am able to enter a SQL WHERE clause.

有效的 WHERE 子句示例:

worktype = 'Corrective Maintenance'

1 = (
    with 
        cte as (select 1 as calc from dual)
    select 
        calc 
    from 
        cte
    )

同样,我想知道是否可以在 WHERE 子句的子查询中使用 内联函数

此内联函数在 SQL 客户端中独立运行:

with 
    function inline_f(p_num number) return number is 
    begin
        return p_num + 0;
    end;
select 
    inline_f(1) as calc 
from 
    dual

Calc
----
1

但是如果我将它包装在 WHERE 子句的子查询中,那么我会得到一个错误(在 COTS 系统中,甚至在 SQL 客户端中):

--select * from a_tbl where

1 = (
    with 
        function inline_f(p_num number) return number is 
        begin
            return p_num + 0;
        end;
    select 
        inline_f(1) as calc 
    from 
        dual
    )

ORA-00921: unexpected end of SQL command
Invalid statement
ORA-00933: SQL command not properly ended

问题:

有没有办法在子查询中(在 WHERE 子句中)使用内联函数?

Is there a way to use an inline function in subquery (in a WHERE clause)?

有,但我不确定这是否对您有帮助。我不知道 COTS 系统是什么,它是如何工作的。我明白用户只能输入一个 WHERE 子句;但是您(作为开发人员)- 或者无论开发人员是谁,如果不是您- 是否有权访问整个 SELECT 声明?

如果您在 WITH 子句中定义函数的查询不是顶级 SELECT 语句(在您的情况下不是),则顶级 SELECT 必须包含 with_plsql 提示。 (Oracle 称它为“提示”,无论如何;它使用提示语法,但它不是提示,它实际上是编译器指令。)唉,这个 must 位于顶部-级别 SELECT(表示您的查询的 SELECT 子句,最终用户无法访问)。

这就是我问的原因...如果为您的用户开发这些查询的人不介意将 with_plsql 提示添加到顶层 SELECT,那么您可以做自己想做的事问。如果用户在 WITH 子句中键入没有 PL/SQL 代码的 WHERE 子句,提示不会造成任何伤害,因此没有理由不这样做;但是,正如我所说,我不知道 COTS 是什么意思或它是如何工作的。