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