【问题标题】:how to dynamically copy a table with LONG datatype in dynamic sql?如何在动态 sql 中动态复制具有 LONG 数据类型的表?
【发布时间】:2013-09-15 03:18:31
【问题描述】:

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

提前非常感谢

唐尼

【问题讨论】:

    标签: oracle plsql dynamic-sql


    【解决方案1】:

    目标表应该使用 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
    

    【讨论】:

    • 非常感谢您的建议:但我想到了 3 件事:我正在使用的数据库很大,因此我无法更改数据类型。其次,该表由许多列组成,因此我想使用 %rowtype 来创建记录。第三,我想问题实际上是 EXECUTE IMMEDIATE 和我试图复制到表中的记录的组合。 (没有立即执行的记录正在运行,没有记录的立即执行也正在运行......)。所以实际上我猜这是一个 oracle 错误,我正在尝试找到解决它的方法......
    猜你喜欢
    • 2015-02-28
    • 2018-12-16
    • 2021-08-07
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多