如何在 Oracle PLSQL 中选择变量作为查询结果

问题描述 投票:0回答:5

我查了很多资料,但还是没能弄清楚。

我在 Oracle 中定义了这个函数:

FUNCTION MY_FUNCTION(
    INPUTVAR1 IN OUT NUMBER,
    INPUTVAR2 VARCHAR2
) RETURN NUMBER;

创建这个函数的人基本上是如果输入参数不为0就返回它。否则如果INPUTVAR1为0,它将返回一个新值。我想要那个新值。

在 T-SQL 中,它是如此简单以至于愚蠢:

DECLARE @MyVar INT = 0;
SET @MyVar = MY_FUNCTION(@MyVar, NULL);
SELECT @MyVar as Result;

但是在Oracle中,我不知道如何返回返回值作为结果。这是我到目前为止所拥有的:

DECLARE MyVar NUMBER := 0;
BEGIN
MyVar := MY_FUNCTION(INPUTVAR1 => MyVar, INPUTVAR2 => NULL)
END;

但我不知道如何在结果中使用 MyVar 。我绝对不能选择它。我尝试过

DBMS_OUTPUT.PUT_LINE(MyVar);
但没有运气。

有人知道我如何返回

MyVar
的值吗?

oracle-database plsql
5个回答
4
投票

所以我找到了这个解决方案,该解决方案仅在您有 12c 或更高版本的 JDBC 驱动程序时才有效:

DECLARE MyVar NUMBER := 0;
    rc sys_refcursor; 
BEGIN
MyVar := MY_FUNCTION(INPUTVAR1 => MyVar, INPUTVAR2 => NULL)

open rc for SELECT MyVar FROM dual; 
dbms_sql.return_result(rc); 

END;

2
投票

将函数重新定义为没有

OUT
参数:

CREATE FUNCTION MY_FUNCTION(
    INPUTVAR1 IN NUMBER,
    INPUTVAR2 IN VARCHAR2
) RETURN NUMBER
IS
BEGIN
  RETURN INPUTVAR1;
END;
/

然后您可以在 SQL 查询中使用它:

SELECT MY_FUNCTION( INPUTVAR1 => 0, INPUTVAR2 => NULL ) AS value
FROM   DUAL

输出:

|价值|
| ----: |
|     0 |

db<>小提琴这里


更新

如果您无法重新定义函数以删除

OUT
参数,请在其周围编写一个包装器:

CREATE FUNCTION MY_FUNCTION_WRAPPER(
    INPUTVAR1 IN NUMBER,
    INPUTVAR2 IN VARCHAR2
) RETURN NUMBER
IS
  var1 NUMBER := INPUTVAR1;
BEGIN
  RETURN MY_FUNCTION( INPUTVAR1 => var1, INPUTVAR2 => INPUTVAR2 );
END;
/

然后你可以从SQL语句中调用它:

SELECT MY_FUNCTION_WRAPPER( INPUTVAR1 => 0, INPUTVAR2 => NULL ) AS value
FROM   DUAL;

输出:

|价值|
| ----: |
|     0 |

db<>小提琴这里


1
投票

dbms_output 对我来说效果很好:

create or replace FUNCTION MY_FUNCTION(
    INPUTVAR1 IN OUT NUMBER,
    INPUTVAR2 VARCHAR2
) RETURN NUMBER is
begin
    if inputvar1 = 0 then
        return -1;
    else
        return inputvar1;
    end if;
end;
/

declare
  my_var number := 0;
  my_var2 number := 0;
begin
  my_var2 := my_function(my_var, 'A');
  dbms_output.put_line('my_var:' || my_var);
  dbms_output.put_line('my_var2:' || my_var2);
end;
/

my_var:0
my_var2:-1

编辑:我有点担心函数中是否有 OUT 变量。这通常是编码不良的标志,这就是我在上面使用 2 个变量的原因,这样您就可以通过修改 INPUTVAR1 或使用返回值来查看该函数是否“返回”新值。或者两者兼而有之。


0
投票

您的原始 Oracle 代码(带有 dbms_output)是正确的。基本上,在调用函数后,您可以使用分配的变量,就像您为其分配了值一样(与 SQL Server 相同)。 因此,返回一个值(比方说 9)的函数调用
"x := some_function(y)" 在调用之后与您编写的
"x := 9" 完全相同。所以你的功能又是正确的。
但是,您表示您使用 SQL Developer。我的猜测是你没有打开 dbms_output 。为此,请在 SQL Developer 菜单栏上选择“查看”,然后单击“Dbms 输出”。这将打开一个 dbms_output 窗口。但你还没有完全完成。在 Dbms 输出窗口中,单击大绿色 +,选择适当的模式(如果需要),然后单击确定。 Dbms_output 现在将显示在该窗口中。


-1
投票

试试这个

 DECLARE MyVar NUMBER := 0;
   varout VARCHAR2();
 BEGIN
 --MyVar := MY_FUNCTION(INPUTVAR1 => MyVar, INPUTVAR2 => NULL)
 select MY_FUNCTION(INPUTVAR1 => MyVar, INPUTVAR2 => NULL) INTO varout from dual;
  dbms_output.put_line(MyVar);
  END;
© www.soinside.com 2019 - 2024. All rights reserved.