ORACLE-从表中选择用于调用过程的参数

时间:2018-06-19 14:37:26

标签: oracle stored-procedures parameter-passing

是否可以从select语句中选择用于调用过程的参数?

EXECUTE PROCEDURE_NAME(para1,para2,para3,para4);
commit;

是否可以从选择查询中选择para1,para2,para3,para4?

EXECUTE PROCEDURE_NAME((SELECT PARA1,PARA2,PARA3,PARA4 FROM TABLEA))
COMMIT;

我无权修改该程序。

2 个答案:

答案 0 :(得分:1)

作为@ vc74建议的细微变化,您可以将EXECUTE命令(假设仍然是SQL * Plus或SQL Developer,无论如何都只是匿名块的包装器)替换为显式匿名块:

begin
  for r in (SELECT PARA1,PARA2,PARA3,PARA4 FROM TABLEA) loop
    PROCEDURE_NAME(r.PARA1,r.PARA2,r.PARA3,r.PARA4);
  end loop;
end;
/

(我将原来调用中的位大写,而将新位中的小写保留,以区分它们。)

使用循环仅意味着您无需声明局部变量并选择其中的内容。它还可以让您处理表中的多行,尽管我看到一个注释,您只希望一行。但是,另一方面,它不会抱怨没有行,或者有多于一行,就像可变方法一样。

您还可以使用记录类型来避免分别声明所有参数:

declare
  l_row tablea%rowtype;
begin
  SELECT * into l_row FROM TABLEA;
  PROCEDURE_NAME(l_row.PARA1,l_row.PARA2,l_row.PARA3,l_row.PARA4);
end;
/

这现在确实希望在表中找到确切的一行。

答案 1 :(得分:0)

您可以在sql中调用函数。因此,如果您能够在架构中创建一个函数,则可以执行以下操作:

  • 在您的架构中创建一个函数function_name,该函数调用过程procedure_name并返回一些虚拟结果
  • 在sql查询中使用此功能:select function_name(para1,para2,para3,para4) from tablea

功能示例:

create or replace function function_name(
  p1 varchar2,
  p2 varchra2,
  p3 varchar2,
  p4 varchar2
) return number
is
begin
  procedure_name(p1,p2,p3,p4); -- here you execute the procedure
  return null;
end;