Comment supprimer une procédure dont le nom est ambigu?

12

J'utilise Informix ...

Je ne sais pas comment je l'ai fait, mais il y a deux procédures avec le même nom dans ma base de données. Quand j'essaye de les retirer avec un

DROP PROCEDURE myProc;

alors je reçois un message d'erreur

ERROR: Routine (add_adr_trigger_row) ambiguous - more than one
routine resolves to given signature.
Error Code: -9700

Comment puis-je abandonner les procédures?

PeterP
la source

Réponses:

13

Cela se produit lorsque vous avez 2 procédures ou plus, avec le même nom, mais avec des nombres différents de paramètres d'entrée.

Par exemple, vous avez créé 2 procédures:

CREATE PROCEDURE myProc(param1)
...
CREATE PROCEDURE myProc(param1, param2)
...

Pour supprimer le second, vous avez 2 options:

Le plus simple:

DROP PROCEDURE myProc(param1, param2);

Le plus dur:

dbaccess DB -
select procname, procid, numargs from sysprocedures where procname like 'myProc';
procname  myProc
procid    1
numargs   1

procname  myProc
procid    2
**numargs   2**

UPDATE sysprocedures SET procname='myProcOLD' WHERE procid=2;
DROP PROCEDURE myProcOLD;

Même si la première méthode est simple, la première fois que j'ai été appelé au milieu de la nuit pour ce même problème, j'ai choisi la seconde. Ma faute ...

MTIhai
la source
En outre, vous pouvez utiliser "finderr 9700" dans votre console ssh pour voir plus d'informations sur ce type d'erreur. Les informations sont souvent très utiles: ... Ce problème se produit lorsqu'un argument (ou son type source ou type parent) a des transtypages implicites aux paramètres de deux routines ou plus. Par exemple, supposons qu'il existe deux routines appelées routine_name (paramtype1) et routine_name (paramtype2), et routine_name est invoqué avec routine_name (argtype). De même, des conversions implicites existent de type argt à paramtype1 et argtype à paramtype2. Dans ce cas, cette erreur est déclenchée.
MTIhai
Peter, @MTIhai si c'était la solution, pouvons-nous la déplacer vers une réponse?
jcolebrand
0

Si vous savez que cela pourrait être un problème à l'avenir, vous pouvez créer votre procédure avec un nom SPÉCIFIQUE, qui doit être unique dans toutes les procédures de la base de données.

Si vous ne savez pas que ce sera un problème lorsque vous créez la procédure, vous ne pouvez pas officiellement revenir en arrière et ajouter un nom spécifique, et vous avez un problème.

La MISE À JOUR de sysproceduresdans la réponse sélectionnée ne devrait fonctionner que si l'utilisateur est connecté en tant que informix(ou, dans le cas d'un serveur privé, le propriétaire du serveur).

Jonathan Leffler
la source