我正在尝试将 oracle 存储过程 (plsql) 移植到 postgresql 函数 (pl/pgsql)。
在 oracle 中,我可以定义一个带有 IN 和 OUT 参数的存储过程。
CREATE OR REPLACE PROCEDURE MY_TEST(foo IN NUMBER,
bar OUT NUMBER)
IS
BEGIN
bar := 1
END
这将在传递给存储过程的变量中存储值 1。 我可以这样调用它:
DECLARE
outValue NUMBER ;
BEGIN
Exec MY_TEST(10, outValue);
DBMS_OUTPUT.PUT_LINE('Value Returned Is : '||outValue) ;
END ;
在 Postgresql (pl/pgsql) 中,我可以定义这样一个函数:
CREATE OR REPLACE FUNCTION MY_TEST(foo IN NUMBER,
bar OUT NUMBER)
BEGIN
bar := 1
END;
$body$
LANGUAGE PLPGSQL;
但是我不能像在 oracle 中那样使用 out 参数。 在 postgresql 中,OUT 参数定义了返回值。 在 oracle 中,存储过程没有返回值,而是将输出写入调用中传递的变量
有没有我忽略的东西,允许我以与上面示例中使用的存储过程类似的方式使用 pl/pgsql 函数?
非常感谢任何提示。
最佳答案
在 PostgreSQL 中,PL/pgSQL 或 SQL 函数采用参数值并返回值。
它们不采用指针或引用 - 因此引用地址的值可以被操纵。
理论上,您可以用 C-language function 做类似的事情,您可以在其中通过引用传递值。然而,事实上,你不能。手册警告:
Never modify the contents of a pass-by-reference input value. If you do so you are likely to corrupt on-disk data, since the pointer you are given might point directly into a disk buffer. The sole exception to this rule is explained in Section 35.10.
简而言之:您尝试做的事情在 PostgreSQL 中是不可能的。
关于oracle 存储过程 OUT 参数与 postgresql pl/pgsql 函数 OUT 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9380257/