将Long转换为Varchar2

时间:2015-06-23 13:58:07

标签: sql oracle

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

2 个答案:

答案 0 :(得分:5)

由于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;
    

答案 1 :(得分: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变长了