ORA-01460: 未实现或请求的转换不合理
ORA-01460 unimplemented or unreasonable conversion requested
我正在 oracle proc 中传递 ID。 ID 可以是 1000 的。目前它能够处理大约 600 个 ID,如果我传递超过 600 个 ID - 我收到 ORA-01460 未实现或不合理的转换请求。 ID 是 varchar2 数据类型,我如何处理 varchar2 中的 1000 个 ID,或者什么是处理此类问题的最佳策略。任何 guidance/suggestion 将不胜感激。这可以使用 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
)
传递集合或 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
使用带有 TABLE()
集合表达式的嵌套 SELECT
语句。)
但是,如果您真的无法 CREATE
任何事情,那么您将无法 CREATE PROCEDURE
....除了与您的 DBA 交谈之外,不确定是否有任何解决方案.
我正在 oracle proc 中传递 ID。 ID 可以是 1000 的。目前它能够处理大约 600 个 ID,如果我传递超过 600 个 ID - 我收到 ORA-01460 未实现或不合理的转换请求。 ID 是 varchar2 数据类型,我如何处理 varchar2 中的 1000 个 ID,或者什么是处理此类问题的最佳策略。任何 guidance/suggestion 将不胜感激。这可以使用 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
)
传递集合或 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
使用带有 TABLE()
集合表达式的嵌套 SELECT
语句。)
但是,如果您真的无法 CREATE
任何事情,那么您将无法 CREATE PROCEDURE
....除了与您的 DBA 交谈之外,不确定是否有任何解决方案.