【问题标题】:ORA-01460 unimplemented or unreasonable conversion requestedORA-01460 请求未实现或不合理的转换
【发布时间】:2020-06-28 01:44:29
【问题描述】:

我在 oracle proc 中传递 ID。 ID 可以是 1000 个。目前它能够处理大约 600 个 ID,如果我通过超过 600 个 ID - 我收到 ORA-01460 未实现或不合理的转换请求。 ID 是 varchar2 数据类型,我如何处理 varchar2 中的 1000 个 Id,或者处理此类问题的最佳策略是什么。任何指导/建议将不胜感激。这可以使用 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
  )

【问题讨论】:

    标签: sql oracle stored-procedures sqldatatypes


    【解决方案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 运算符;相反,您可以使用嵌套的 SELECT 语句从 VARRAY 获取值带有TABLE() 集合表达式。)

    但是,如果您真的无法CREATE 任何事情,那么您将无法CREATE PROCEDURE .... 除了与您的 DBA 交谈之外,不确定是否有任何解决方案。

    【讨论】:

    • @MTO 谢谢你的努力,我会在早上试试这个,然后告诉你。再次感谢。
    • @MTO 在哪里使用创建 TYPE ,在数据库或 java 类中?我无权创建任何我可以阅读的内容
    • @MTO 我没有看到 sys.ODCINUMBERLIST ,我可以看到其他选项,例如 sys.odciconst 和 dump...
    • @david db<>fiddle 为我工作;也许您的 DBA 已将其锁定。
    • @MTO 现在工作完美,非常感谢你的伟大helo。
    猜你喜欢
    • 2012-06-17
    • 2015-10-14
    • 2018-08-23
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2021-07-15
    • 2015-09-18
    相关资源
    最近更新 更多