2016-03-29 3 views
0

Ich möchte Daten von Oracle in eine XML-Datei exportieren. Ich bin mir nicht sicher, wie ich das anstellen soll. Dies ist der Code für das, was ich bisher versucht habe, aber ich bekomme eine Fehlermeldung, dass die Tabelle nicht existiert. Das Schema verfügt über ein Auswahlrecht für die Tabelle, und die Tabelle ist im selben Schema ausgewählt. Stuck auf diese Weile. Jede mögliche Hilfe würdeWie exportiere ich Daten aus einer Tabelle in eine XML-Datei?

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; 

Antwort

1

Wenn der Eigentümer der Tabelle ersichtlich, nicht der gleiche wie der Inhaber des Verfahrens ist, sind Sie wahrscheinlich laufen in einem Fall von definer vs Aufrufer Rechte.

Wie bereits erwähnt here:

Wie Rollen arbeiten in PL/SQL-Blöcken, die die Verwendung von Rollen in einem PL/SQL-Block davon ab, ob es ein anonymer Block oder ein benannter Block ( Prozedur gespeichert, Funktion oder Trigger), und ob es mit Definer-Rechten oder Invoker-Rechten ausgeführt wird.

in Benannte Blöcke mit Definer Rechte Gebraucht Rollen Alle Rollen sind deaktiviert in jedem benannten PL/SQL-Block (gespeicherte Prozedur, Funktion oder Trigger), die mit definer Rechte ausführt. Rollen werden nicht für die Berechtigungsprüfung verwendet, und Sie können Rollen nicht innerhalb der Prozedur eines Definierers festlegen.

Beachten Sie, dass es dort über "Definer-Rechte-Verfahren" spricht.

Sie könnten versuchen, das Verfahren einstellen Aufrufer Nutzungsrechte (der Benutzer, der die Prozedur ausgeführt wird) und sehen, ob das Problem dadurch behoben:

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; 

Überprüfen Sie die Details auf der invoker_rights_clause hier aus: http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/create_procedure.htm#i2065815

Verwandte Themen