【问题标题】:PL/SQL passing functions as parametersPL/SQL 将函数作为参数传递
【发布时间】:2012-06-23 05:48:39
【问题描述】:

我已经用 PL/SQL 编程了半年,我的印象是它是一种非常简单的编程语言(恕我直言)。虽然我偶然发现了一些有趣的文章,比如这篇文章 - Design Patterns in PL/SQL – Interface Injection for even looser coupling,但我还是推荐阅读。谈到依赖注入,我错过了一个特殊的功能:将子例程作为参数传递。可能吗?怎么样?

例如,假设我在 javascript 中有这样的代码:

function tell_me (printer) {
  printer ("hello");
}

tell_me (function () {
  console.log (word);
});

是否可以在 PL/SQL 中做类似的事情?

【问题讨论】:

  • 如果您需要在 PL/SQL 中将子例程作为参数传递,您可能应该重新检查您的问题 - 真的需要在 PL/SQL 中解决吗??
  • @NWest,你是对的,尽管这是松散耦合两个子例程的一种可能方式。事实上,我是出于好奇才问的,只是为了探索更多关于 PL/SQL 的细节。
  • @NWest,我引用了反射式编程,这是一个实际问题(我知道我有点偏离,但值得):我的 pl/sql 模块应该调用一个带有大量 XML 的 REST API .我不想手动构建每个 XML,所以我将每个实体映射到一个 TYPE 中。是否可以在不知道已传递给我的例程的类型的情况下获取类型的字段,在运行时更改它们?有了它,我可以构建一个模块来将 XML 转换为 PL/SQL 类型(反之亦然)。 API 类型的更改只需要维护 PL/SQL 类型,而不是为每种类型维护整个一个转换函数。

标签: function parameters plsql functional-programming


【解决方案1】:

您不能直接将函数作为参数传递。您能做的最好的事情是使用动态 PL/SQL 来执行作为字符串传入的函数。我不推荐这个。我可以在少数情况下看到动态 PL/SQL 的使用,但这会给您带来各种问题。

DECLARE 
   PROCEDURE inner_function
   IS
   BEGIN
       dbms_output.put_line('Output');
   END;

   PROCEDURE tell_me(parm_function varchar2) 
   IS
   BEGIN
       EXECUTE IMMEDIATE 'BEGIN '||parm_function||'(); END;';
   END;

BEGIN
   tell_me('inner_function');
END;

DBMS_OUTPUT 在缓冲区中应该只有“输出”。

这可能不起作用,因为 inner_function 可能超出范围。在这种情况下,请在模式本身中定义过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多