2010-10-28 29 views
3

Mon scénario:Oracle Synonymes question

  • Nom du schéma: schema1
  • Nom du package: pkg_system
  • nom de la procédure: PROC1

Maintenant, je suis en train de créer un synonyme pour mon proc1 comme ci-dessous

CREATE PUBLIC SYNONYM call_proc FOR schema1.pkg_system.proc1; 

... mais cela m'a donné une erreur de syntaxe.

ORA-00933: SQL command not properly ended 

J'ai changé le code comme ci-dessous:

CREATE PUBLIC SYNONYM call_proc FOR pkg_system.proc1; 

Je peux créer avec succès les synonymes mais quand j'ai essayé d'exécuter la procédure stockée via le synonyme:

EXEC call_proc 

... a obtenu l'erreur suivante:

ORA-06550: line 1, column 7: 
PLS-00201: identifier call_proc must be declared 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

Et j'ai utilisé le nom du schéma pour appeler la procédure comme schema1.call_Proc toujours eu la même erreur.

Qu'est-ce que j'ai fait de mal ici?

+0

est-ce pas il 'CREATE PUBLIC SYNONYM' (singulier)? – Phil

+0

désolé mis mal. Changez-le en singulier maintenant. – niceApp

+0

Je ne comprendrai jamais pourquoi les gens "tapent" des questions de code pour un code qui ne fonctionne pas. – Phil

Répondre

4

Une façon de contourner cette limitation, en supposant vraiment besoin d'appeler la procédure avec un seul nom (quelle qu'en soit la raison), vous pouvez l'envelopper dans une procédure schéma niveau:

CREATE PROCEDURE schema1.proc1 IS 
BEGIN 
    pkg_system.proc1; 
END; 

CREATE PUBLIC SYNONYM proc1 FOR schema1.proc1; 
4

Remarque here

Restriction sur la clause L'objet de schéma ne peut pas être contenu dans un emballage. En d'autres termes, vous ne pouvez pas créer un synonyme pour une procédure de package.

J'ai vu des solutions où une procédure wrapper (non empaquetée) est créée et un synonyme public créé pour cela.

+2

Si vous faites un select * from dba_synonyms où synonym_name = 'FRED'; vous verrez que CREATE PUBLIC SYNONYM call_proc POUR pkg_system.proc1; crée un synonyme pour l'objet "PROC1" dans le schéma PKG_SYSTEM (même s'il n'y a pas d'utilisateur/schéma de ce nom). –

+0

Je ne suis toujours pas convaincu que vous avez besoin d'un synonyme. Pourquoi ne pas simplement avoir une procédure d'encapsulation référençant le schéma approprié? –