在子查询中使用内联函数(在 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 是什么意思或它是如何工作的。
在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 是什么意思或它是如何工作的。