声明变量并从Oracle中的SELECT查询设置其值

use*_*567 37 oracle plsql

在SQL Server中我们可以使用:

DECLARE @variable INT;
SELECT @variable= mycolumn from myTable;
Run Code Online (Sandbox Code Playgroud)

我怎样才能在Oracle中做同样的事情?我目前正在尝试以下方法:

DECLARE COMPID VARCHAR2(20);
SELECT companyid INTO COMPID from app where appid='90' and rownum=1;
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用

在此输入图像描述

Thi*_*ilo 67

选择INTO

DECLARE
   the_variable NUMBER;

BEGIN
   SELECT my_column INTO the_variable FROM my_table;
END;
Run Code Online (Sandbox Code Playgroud)

确保查询仅返回单行:

默认情况下,SELECT INTO语句只能返回一行.否则,PL/SQL会引发预定义的异常TOO_MANY_ROWS,并且INTO子句中的变量值是未定义的.确保WHERE子句足够具体,只匹配一行

如果没有返回任何行,PL/SQL将引发NO_DATA_FOUND.在实际可行的情况下,您可以通过选择聚合函数的结果(例如COUNT(*)或AVG())来防止此异常.即使没有符合条件的行,这些函数也可以保证返回单个值.

SELECT ... BULK COLLECT INTO语句可以返回多行.您必须设置集合变量来保存结果.您可以声明关联数组或嵌套表,这些表根据需要增长以保存整个结果集.

隐式游标SQL及其属性%NOTFOUND,%FOUND,%ROWCOUNT和%ISOPEN提供有关SELECT INTO语句执行的信息.

  • 应该注意的是,如果表有多于一行,“SELECT my_column INTO the_variable FROM my_table”本质上会返回“太多行”。虽然对某些人来说很明显,但它应该简单地表明应提供“WHERE”条件,并且不需要“the_variable :=”,您给出的语句会自动将值分配给变量。在我从查询中删除它之前,我被绊倒了,仍在使用该部分并收到各种其他错误。 (2认同)

Pra*_*een 8

补充一点:

当您从 转换tsql为时plsql,您必须担心no_data_found异常

DECLARE
   v_var NUMBER;
BEGIN
   SELECT clmn INTO v_var FROM tbl;
Exception when no_data_found then v_var := null; --what ever handle the exception.
END;
Run Code Online (Sandbox Code Playgroud)

tsqlif no data foundthen 变量将是null但不是exception


Oll*_*lie 5

不完全确定你是什么,但在PL/SQL中你会很简单

DECLARE
  v_variable INTEGER;
BEGIN
  SELECT mycolumn
    INTO v_variable
    FROM myTable;
END;
Run Code Online (Sandbox Code Playgroud)

奥利.