It looks like Oracle internally converts LONG to something else (probably CLOB) when you select LONG in FOR loop. I did not find any explanations in Oracle documentation, but this 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 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 it only works for 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 raise the same error
ORA-00932: inconsistent datatypes: expected CHAR got LONG