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

时间:2018-06-23 07:19:00

标签: sql oracle stored-procedures

我知道,如果其中不包含out参数或DML(自主变量除外),我们可以从SQL中调用该函数。但是我们不能在任何情况下从SQL调用过程。 是什么原因呢? 为什么我们不能从SQL调用过程?任何特定原因。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

您可以:

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

这不是某些标准委员会的任意限制。只是从语义上讲没有任何意义。

答案 2 :(得分:0)

您可以使用SQL轻松地调用或执行过程。参数化或非参数化均可调用。

EXEC dbo.procedure_name

答案 3 :(得分:0)

我假设您正在询问是否要从其他SQL语句中调用过程(而不仅仅是单独调用过程,这显然是可能的)。

为什么?这是一个见解,您必须向Oracle DB架构师询问真正的原因。

在所有可能的SQL语句中引入过程调用似乎会带来语法和实现的复杂性,同时不一定带来更多的价值。通常情况下,有些替代方法使用起来并不难,但允许相同的结果。

对于查询(SELECT语句),结果应为数据集,并且不应对数据库状态(数据或结构)进行任何更改。 PL / SQL过程不返回数据集,并且可以更改数据库状态。

如果您需要查询过程以准备数据,则需要查询,然后可以先调用过程,然后查询数据库。

您还可以编写一个过程,该过程将具有游标引用的输出参数,这将有效地为您提供查询结果。 (在特殊情况下,可以使用参数化的匿名PL / SQL块。)

您还可以编写表格函数,在其中可以使用PL / SQL进行复杂的数据处理,并返回数据集。此类功能可用于查询。

如果您还询问其他类型的SQL语句,则始终可以调用DML(INSERT / UPDATE / DELETE / MERGE),DDL({ {1}} / CREATE / ALTER)或过程或匿名PL / SQ块中的DCL(DROP / GRANT),这样做可以使您混入PL / SQL逻辑。无需其他方法(将PL / SQL引入DML / DDL / DCL)。