2011-09-26 83 views
26

在SQL Server中设置它的价值,我们可以利用这一点:声明一个变量,然后从SELECT查询在Oracle中

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

我如何可以做同样的甲骨文?我目前做如下:

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

为什么这不是工作

enter image description here

+0

任何想法如何这可以作为对象类型的工作? – Avias

回答

54

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语句的信息。

+0

DECLARE COMPID VARCHAR2(20); 从sasapplication中选择companyid INTO COMPID,其中appid = '90'和rownum = 1;你能告诉为什么这个SQL是抛出错误 – user960567

+0

和错误信息会是? – Thilo

+0

只是看到上面。 – user960567

4

不能完全确定你所追求的,但在PL/SQL您只需将

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

奥利。

+0

正如@Thilo所说,还有更多的事情需要考虑这个特定的synatx。有关您想要实现的更多信息将使我们能够定制更好的方法来填充变量。 – Ollie

0

ORA-01422:精确获取回报超过行

的请求数量,如果你不使用WHERE条件指定准确的记录,您将得到上面的异常

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

用于将单行输出存储到select into查询中的变量中:

declare v_username varchare(20); 将用户名选入v_username FROM用户WHERE user_id ='7';

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


对于存储多行输出到从选择一个变量进入查询:

你必须使用LISTAGG功能。listagg将coloumn的结果行连接成单个coloumn,并且为了区分它们,您可以使用特殊符号。 使用下面的查询 在组内(按用户名顺序)将SELECT listagg(username ||',')放入v_username FROM用户;

0

一个额外的点:

当您将从tsqlplsql你不必担心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