在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;
为什么这不是正常工作?
答案 0 :(得分:64)
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语句执行的信息。
答案 1 :(得分:5)
不完全确定你的目标,但在PL / SQL中,你只需
DECLARE
v_variable INTEGER;
BEGIN
SELECT mycolumn
INTO v_variable
FROM myTable;
END;
奥利。
答案 2 :(得分:1)
另外一点:
当您从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
答案 3 :(得分:0)
ORA-01422:精确提取返回超过请求的行数
如果您没有使用where条件指定确切的记录,您将获得上述异常
DECLARE
ID NUMBER;
BEGIN
select eid into id from employee where salary=26500;
DBMS_OUTPUT.PUT_LINE(ID);
END;
答案 4 :(得分:0)
用于将单行输出存储到select into查询中的变量中:
声明v_username varchare(20); SELECT用户名为v_username FROM users WHERE user_id =' 7&#39 ;;
这会将单个记录的值存储到变量v_username中。
用于将多行输出存储到select into查询中的变量中:
你必须使用listagg函数。 listagg将coloumn的结果行连接成一个coloumn,并且为了区分它们,您可以使用特殊符号。 使用如下查询 组中的list listagg(用户名||',')(按用户名排序)到v_username FROM users;