3

我即将学习 pl/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 数据类型的表的动态副本?有人知道吗?

非常感谢提前

唐尼

4

1 回答 1

2

目标表应该使用 LOB(CLOB 或 BLOB)类型。

提供 LONG RAW 数据类型是为了与现有应用程序向后兼容。对于新应用程序,对大量二进制数据使用 BLOB 和 BFILE 数据类型。

Oracle 还建议您将现有的 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 回答