0

我看起来高高在低,但无法弄清楚这一点。

我在 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

4

5 回答 5

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<>在这里摆弄

于 2019-07-10T22:11:21.990 回答
2

所以我能够找到这个解决方案,它只有在你有 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;

我想认识一个人,他认为拥有一个具有 IN/OUT 参数和返回值的 FUNCTION 是个好主意。

于 2019-07-10T22:37:30.577 回答
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 或使用返回值来查看函数是“返回”新值。或两者。

于 2019-07-10T20:42:56.207 回答
0

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

于 2019-07-10T23:22:40.457 回答
-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;
于 2019-07-10T20:36:58.193 回答