【问题标题】:ORACLE - Selecting Parameters for calling Procedure from TableORACLE - 从表中选择调用过程的参数
【发布时间】:2018-11-28 13:46:49
【问题描述】:

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

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

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

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

我无权修改程序。

【问题讨论】:

  • 一次一个参数? ... 大概。您尝试时收到了什么错误消息?
  • 我不认为你可以这样做。但是你可以SELECT PARA1, PARA2, PARA3, PARA4 INTO P1, P2, P3, P4 FROM TABLEA 然后EXECUTE PROCEDURE_NAME(P1, P2, P3, P4)
  • 该选择返回多少行?您是否尝试将所有这些行中的值传递给过程?
  • @KaushikNayak 仅 1 行。
  • 如果您的示例中像 3 或 4 这样的参数很少,最好在 Alex 的回答中使用方法。但是,不建议创建一个过程,该过程接受这么多参数都来自单个表/查询的列。参考光标将是更好的方法。

标签: oracle stored-procedures parameter-passing


【解决方案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;
/

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

【讨论】:

    【解决方案2】:

    你可以调用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;
    

    【讨论】:

    • 所以我会将 4 个参数传递给该函数?并返回 4 个值?你能分享一些函数的例子吗
    • 是的,函数中的参数列表与基础过程中的相同
    • 函数中的execute procedure_name(para1,para2,para3,para4)是正确的语法吗?
    • 我已经编辑了帖子 - 添加了一个函数示例。传入的参数类型和顺序应该与您在过程中的相同。
    猜你喜欢
    • 2013-03-04
    • 2018-07-10
    • 2013-10-08
    • 2019-09-19
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    相关资源
    最近更新 更多