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