Wie lösche ich eine Prozedur, deren Name nicht eindeutig ist?

12

Ich benutze informix ...

Ich weiß nicht, wie ich es gemacht habe, aber es gibt zwei Verfahren mit dem gleichen Namen in meiner Datenbank. Wenn ich versuche, sie mit einem zu entfernen

DROP PROCEDURE myProc;

dann bekomme ich eine fehlermeldung

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

Wie kann ich die Prozeduren fallen lassen?

PeterP
quelle

Antworten:

13

Dies ist der Fall, wenn Sie über zwei oder mehr Prozeduren mit demselben Namen, jedoch mit einer unterschiedlichen Anzahl von Eingabeparametern verfügen.

Sie haben beispielsweise zwei Prozeduren erstellt:

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

Um den zweiten zu löschen, haben Sie zwei Möglichkeiten:

Der Einfache:

DROP PROCEDURE myProc(param1, param2);

Der Schwierige:

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;

Auch wenn die erste Methode ganz einfach ist, habe ich mich für die zweite entschieden, als ich zum ersten Mal mitten in der Nacht wegen des gleichen Problems angerufen wurde. Mein Fehler ...

MTIhai
quelle
Sie können auch "finderr 9700" in Ihrer ssh-Konsole verwenden, um weitere Informationen zu dieser Art von Fehler anzuzeigen. Die Informationen sind oft sehr nützlich: ... Dieses Problem tritt auf, wenn ein Argument (oder sein Quelltyp oder übergeordneter Typ) implizite Umwandlungen in die Parameter von zwei oder mehr Routinen enthält. Angenommen, es gibt zwei Routinen mit den Namen Routinenname (paramtype1) und Routinenname (paramtype2), und Routinenname wird mit Routinenname (argtype) aufgerufen. Außerdem gibt es implizite Umwandlungen von argtype nach paramtype1 und argtype nach paramtype2. In diesem Fall wird dieser Fehler ausgelöst.
MTIhai
Peter, @MTIhai, wenn dies die Lösung wäre, können wir es dann auf eine Antwort verschieben?
Jcolebrand
0

Wenn Sie wissen, dass dies in Zukunft ein Problem sein könnte, können Sie Ihre Prozedur mit einem SPEZIFISCHEN Namen erstellen, der für alle Prozeduren in der Datenbank eindeutig sein muss.

Wenn Sie sich nicht bewusst sind, dass es beim Erstellen der Prozedur zu Problemen kommen wird, können Sie nicht offiziell zurückkehren und einen bestimmten Namen hinzufügen, und es liegt ein Problem vor.

Das UPDATE von sysproceduresin der ausgewählten Antwort sollte nur funktionieren, wenn der Benutzer verbunden ist informix(oder im Falle eines privaten Servers der Serverbesitzer).

Jonathan Leffler
quelle