3

私は pl/sql を学習しようとしていますが、現在、自分のコードで何が問題になっているのか理解できません。私がやろうとしているのは、特定のテーブルを動的にコピー (バックアップ) することです。とても簡単なことです。実際にはかなり頻繁に使用するため、backupTable を作成済みです。したがって、最初の試行は次のとおりです。

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

列の1つに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 データ型を含むテーブルの動的コピーを作成するにはどうすればよいですか? 誰にもアイデアはありますか?

事前にどうもありがとう

ドニー

4

1 に答える 1

2

ターゲット テーブルは、LOB (CLOB または BLOB) タイプを使用している必要があります。

LONG RAW データ型は、既存のアプリケーションとの下位互換性のために提供されています。新しいアプリケーションでは、大量のバイナリ データに BLOB および BFILE データ型を使用します。

また、既存の LONG RAW 列を LOB 列に変換することもお勧めします。LOB 列は、LONG 列よりも制限がはるかに少なくなります。さらに、LOB 機能はすべてのリリースで拡張されていますが、LONG RAW 機能はいくつかのリリースで静的でした。

出典: Oracle データベースの概念

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
于 2013-09-11T08:27:50.017 に答える