2009-09-04 12 views
2

J'ai un problème avec Oracle 9.2 et JMS. J'ai créé une routine PL/SQL pour envoyer du texte XML (à partir du fichier ou CLOB) à la file d'attente, mais cette routine ne compile pas.La fonction PL/SQL dans Oracle ne peut pas voir DBMS_AQ

Mon code ressemble (un message de remplissage omis):

create or replace procedure jms_test(msg varchar2) 
is 
    id     pls_integer; 
    message   sys.aq$_jms_stream_message; 
    enqueue_options dbms_aq.enqueue_options_t; 
    message_properties dbms_aq.message_properties_t; 
    msgid raw(16); 

    java_exp   exception; 
    v_filehandle_input utl_file.file_type; 
    v_newline  varchar2(32767); 
    pragma exception_init(java_exp, -24197); 
begin 
    message := sys.aq$_jms_stream_message.construct; 
    message.set_string_property('FROM', 'TEST'); 
    id := message.clear_body(-1); 
end; 

Et Oracle raports que:

Error(6,21): PLS-00201: identifier 'DBMS_AQ' must be declared 

J'ai regardé certains newsgroups et essayé tout ce que je trouvais, mais sans succès.

  1. accordé (avec succès) de nombreux permisions

    • DES RESSOURCES DE SUBVENTION à l'utilisateur;
    • GRANT CONNEXION à l'utilisateur;
    • ACCORD EXÉCUTER TOUTE PROCÉDURE À l'utilisateur;
    • GRANT aq_administrator_role TO utilisateur;
    • GRANT aq_user_role TO utilisateur;
    • EXECUTION GRANT SUR dbms_aqadm TO utilisateur;
    • EXECUTION GRANT SUR dbms_aq TO utilisateur;
    • EXECUTION GRANT SUR dbms_aqin TO utilisateur;
  2. desc dbms_aq montre de nombreuses fonctions comme DEQUEUE, ENQUEUE, ECOUTER

  3. exécuté à la fois SQLPlus catqueue.sql et dbmsaq.plb

Quelqu'un a idée de ce qui peut se tromper?

ÉDITÉ:

Je peux faire tout ce qui est décrit dans: http://rwijk.blogspot.com/2009/02/whats-in-my-jms-queue.html, donc dbms_aq est en quelque sorte visible, mais pas dans ma procédure.

+1

Juste pour clarifier: Vous avez exécuté le "desc dbms_aq" comme le même utilisateur avec lequel vous voulez compiler la procédure, non? –

+0

Oui, cela a été fait dans la même session SQLDeveloper. –

Répondre

6

Est-ce que ça marche si vous ...

SYS.DBMS_AQ 

au lieu de simplement

DBMS_AQ 

Si oui, vous manquez un synonyme.

EDIT:

Si vous êtes maintenant obtenir "PLS-00201: identifiant « SYS.DBMS_AQ" alors je vérifier votre subventions.

GRANT EXECUTE ON SYS.DBMS_AQ to <your-user>; 

De plus, juste pour confirmer, vous avez accordé le privilège d'exécuter directement à l'utilisateur, et non par un rôle?Pour utiliser des objets dans des procédures stockées, vous devez avoir des autorisations WITH GRANT OPTION.

+0

Non. Dans SQL Developer, j'ai ajouté sys. alors l'achèvement du code propose dbms_aq, mais après cela je peux choisir entre AQ $ _DEQUEUE(), ..., UNREGISTER (...), mais il n'y a pas d'interrogation_options_t ni de message_properties_t. –

+0

Après avoir ajouté sys. Oracle a changé le message d'erreur en: Erreur (6,21): PLS-00201: l'identificateur 'SYS.DBMS_AQ' doit être déclaré –

+0

Cela a fonctionné après que j'aie accordé d'utilisateur sys pas d'utilisateur en tant que sysdba. Merci! –

0

Dans ce cas, vous avez smust GRANT EXECUTER SUR SYS.DBMS_AQ AVEC OPTION DE SUBVENTION à;