быстрая выборка данных с помощью табличной функции oracle apex - PullRequest
0 голосов
/ 06 июля 2018

Есть ли способ решить "выборка ORA-01422, возвращающая больше запрошенного числа> строк", без использования цикла for для возврата значения для табличных функций? Выборка данных с использованием цикла for для использования этих данных для приложения Oracle использование APEX замедляется.

1 Ответ

0 голосов
/ 06 июля 2018

Вы можете использовать DISTINCT или GROUP BY против ORA-01422 со списком всех строк, которые должны быть возвращены без использования LOOP , но только с одним INTO , как в следующем примере:

SQL> create table tab( col1 int, col2 varchar2(50) );

 Table created
SQL> insert all
2         into tab values(1,'abc')
3         into tab values(1,'abc')
4         into tab values(2,'def')
5  select * from dual;

3 rows inserted
SQL> set serveroutput on;
SQL> 
SQL> declare
  2    v_col1 tab.col1%type;
  3    v_col2 tab.col2%type;
  4  begin
  5    select t.col1, t.col2
  6      into v_col1, v_col2
  7      from tab t
  8     where t.col1 = 1;
  9  
 10     dbms_output.put_line(v_col1||'  '||v_col2);
 11  end;
 12  /     

ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 6

SQL> 
SQL> declare
  2    v_col1 tab.col1%type;
  3    v_col2 tab.col2%type;
  4  begin
  5    select t.col1, t.col2
  6      into v_col1, v_col2
  7      from tab t
  8     where t.col1 = 1
  9     group by t.col1, t.col2;
 10  
 11     dbms_output.put_line(v_col1||'  '||v_col2);
 12  end;
 13  /

1  abc

PL/SQL procedure successfully completed

SQL> 
SQL> declare
  2    v_col1 tab.col1%type;
  3    v_col2 tab.col2%type;
  4  begin
  5    select distinct t.col1, t.col2
  6      into v_col1, v_col2
  7      from tab t
  8     where t.col1 = 1;
  9  
 10     dbms_output.put_line(v_col1||'  '||v_col2);
 11  end;
 12  /

1  abc

PL/SQL procedure successfully completed
...