oracle 为什么我们不能从SQL调用过程

4bbkushb  于 2023-10-16  发布在  Oracle
关注(0)|答案(5)|浏览(109)

我知道我们可以从SQL调用函数,如果它不包含out参数或DML(除了自治)。但是我们不能在任何情况下从SQL调用该过程。这是什么原因呢?为什么我们不能从SQL调用这个过程?任何具体原因。

n1bvdmb6

n1bvdmb61#

我假设,你是在问从其他SQL语句中调用过程(而不仅仅是调用一个过程本身,这显然是可能的)。
为什么?这是一个见仁见智的问题,你必须问Oracle数据库架构师一个真实的原因。
看起来,在所有可能的SQL语句中引入过程调用会带来语法和实现的复杂性,但不一定会带来更多的价值。通常有替代品,这是不是更难使用,同时允许相同的结果。
在查询(SELECT语句)的情况下,结果应该是一个数据集,并且不应该对数据库状态(数据或结构)进行任何更改。PL/SQL过程不返回数据集,并且可以更改数据库状态。
如果你在一个情况下,需要调用过程来准备数据,你想查询,那么你有可能先调用过程,然后查询数据库。
您还可以编写一个过程,它将有一个游标引用的输出参数,这将有效地给予您一个查询结果。(对于特殊情况,您可以使用参数化的匿名PL/SQL块。
您还可以编写一个表格函数,在其中可以使用PL/SQL进行复杂的数据处理,并返回一个数据集。这样的函数可以在查询中使用。
如果您还询问其他类型的SQL语句,那么您可以始终调用DML(INSERT / UPDATE / DELETE / MERGE),(CREATE / ALTER / DROP)或DCL(GRANT/REVOKE),它可以完成这些任务,并允许您混合PL/SQL逻辑。不需要用其他方法(将PL/SQL引入DML /SQL/ DCL)。

voase2hg

voase2hg2#

基本上,FUNCTION用于计算并返回结果,该结果理想地从SQL查询语句或另一个FUNCTION或Stored-Proc调用。与FUNCTION不同,Stored-Proc用于执行可能需要事务控制和参数处理的逻辑/流程块,这些事务控制和参数处理不适合普通SQL,而是适合客户端/应用程序。

j2qf4p5b

j2qf4p5b3#

原因是SQL ANSII standard指定在SQL查询中只能使用函数。
ISO委员会成员没有定义SQL查询中过程的使用。

disho6za

disho6za4#

您可以:

call dbms_output.put_line('Hello')

CALL是SQL语言的一部分。
或者我们可以在内联函数中嵌入一个过程:

with function f (p varchar2)
        return varchar2
    as
    begin
        dbms_output.put_line('Hello');
        return p;
    end f;
select f('Demo')
from   dual

如果你指的是一个SELECT语句,我不知道你期望它如何工作。您希望这样的查询返回什么结果集?

select dbms_output.put_line('Hello')
from   dual

select dbms_stats.gather_table_stats(user, table_name)
from   user_tables

这不是某个标准委员会的任意限制。从语义上说不通。

5lhxktic

5lhxktic5#

你可以在SQL中轻松地调用或执行过程。参数化或非参数化都可以被调用。
EXEC dbo.procedure_name

相关问题