Как выполнить родной sql в oracle 12 c - PullRequest
0 голосов
/ 30 марта 2019

Я не могу выполнить собственный sql.

Я получаю ошибку ниже:

ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк ORA-06512: в строке 1001422. 00000 - «Точная выборка возвращает больше запрошенного числа строк» ​​* Причина: число, указанное в точной выборке, меньше возвращаемых строк.* Действие: переписать запрос или изменить количество запрошенных строк
sqltest := 'select create_ts  from WORKFLOW_CODES where id =' || p_id;
execute immediate (sqltest) into v_create_ts;
open p_recordset for
select v_create_ts from dual;
DBMS_SQL.RETURN_RESULT(p_recordset);

end;

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Вам не нужна отдельная переменная для хранения значения из результата sql для передачи его в таблицу RETURN_RESULT через dual. refcursor, определенный для исходной таблицы, может быть передан непосредственно

DECLARE
     p_id          INT := 1;
     p_recordset   SYS_REFCURSOR;
BEGIN
     OPEN p_recordset FOR 'select create_ts  
                       from WORKFLOW_CODES where id = ' 
     || DBMS_ASSERT.enquote_literal (p_id); -- enquote_literal to 
                                            -- prevent SQL injection
     DBMS_SQL.return_result(p_recordset);
END;
/
0 голосов
/ 30 марта 2019

Это:

select create_ts from WORKFLOW_CODES where id =' || p_id

должно возвращать только одну строку (одно значение CREATE_TS), но возвращает две (или более) строки, поэтому Oracle жалуется на это.Либо примените другое условие (я), чтобы ограничить число возвращаемых строк, либо - если идентификатор должен быть уникальным , убедитесь, что оно действительно (например, удалив дубликаты и применив первичный или уникальный ключ / индекс)к нему).


Чтобы проиллюстрировать то, что я говорю:

SQL> create table workflow_codes(id number, create_ts number);

Table created.

SQL> insert into workflow_codes
  2    select 1, 100 from dual union all
  3    select 1, 200 from dual union all
  4    --
  5    select 3, 300 from dual;

3 rows created.

Есть 2 строки для ID = 1, поэтому он выдаст ошибку:

SQL> declare
  2    l_create_ts number;
  3  begin
  4    select create_ts into l_create_ts from workflow_codes where id = 1;
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 4

Будет в порядке для ID = 3:

SQL> l4
  4*   select create_ts into l_create_ts from workflow_codes where id = 1;
SQL> c/1/3
  4*   select create_ts into l_create_ts from workflow_codes where id = 3;
SQL> l
  1  declare
  2    l_create_ts number;
  3  begin
  4    select create_ts into l_create_ts from workflow_codes where id = 3;
  5* end;
SQL> /

PL/SQL procedure successfully completed.

SQL>
...