2011-01-19 156 views
1

您是存储过程的新手。 正在使用与Oracle存储过程帮助

select * from table into var 

无功动态SQL是一种variable.the变种中包含多个值,当我尝试运行与输入的PROC我得到一个错误:

ORA-01422: exact fetch returns more than requested number of rows 

有一种使变量可以使用动态sql保存多行的方式。

+4

我们可以看到您的存储过程? – 2011-01-19 13:55:59

+2

Kassos to Quassnoi将Oracle标识为仅来自ORA-01422错误消息文本的数据库。 – APC 2011-01-19 14:05:46

回答

0

您可以使用表变量,它为您提供结果的内存表。声明表变量类似于标准的变量:

declare @MyVar table (col1 col1type, col2 col2type, etc.) 
4

使用集合变量:

DECLARE 
     TYPE tt_int IS TABLE OF INTEGER; 
     var tt_int; 
BEGIN 
     SELECT id 
     BULK COLLECT 
     INTO var 
     FROM table; 
END; 
2

你必须bulk collect结果集为table of类型,如果你要选择多行。

declare 
    type record_type is table of <table_name>; 
    var_records record_type; 

begin 

    select * 
    bulk collect into var_records 
    from <table_name>; 

end; 
/

另见我的回答PL SQL how to select all columns

1

,你还可以将结果返回到ref cursor

set serveroutput on 
DECLARE 
    REFEXAMPLE SYS_REFCURSOR; 
    VAR NUMBER ; 
    col varchar2(50); 
BEGIN 
    OPEN REFEXAMPLE FOR --Here you open the cursor and fill it 
    SELECT * 
     FROM (
     SELECT 1 VAR, 'a' COL FROM DUAL 
     UNION ALL 
     SELECT 2 VAR, 'b' COL FROM DUAL 
     UNION ALL 
     SELECT 3 VAR, 'c' COL FROM DUAL 
     UNION ALL 
     SELECT 4 VAR, 'd' COL FROM DUAL 
     UNION ALL 
     SELECT 5 VAR, 'e' COL FROM DUAL 
    ) EXAMPLETABLE ; 


    DBMS_OUTPUT.PUT_LINE('var ' || 'col'); 
    DBMS_OUTPUT.PUT_LINE('---------'); 
    LOOP 
     FETCH REFEXAMPLE INTO VAR, col; --now loop through 
     EXIT WHEN REFEXAMPLE%NOTFOUND; 
      DBMS_OUTPUT.PUT_LINE(var || '  ' || col || ' '); 
     END LOOP; 
    CLOSE REFEXAMPLE; 


end ; 
/


var col 
--------- 
1  a 
2  b 
3  c 
4  D 
5  e