在 Oracle 中通过 SELECT 查询声明变量并设置其值

Posted

技术标签:

【中文标题】在 Oracle 中通过 SELECT 查询声明变量并设置其值【英文标题】:Declaring a variable and setting its value from a SELECT query in Oracle 【发布时间】:2011-09-26 10:44:20 【问题描述】:

在 SQL Server 中我们可以这样使用:

DECLARE @variable INT;
SELECT @variable= mycolumn from myTable;

如何在 Oracle 中做同样的事情?我目前正在尝试以下操作:

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

为什么这不工作

【问题讨论】:

知道这对于作为对象的类型如何工作吗? 【参考方案1】:

SELECT INTO

DECLARE
   the_variable NUMBER;

BEGIN
   SELECT my_column INTO the_variable FROM my_table;
END;

确保查询只返回一行:

默认情况下,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 语句执行的信息。

【讨论】:

声明 COMPID VARCHAR2(20); SELECT companyid INTO COMPID from sasapplication where appid='90' and rownum=1;你能告诉为什么这个 sql 会抛出错误 需要注意的是,SELECT my_column INTO the_variable FROM my_table 会固有地带回too many rows,如果表格超过一行。虽然对某些人来说很明显,但它应该只是表明应该提供WHERE 条件,并且不需要the_variable :=,您给出的语句会自动将值分配给变量。在我从查询中删除之前,我被绊倒并仍在使用该部分并遇到各种其他错误。【参考方案2】:

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

DECLARE
  v_variable INTEGER;
BEGIN
  SELECT mycolumn
    INTO v_variable
    FROM myTable;
END;

奥利。

【讨论】:

正如@Thilo 所说,围绕这个特定的语法还有更多需要考虑。关于您想要实现的目标的更多信息将使我们能够定制一种更好的方法来填充您的变量。【参考方案3】:

补充一点:

当您从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;

tsql 中如果no data found 则变量将为null 但不是exception

【讨论】:

【参考方案4】:

ORA-01422:精确提取返回的行数超过了请求的行数

如果不使用where条件指定准确的记录,会出现上述异常

DECLARE
     ID NUMBER;
BEGIN
     select eid into id from employee where salary=26500;
     DBMS_OUTPUT.PUT_LINE(ID);
END;

【讨论】:

【参考方案5】:

用于将单行输出存储到从选择进入查询的变量中:

声明 v_username varchare(20); SELECT username into v_username FROM users WHERE user_id = '7';

这会将单个记录的值存储到变量 v_username 中。


用于将多行输出存储到从选择到查询的变量中:

你必须使用 listagg 函数。 listagg 将一个列的结果行连接成一个列,并且为了区分它们,您可以使用特殊符号。 使用如下查询 SELECT listagg(username || ',' ) 组内(按用户名排序)到 v_username FROM users;

【讨论】:

以上是关于在 Oracle 中通过 SELECT 查询声明变量并设置其值的主要内容,如果未能解决你的问题,请参考以下文章

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

oracle数据库中通过列名获取约束名

在laravel中通过子查询进行分页

在SqlServer中通过SQL语句实现树状查询

在 PL/SQL Developer 中通过电子邮件发送查询结果

查询oracle数据库时,如何定义变量进行查询