【问题标题】:Converting Long to Varchar2将 Long 转换为 Varchar2
【发布时间】:2015-06-23 13:58:06
【问题描述】:

我正在尝试从长列插入 varchar2 列。这是下面的例子,TEXT.TEXT_COL = VARCHAR2(4000)NOTE.TEXT_NOTE = LONG

INSERT INTO TEXT(ROW_ID, TEXT_COL)
SELECT 1, TEXT_NOTE FROM NOTE; 

当我运行上面的 sql 时出现错误

SQL 错误:ORA-00997:非法使用 LONG 数据类型

我也使用了TO_LOB(),但仍然是同样的错误。

是否有任何函数可以简单地将long 转换为varchar2。让我知道你的想法。

【问题讨论】:

  • 你不能只使用内置过程在单个语句中完成,请参阅this thread
  • 您需要使用 PL/SQL 或带有 CLOB 列的中间表。当然,如果 LONG 列中的任何值超过 4000 字节,您可能仍然需要 CLOB;还是你很乐意截断那些?
  • 我必须在 informatica 会话级别使用这个 sql。我尝试了 informatica 内置数据类型的映射级别,但它也不起作用。
  • 我还有其他方法可以解决这个问题吗?
  • CAST(TEXT_NOTE AS VARCHAR) 是否向您抛出了错误?

标签: sql oracle ora-00997


【解决方案1】:

使用单个语句立即从long 转换为varchar2 是不可能的,因为long 有一定的限制。

您可以创建临时表或使用PL/SQL代码来解决您的问题:

  • 临时表:

    CREATE TABLE TABLE2 AS SELECT TO_LOB(COLUMN1) COLUMN FROM TABLE1;

  • PL/SQL 代码:

    DECLARE
      VAR1 LONG;
      VAR2 VARCHAR2(4000);
    BEGIN
      SELECT TEXT INTO VAR1 FROM USER_VIEWS WHERE ROWNUM = 1;  
      VAR2 := SUBSTR(VAR1, 1, 4000);
      DBMS_OUTPUT.PUT_LINE(VAR2);
    END;
    

【讨论】:

    【解决方案2】:

    当您在 FOR 循环中选择 LONG 时,Oracle 似乎在内部将 LONG 转换为其他内容(可能是 CLOB)。我在 Oracle 文档中没有找到任何解释,但这有效

    BEGIN
      FOR V IN (SELECT ROWID,TEXT_NOTE FROM NOTE)
      LOOP
        INSERT INTO TEXT VALUES(V.ROWID, SUBSTR(V.TEXT_NOTE, 1, 4000) );   
      END LOOP;
      COMMIT;
    END;
    

    这是一个如何将所有视图从另一个架构复制到您的架构的示例

    BEGIN
      FOR V IN (SELECT VIEW_NAME, TEXT_LENGTH, TEXT FROM ALL_VIEWS WHERE OWNER = 'PROD')
      LOOP
        EXECUTE IMMEDIATE 'CREATE OR REPLACE FORCE VIEW '||V.VIEW_NAME||' AS '||SUBSTR(V.TEXT, 1, V.TEXT_LENGTH);
        DBMS_OUTPUT.PUT_LINE('View '||V.VIEW_NAME||' created');
      END LOOP;
    END;
    

    由于某种原因,它仅适用于 FOR 循环,如果您使用 WITH 或从另一个查询中选择则不起作用

    INSERT INTO TEXT
    WITH V AS(SELECT ROWID ROW_ID,TEXT_NOTE FROM NOTE)
    SELECT V.ROW_ID, SUBSTR(V.TEXT_NOTE, 1, 4000) FROM V; 
    
    INSERT INTO TEXT
    SELECT ROW_ID, SUBSTR(TEXT_NOTE, 1, 4000) 
    FROM (SELECT ROWID ROW_ID,TEXT_NOTE FROM NOTE); 
    

    两个插入都会引发相同的错误

    ORA-00932:不一致的数据类型:预期的 CHAR 变长了

    【讨论】:

    • 当 TEXT_LENGTH 大于 32760 时 select ... from ALL_VIEWS 会抛出错误“ORA-06502: PL/SQL: numeric or value error: Bulk Bind: Truncated Bind”(我在“ Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit" 具有不同的视图以获得该限制数(我不知道为什么与 varchar2 (32767) 的最大值不同)。
    猜你喜欢
    • 2018-04-10
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 2021-10-03
    • 2011-02-11
    • 2013-07-26
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多