It looks like Oracle internally converts LONG to probably CLOB when you select LONG in a FOR loop. I did not find any explanation in the Oracle documentation, but it works
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;
This is an example of how to copy all views from another schema to your schema.
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 some reason, this only works for the FOR loop and does not work if you use WITH or select from another query
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);
Both inserts cause the same error
SQL Error: ORA-00932: Incompatible Data Types: CHAR Expected to Receive LONG
source share