Como excluir um procedimento cujo nome é ambíguo?

12

Estou usando o informix ...

Não sei como fiz isso, mas existem dois procedimentos com o mesmo nome no meu banco de dados. Quando tento removê-los com um

DROP PROCEDURE myProc;

então eu recebo uma mensagem de erro

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

Como posso descartar os procedimentos?

PeterP
fonte

Respostas:

13

Isso acontece quando você tem 2 ou mais procedimentos, com o mesmo nome, mas com números diferentes de parâmetros de entrada.

Por exemplo, você criou 2 procedimentos:

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

Para excluir o segundo, você tem 2 opções:

O mais fácil:

DROP PROCEDURE myProc(param1, param2);

O difícil:

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;

Mesmo que o primeiro método seja simples, na primeira vez em que fui chamado no meio da noite para esse mesmo problema, escolhi o segundo. Foi mal ...

MTIhai
fonte
Além disso, você pode usar o "finderr 9700" no seu console ssh para ver mais informações sobre esse tipo de erro. As informações costumam ser muito úteis: ... Esse problema ocorre quando um argumento (ou seu tipo de origem ou tipo pai) tem conversão implícita nos parâmetros de duas ou mais rotinas. Por exemplo, suponha que existam duas rotinas chamadas nome_da_ rotina (parâmetro_tipo1) e nome_da_ rotina (parâmetro_tipo2), e nome_da_ rotina seja chamado com nome_da_ rotina (tipo_de_ argila). Além disso, existem projeções implícitas de argtype para paramtype1 e argtype para paramtype2. Nesse caso, esse erro é gerado.
MTIhai
Peter, @MTIhai, se essa foi a solução, podemos movê-la para uma resposta?
jcolebrand
0

Se você está ciente de que isso pode ser um problema no futuro, é possível criar seu procedimento com um nome ESPECÍFICO, que deve ser exclusivo em todos os procedimentos no banco de dados.

Se você não souber que haverá um problema ao criar o procedimento, não será possível voltar oficialmente e adicionar um nome específico, e você tem um problema.

A ATUALIZAÇÃO de sysproceduresna resposta selecionada deve funcionar apenas se o usuário estiver conectado como informix(ou, no caso de um servidor privado, o proprietário do servidor).

Jonathan Leffler
fonte