【问题标题】:Return Value From Oracle VariableOracle 变量的返回值
【发布时间】:2015-09-03 03:30:52
【问题描述】:

我有以下要执行的 PL/SQL 语句。

DECLARE
    V_REFNUM NUMBER := 0;
BEGIN
    SELECT NEXT_NUMBER_VALUE INTO V_REFNUM FROM SETTINGS WHERE SETTINGS_ID = 1;
    V_REFNUM := (V_REFNUM + 1);

    -- SELECT V_REFNUM FROM DUAL
END;

问题是我似乎无法让变量从我这里返回。这在我的语句是这样的 T-SQL 中工作正常

DECLARE @refNum int = 0
SELECT @refNum = NEXT_NUMBER_VALUE FROM SETTINGS WHERE SETTINGS_ID = 1
SET @refNum = (@refNum + 1)
SELECT @refNum

在 Microsoft SQL Server 上做这件事似乎很简单。为什么这在 Oracle 上如此难以弄清楚?有人可以帮忙吗?

【问题讨论】:

  • 您的选择是否总是返回一个值?你有多确定它没有抛出未找到数据异常
  • 因为这个数据是在安装时设置的,然后递增

标签: sql-server oracle variables plsql


【解决方案1】:

在 SQLPLUS 中

REM SQLPLUS INTERNAL COMMAND
var V_REFNUM number;

REM ANNONYMOUS PL/SQL block to be evaluated on the DB server side
BEGIN
    SELECT NEXT_NUMBER_VALUE INTO :V_REFNUM FROM SETTINGS WHERE SETTINGS_ID = 1;
    :V_REFNUM := (:V_REFNUM + 1);
    -- SELECT V_REFNUM FROM DUAL
END;

REM SQLPLUS COMMAND
PRINT V_REFNUM

Oracle 匿名块已“关闭”。 Oracle 存储过程也不支持“隐式”返回。要么你必须为 PL/SQL 块使用 IN/OUT 绑定参数,要么你必须调用 dbms_output.put_line。

背后的原因是 SQL 和 PL/SQL 是由不同的虚拟机评估的,在 SQL 的上下文中没有像变量那样的东西。变量在 PL/SQL 中在线存在,它们被释放然后执行完成。 PL/SQL 代码没有标准输出,因此不能在任何地方打印 SQL 结果。

【讨论】:

  • 我可以使用 DBMS_OUTPUT 命令输出并查看值,但事后没有办法提取值吗?
  • 在 Oracle 中,“一切”都是游标。因此,过程/函数或匿名 PL/SQL 块可以返回 SYS_REFCURSOR 类型的变量,并且您可以获取该游标的数据。但是游标必须显式声明为接口的一部分(参见这个例子stackoverflow.com/a/2153308/836215)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多