0

我想从 oracle 将数据导出到 xml 文件。我不知道该怎么做。这是我迄今为止尝试过的代码,但我收到一条错误消息,说表不存在。该模式具有该表的选择权限,并且该表位于所选的同一模式中。坚持了一段时间。任何帮助,将不胜感激

CREATE PROCEDURE xmlUnload (ulSchema IN VARCHAR2, ulTable IN VARCHAR2, ulDirectory IN VARCHAR2)
IS
    l_file          UTL_FILE.file_type;
    xml_data        VARCHAR2(5000);
BEGIN
    SELECT dbms_xmlgen.getxml('SELECT * FROM '||ulSchema||'.'||ulTable) xml INTO xml_data FROM dual;

    l_file := UTL_FILE.fopen(ulDirectory,ulSchema'.'ulTable, 'w');

    UTL_FILE.putf(l_file, xml_data);
    UTL_FILE.fclose(l_file);
END xmlUnload;
4

1 回答 1

1

如果表的所有者与过程的所有者不同,您可能会遇到定义者与调用者权限的情况。

如此处所述:

角色如何在 PL/SQL 块中工作 PL/SQL 块中角色的使用取决于它是匿名块还是命名块(存储过程、函数或触发器),以及它是使用定义者权限还是调用者权限执行.

在具有定义者权限的命名块中使用的角色 所有角色在任何以定义者权限执行的命名 PL/SQL 块(存储过程、函数或触发器)中都被禁用。角色不用于权限检查,您不能在定义者的权限过程中设置角色。

请注意,它在那里谈论“定义者的权利程序”。

您可以尝试将过程设置为使用调用者权限(正在执行过程的用户),看看这是否解决了问题:

CREATE PROCEDURE xmlUnload (ulSchema IN VARCHAR2, ulTable IN VARCHAR2, ulDirectory IN VARCHAR2)
AUTHID CURRENT_USER -- options are "CURRENT_USER" or "DEFINER"; DEFINER is the default
IS
    l_file          UTL_FILE.file_type;
    xml_data        VARCHAR2(5000);
BEGIN
    SELECT dbms_xmlgen.getxml('SELECT * FROM '||ulSchema||'.'||ulTable) xml INTO xml_data FROM dual;

    l_file := UTL_FILE.fopen(ulDirectory,ulSchema'.'ulTable, 'w');

    UTL_FILE.putf(l_file, xml_data);
    UTL_FILE.fclose(l_file);
END xmlUnload;

在此处查看有关invoker_rights_clause 的详细信息:http: //docs.oracle.com/cd/B28359_01/appdev.111/b28370/create_procedure.htm#i2065815

于 2016-03-30T19:09:52.590 回答