我查了很多资料,但还是没能弄清楚。
我在 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
的值吗?
所以我找到了这个解决方案,该解决方案仅在您有 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;
将函数重新定义为没有
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<>小提琴这里
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 或使用返回值来查看该函数是否“返回”新值。或者两者兼而有之。
您的原始 Oracle 代码(带有 dbms_output)是正确的。基本上,在调用函数后,您可以使用分配的变量,就像您为其分配了值一样(与 SQL Server 相同)。
因此,返回一个值(比方说 9)的函数调用
"x := some_function(y)" 在调用之后与您编写的
"x := 9" 完全相同。所以你的功能又是正确的。
但是,您表示您使用 SQL Developer。我的猜测是你没有打开 dbms_output 。为此,请在 SQL Developer 菜单栏上选择“查看”,然后单击“Dbms 输出”。这将打开一个 dbms_output 窗口。但你还没有完全完成。在 Dbms 输出窗口中,单击大绿色 +,选择适当的模式(如果需要),然后单击确定。 Dbms_output 现在将显示在该窗口中。
试试这个
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;