使用 Oracle 引用游标时出错



我正在尝试做一些相当简单的事情,我正在尝试从我的个人表空间中自动删除和备份表。 我有大约 100 个表,想要摆脱所有这些表(除了我用来存储表名的表),但希望保留表中的数据,以防将来需要它们。 下面是我尝试用于完成此操作的代码。 我在 ref 光标上收到错误,我将在我的代码下方包含该错误。 我半期望有人告诉我我是个白痴,并解释一种更简单的方法。 如果没有,请告诉我我做错了什么,谢谢。

DECLARE
    v_folder_name        VARCHAR2(100) := 'MY_FOLDER';
    TYPE QRY_CURSOR      IS REF CURSOR;
    v_qry_cursor         QRY_CURSOR;
    v_file_name          VARCHAR2(320);
    v_file               sys.utl_file.file_type;
    v_max_buffer_length  CONSTANT BINARY_INTEGER := 32767;
    v_qry_str            VARCHAR2(4000); --I've tried this with 32767, made no difference
    v_drop_string        VARCHAR2(4000);
    v_dynamic_record     VARCHAR2(4000); --tried this with 32767 also
CURSOR GET_TABLE_NAMES IS
    SELECT * FROM TEMP_BACKUP_TABLE WHERE TABLE_NAME <> 'TEMP_BACKUP_TABLE';
FUNCTION startFile(file_name VARCHAR2)
    --working function, used with many procedures, left out for brevity
END startFile;
FUNCTION closeFile(file_name VARCHAR2)
    --working function, used with many procedures, left out for brevity
END closeFile;
BEGIN
    INSERT INTO TEMP_BACKUP_TABLE SELECT DISTINCT TABLE_NAME FROM ALL_TAB_COLS WHERE OWNER = 'ME';
    COMMIT;
FOR REC IN GET_TABLE_NAMES LOOP
    v_file_name := REC.TABLE_NAME;
    v_file := startFile(v_file_name);
    v_qry_str := 'SELECT * FROM ' || v_file_name;
    v_drop_string := 'DROP TABLE ' || v_file_name;
    OPEN v_qry_cursor FOR v_qry_str;  -- this is the line that returns an error
    LOOP
        FETCH v_qry_cursor INTO v_dynamic_record;
        EXIT WHEN v_qry_cursor%NOTFOUND;
        sys.utl_file.put_line(v_file, v_dynamic_record);
    END LOOP;
    CLOSE v_qry_cursor;
    EXECUTE IMMEDIATE v_drop_string;
    COMMIT;
    v_file := closeFile(v_file_name);
END LOOP;
DELETE FROM TEMP_BACKUP_TABLE;
END;

我得到的错误如下:

Error report:
ORA-00932: inconsistent datatypes: expected - got -
ORA-06512: at line 73
00932. 00000 - "inconsistent datatypes: expected %s got %s"
*cause:
*action:

感谢您的任何帮助。

至少,utl_file.put_line 不会获取任意记录,并且您不能将任意列列表提取到varchar2中。

您可以遍历每一列并构造一个 SQL 语句,该语句将每列中的值连接成单个字符串。 这将包括执行诸如在datetimestamp列上放置具有显式格式掩码的to_char,添加分隔符,转义数据中存在的任何分隔符等操作。 这通常是一个相当乏味且容易出错的过程。 然后,您需要编写一个SQL*Loader控制文件,以便在将来重新加载数据。

听起来您最好使用 Oracle 导出实用程序导出表。 这是一个命令行实用程序(expexpdp,具体取决于您是要使用经典版本还是 DataPump 版本),允许您将表定义和数据导出到稍后可以使用 Oracle 导入实用程序加载的文件。

最新更新