2013-09-11 1 views
3

Я собираюсь узнать pl/sql, и в настоящее время я не понимаю, что происходит с моим кодом. То, что я пытаюсь сделать, - это динамически копировать (резервировать) определенную таблицу. Так легко: я уже создал backupTable, потому что я буду использовать это довольно часто на самом деле. Поэтому первая попытка была следующей:Как динамически копировать таблицу с LONG-типом данных в динамическом sql?

EXECUTE IMMEDIATE 'INSERT INTO '||sSchema_||'.backupTable 
    SELECT * FROM '||sSchema_||'.table' 

Это не работает, как один из столбцов содержит LONG тип данных

Exception ORA-00997: illegal use of LONG datatype 

Так что следующий шаг пытается упаковать вещи в петлю и выборки каждой строки индивидуально:

--Initialized as 
TYPE cur_typ IS REF CURSOR; 
cCursor cur_typ; 
rRecord table%rowtype; 
--Make sure cursor is closed 
IF cCursor%ISOPEN THEN 
    CLOSE cCursor; 
END IF; 
--Run the copying 
OPEN cCursor FOR 'SELECT * FROM '||sSchema_||'.table'; 
LOOP 
    FETCH cCursor INTO rRecord; 
    EXIT WHEN cCursor%NOTFOUND; 
    EXECUTE IMMEDIATE 'INSERT INTO '||sSchema_||'.updateTable 'VALUES rRecord'; 
END LOOP; 
CLOSE cCursor; 

Который не выполняется из-за:

ORA-03001: unimplemented feature 

После этого я попытался использовать другие способы записи этого цикла, например.

EXECUTE IMMEDIATE 'INSERT INTO '||sSchema_||'.updateTable 'VALUES :1' USING rRecord; 

Все с одинаковым результатом: нереализованная характеристика.

Итак, возникает вопрос: как создать динамическую копию таблиц, содержащих LONG-тип данных? Кто-нибудь есть идеи?

Спасибо Тип много заранее

Донни

ответ

2

Целевая таблица должна быть с помощью LOB (CLOB или BLOB).

Тип данных LONG RAW обеспечивает обратную совместимость с существующими приложениями. Для новых приложений используйте типы данных BLOB и BFILE для больших объемов двоичных данных.

Oracle также рекомендует преобразовать существующие столбцы LONG RAW в столбцы LOB. Столбцы LOB имеют гораздо меньше ограничений, чем столбцы LONG. Кроме того, функциональность LOB улучшена в каждой версии, тогда как функциональность LONG RAW была статичной для нескольких выпусков.

Источник: Oracle Database Concepts

CREATE TABLE a_table 
(
    long_col LONG 
); 


CREATE TABLE a_backupTable 
(
    clob_col VARCHAR2(4000) 
); 


INSERT INTO a_table VALUES ('a'); 
-- 1 rows inserted. 

DECLARE 
    l_cur SYS_REFCURSOR; 
    l_long LONG; 
BEGIN 
    OPEN l_cur FOR SELECT long_col FROM a_table; 
    LOOP 
     FETCH l_cur INTO l_long; 
     EXIT WHEN l_cur%NOTFOUND; 

     INSERT INTO a_backupTable VALUES(l_long); 
    END LOOP; 
    CLOSE l_cur; 

    COMMIT; 
END; 
-- anonymous block completed 

SELECT * FROM a_backupTable; 
-- a 
+1

Большое спасибо за ваши советы: Но 3 вещи приходят на ум: База данных Я работаю с огромна, таким образом, я не могу изменить тип данных. Во-вторых, таблица состоит из многих столбцов, поэтому я хотел бы использовать% rowtype для создания записи. И, в-третьих, я думаю, проблема на самом деле заключается в составлении EXECUTE IMMEDIATE и записи im, пытающейся скопировать в таблицу. (Запись без немедленного выполнения выполняется, а немедленное выполнение без записи тоже ...). Так что, на самом деле, я думаю, что это ошибка оракула, и я пытаюсь найти способ обойти это ... – Donny

Смежные вопросы