Справка по хранимым процедурам Oracle - PullRequest
1 голос
/ 19 января 2011

HI новый для хранимой процедуры.Я использую динамический sql с

select * from table into var

var является переменной. Var содержит более одного значения, когда я пытаюсь запустить proc с входными данными, я получаю ошибку:

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

Есть ли такой способ, что переменная может содержать более одной строки, используя динамический sql.

Ответы [ 4 ]

4 голосов
/ 19 января 2011

Использовать переменные коллекции:

DECLARE
        TYPE tt_int IS TABLE OF INTEGER;
        var tt_int;
BEGIN
        SELECT  id
        BULK COLLECT
        INTO    var
        FROM    table;
END;
2 голосов
/ 19 января 2011

Вы должны 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, как выбрать все столбцы

1 голос
/ 19 января 2011

вы также можете вернуть результаты в ref курсор

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  
0 голосов
/ 19 января 2011

Вы можете использовать табличную переменную, которая предоставляет вам таблицу ваших результатов в памяти. Вы объявляете переменную таблицы, аналогичную стандартной переменной:

declare @MyVar table (col1 col1type, col2 col2type, etc.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...