9

我正在尝试从长列插入 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. 让我知道你的想法。

4

2 回答 2

12

不可能使用单个语句立即将 from 转换为long,因为有某些限制。varchar2long

您可以创建一个临时表或使用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;
    
于 2015-06-23T15:31:55.913 回答
0

当您在 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 得到了 LONG

于 2019-04-03T13:31:46.170 回答