Как удалить процедуру, имя которой неоднозначно?

12

Я использую informix ...

Я не знаю, как я это сделал, но в моей базе данных есть две процедуры с одинаковыми именами. Когда я пытаюсь удалить их с

DROP PROCEDURE myProc;

тогда я получаю сообщение об ошибке

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

Как я могу бросить процедуры?

PeterP
источник

Ответы:

13

Это происходит, когда у вас есть 2 или более процедур с одинаковым именем, но с разным количеством входных параметров.

Например, вы создали 2 процедуры:

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

Чтобы удалить второй, у вас есть 2 варианта:

Самый простой:

DROP PROCEDURE myProc(param1, param2);

Сложный:

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;

Даже если первый метод очень прост, в первый раз, когда меня вызвали посреди ночи из-за этой же проблемы, я выбрал второй. Виноват ...

MTIhai
источник
Кроме того, вы можете использовать «finderr 9700» в вашей консоли SSH, чтобы увидеть больше информации об этом виде ошибок. Информация часто очень полезна: ... Эта проблема возникает, когда аргумент (или его тип источника или родительский тип) имеет неявное приведение к параметрам двух или более подпрограмм. Например, предположим, что существуют две подпрограммы, называемые имя-подпрограммы (paramtype1) и имя-подпрограммы (paramtype2), а имя-подпрограммы вызывается с именем подпрограммы (argtype). Кроме того, существует неявное приведение типов от argtype к paramtype1 и от argtype к paramtype2. В этом случае эта ошибка возникает.
MTIhai
Питер, @ MTIhai, если это было решением, мы можем переместить его в ответ?
Jcolebrand
0

Если вы знаете, что это может стать проблемой в будущем, вы можете создать свою процедуру с КОНКРЕТНЫМ именем, которое должно быть уникальным для всех процедур в базе данных.

Если вы не знаете, что при создании процедуры возникнет проблема, вы не сможете официально вернуться и добавить определенное имя, и у вас возникнет проблема.

ОБНОВЛЕНИЕ sysproceduresв выбранном ответе должно работать, только если пользователь подключен как informix(или, в случае частного сервера, владелец сервера).

Джонатан Леффлер
источник