Oracle存储过程帮助

时间:2011-01-19 13:54:24

标签: sql oracle stored-procedures

我是存储过程的新手。 我正在使用带有

的动态sql
select * from table into var

var是一个变量.var包含多个值,当我尝试使用输入运行proc时出现错误:

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

有没有办法使变量可以使用动态sql保存多行。

4 个答案:

答案 0 :(得分:4)

使用集合变量:

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

答案 1 :(得分: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

的回答

答案 2 :(得分: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  

答案 3 :(得分:0)

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

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