цикл для массива дает ошибку в оракуле - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть такая функция:

create or replace function dedup_temp
 return varchar2
 as 
 TYPE OriType IS TABLE OF deduporiginal%ROWTYPE;
 type1 OriType;
 num number;
 begin
 select count(1) into num from deduporiginal;
 select * into type1(num) from deduporiginal where rownum < 125;


   for i in 1 .. type1.count
   loop
     DBMS_OUTPUT.put_line('v_month_va(i): '||type1(i).name);
   end loop; 

 return 'DONE';

 end dedup_temp;

Он успешно скомпилирован, но выдает ошибку при запуске с запросом типа

 select dedup_temp() from dual;

Ошибка:

ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "CRESTELDEDUPDEV.DEDUP_TEMP", line 9
01422. 00000 -  "exact fetch returns more than requested number of rows"
*Cause:    The number specified in exact fetch is less than the rows returned.
*Action:   Rewrite the query or change number of rows requested

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

Если вы хотите выбрать много строк в таблице plsql, вы можете использовать массовый сбор:

 select * BULK COLLECT into type1 from deduporiginal where rownum < 125;

обновление: , если вы хотите вернуть type1:

Я не думаю, что вы можете создать объект типа вне функции, которая использует% ROWTYPE, поэтому вам, вероятно, придется упаковать все это в пакет:

CREATE OR REPLACE PACKAGE package_name IS
  TYPE OriType IS TABLE OF deduporiginal%ROWTYPE;
  FUNCTION dedup_temp RETURN OriType ;
END package_name ;
/
CREATE OR REPLACE PACKAGE BODY package_name IS
FUNCTION dedup_temp RETURN OriType IS
 type1 OriType;
 num number;
 begin
   select count(1) into num from deduporiginal;
   select * BULK COLLECT into type1 from deduporiginal where rownum < 125;


   for i in 1 .. type1.count
   loop
     DBMS_OUTPUT.put_line('v_month_va(i): '||type1(i).name);
   end loop; 

   return type1 ;
 end dedup_temp;

END package_name ;
/

но я уверен, что вы сможете использовать его в выбранном статусе как:

 select package_name.dedup_temp() from dual;

Для выполнения чего-то подобного вам нужна конвейерная функция

2 голосов
/ 20 декабря 2011

Я бы предположил, что таблица deduporiginal возвращает более одной строки для условия rownum < 125

Вы, вероятно, хотели что-то вроде

create or replace function dedup_temp  
   return varchar2  
as
   TYPE OriType IS TABLE OF deduporiginal%ROWTYPE;  
   type1 OriType;  num number;  
begin  
  --?   select count(1) into num from deduporiginal;  
  for r in (
       select *   
         from deduporiginal 
         where rownum < 125
  ) loop

      DBMS_OUTPUT.put_line('v_month_va(i): ' || r.name);  
  end loop; 

  return 'DONE';  

end dedup_temp; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...