2013-12-19 13 views
7

Ich verwende Oracle 11.2.0.1.0 und versuche, das dbms_sql-Paket zum Laufen zu bringen. Aber ich bekomme immer wieder die ORA-29471 Fehler, wie unten dargestellt:Wie löst man ORA-29471 auf dbms_sql.open_cursor?

DECLARE 
    c INTEGER; 
BEGIN 
    c := dbms_sql.open_cursor(); 
END; 

ORA-29471: DBMS_SQL access denied 
ORA-06512: at "SYS.DBMS_SQL", line 1017 
ORA-06512: at line 4 

Das Orakel docs folgendes sagen dazu:

Checks vorgenommen werden, wenn die Bindung und Ausführung. Optional können die Prüfungen für jeden einzelnen DBMS_SQL-Unterprogrammaufruf durchgeführt werden. Die Überprüfung lautet:

  • Der current_user ist das gleiche beim Aufrufen des Unterprogramms, als es beim Aufrufen des neuesten Pars war.
  • Die aktivierten Rollen beim Aufrufen des Unterprogramms müssen eine Obermenge der aktivierten Rollen beim Aufrufen der neuesten Syntaxanalyse sein.
  • In Übereinstimmung mit der Verwendung von Definer 's Rechte Unterprogrammen, Rollen nicht gelten. Wenn eine der beiden Prüfungen fehlschlägt, wird der ORA-29470-Fehler ausgegeben.

    Soweit ich sagen kann, gelten beide Bedingungen nicht für meinen Code, da der Code Schemas nicht kreuzt.

    Die Oracle support (erfordert Anmeldung) Website schlägt vor, dass ich explizit den Parameter security_level in dbms_sql.open_cursor hinzufügen. Das Hinzufügen eines der Werte (0/1/2) löst das Problem nicht.

    Die verwirrende Sache für mich ist, dass ich den Fehler an der dbms_sql.open_cursor erhalte, wo die Sicherheitsstufe zuerst definiert wird.

    Die Support-Website schlägt auch eine Abhilfe, die Einstellung bedeutet:

    alter system set "_dbms_sql_security_level" = 384 scope=spfile; 
    

    Ich habe das noch nicht ausprobiert. Ich ziehe es vor, es als letzten Ausweg zu betrachten, da es eine Sicherheitsschicht deaktiviert und es sich um eine nicht unterstützte Oracle-Funktion handelt. Kaum ideale Umstände für den Produktionseinsatz. Es löst das Problem auch nicht wirklich, sondern versteckt es.

    Wie kann ich diesen Fehler beheben?

    Antwort

    9

    Der einzige Grund, (kann nicht ein anderes in diesem Moment sehen), warum Ihr Code die ORA-29471 aufwirft, ist bereits dbms_sql inoperable in der Sitzung gemacht durch eine ungültige Cursor-ID bereitstellt:

    /* dbsm_sql detects invalid cursor ID in this session */ 
    SQL> declare 
        2 c_1 number := 5; -- invalid cursor ID. There is no cursor 
        3 l_res boolean; -- opened with ID = 5  
        4 begin 
        5 l_res := dbms_sql.is_open(c_1); 
        6 end; 
        7/
    declare 
    * 
    ERROR at line 1: 
    ORA-29471: DBMS_SQL access denied 
    ORA-06512: at "SYS.DBMS_SQL", line 1104 
    ORA-06512: at line 5 
    
    
    /* An attempt to execute this simple anonymous PL/SQL block after 
        an invalid cursor ID has already been detected by the dbms_sql 
        in the current session will lead to ORA-29471 error 
    */ 
    
    SQL> declare 
        2 c_2 number; 
        3 begin 
        4 c_2 := dbms_sql.open_cursor(); 
        5 end; 
        6/
    declare 
    * 
    ERROR at line 1: 
    ORA-29471: DBMS_SQL access denied 
    ORA-06512: at "SYS.DBMS_SQL", line 1084 
    ORA-06512: at line 4 
    

    versuchen, diesen Code auszuführen in einer neu eingerichteten Sitzung.

    +1

    Verdammt. Ich wollte genau dasselbe sagen, aber du hast mich dafür geschlagen. +1 –

    +1

    Ich hatte gerade den Fehler auf die gleiche Weise wie Sie reproduziert und war dabei, die SQL * Plus-Ausgabe in meine Antwort einzufügen, als ich Ihre Antwort sah. Wenn ich so verärgert wäre, hätte ich Ihren Posten nicht aufgewertet. :) –

    +1

    Sie haben Recht. Durch das Einrichten einer neuen Sitzung wurde das Problem behoben. Ich kann nicht glauben, dass ich mehr als eine Stunde damit verbracht habe, das herauszufinden. Vielen Dank! –

    Verwandte Themen