ORA-01460 требуется невыполненная или необоснованная конверсия - PullRequest
0 голосов
/ 17 марта 2020

Я передаю идентификаторы в oracle pro c. Идентификаторы могут быть в 1000-х. в настоящее время он способен обрабатывать около 600 идентификаторов, если я передам более 600 идентификаторов - я получаю ORA-01460 необоснованной или необоснованной просьбы о преобразовании. Идентификатор - это тип данных varchar2, как я могу обработать тысячи идентификаторов в varchar2 или какова будет лучшая стратегия для решения такого рода проблем. Любое руководство / предложение будет высоко оценено. Можно ли это решить с помощью типа данных CLOB?

//this is how I am processing Id's

create or replace procedure Emp(
emp_id in varchar2
)

//passing those id's in CTE before passing to subquery

WITH
EMP_LIST AS(
select regexp_substr(emp_id,'[^,]+', 1, level) from dual
  connect by level <= LENGTH(regexp_substr(emp_id, '[^,]+'))+1
  )

1 Ответ

3 голосов
/ 17 марта 2020

Передайте коллекцию или VARRAY вместо передачи строки через запятую:

CREATE TYPE number_list IS TABLE OF NUMBER(10,0);

Затем вы можете использовать что-то вроде:

CREATE PROCEDURE emp(
  emp_ids IN number_list
)
IS
BEGIN
  -- Do something with the ids like inserting them into a table
  INSERT INTO employees ( id )
  SELECT COLUMN_VALUE
  FROM   TABLE( emp_ids );

  -- Or something like this:
  SELECT something
  INTO   some_variable  -- you need to define this variable first
  FROM   some_table
  WHERE  emp_id MEMBER OF emp_ids;
END;
/

Обновить

Если вы не можете ничего создать, вы можете использовать встроенную коллекцию, такую ​​как SYS.ODCINUMBERLIST:

CREATE PROCEDURE emp(
  emp_ids IN SYS.ODCINUMBERLIST
)
IS
BEGIN
  -- Do something with the ids like inserting them into a table
  INSERT INTO employees ( id )
  SELECT COLUMN_VALUE
  FROM   TABLE( emp_ids );

  -- Or something like this:
  SELECT something
  INTO   some_variable  -- you need to define this variable first
  FROM   some_table
  WHERE  emp_id IN ( SELECT COLUMN_VALUE FROM TABLE( emp_ids ) );
END;
/

(Примечание: SYS.ODCI*LIST типы - VARRAY данные типы и не поддерживают оператор MEMBER OF, как это делают коллекции, вместо этого вы можете получить значения из VARRAY, используя вложенный оператор SELECT с выражением TABLE() коллекции.)

Однако, если вы действительно ничего не можете CREATE, тогда вы не сможете CREATE PROCEDURE .... не уверен, что есть какое-то решение, кроме разговора с вашим администратором базы данных.

...