Pergunta

Acho que posso estar faltando alguma coisa aqui.Aqui está a parte relevante do gatilho:

CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName;
/* Removed for brevity */
OPEN columnNames('TEMP');

E aqui está a mensagem de erro que estou recebendo,

27/20   PLS-00306: wrong number or types of arguments in call to 'COLUMNNAMES'
27/2    PL/SQL: Statement ignored

Se estou entendendo a documentação corretamente, isso deve funcionar, mas como não está, devo estar fazendo algo errado.Alguma ideia?


@Mateus - Agradeço a ajuda, mas estou confuso porque esse trecho de código não está funcionando para mim e está gerando os erros referenciados.Temos outros gatilhos no banco de dados com código quase exatamente igual a esse, então não tenho certeza se foi algo que fiz de errado ou algo relacionado a como estou tentando armazenar o gatilho, etc.


@Mateus - Bem, agora estou me sentindo envergonhado.Copiei/colei o código que você forneceu em um novo gatilho e funcionou bem.Então voltei ao gatilho original e tentei e recebi a mensagem de erro novamente, só que desta vez comecei a deletar coisas do gatilho e depois de me livrar dessa linha,

FOR columnName IN columnNames LOOP

As coisas foram salvas bem.Acontece que onde eu pensei que estava o erro, na verdade não era onde o erro estava.

Foi útil?

Solução

@Roubar

Se você recortar/colar o código que tenho aqui, funciona?

Como/onde você está chamando seu código?está em um gatilho, não é?

A consulta que você escreveu aqui é realmente o código que produz o erro, ou apenas um exemplo (por exemplo, você pode reproduzir o erro com a consulta acima)

Outras dicas

Para esclarecer a causa do problema.Como você afirma

OPEN columnNames('TEMP');

trabalhou enquanto

FOR nomecoluna IN nomecoluna LOOP

nao fiz.A instrução FOR funcionaria bem se também incluísse o parâmetro assim:

FOR nomedacoluna IN nomedacoluna('TEMP') LOOP

Você não mostra o código onde busca as linhas, então não posso dizer seu propósito, mas onde trabalho OPEN é comumente usado para buscar a primeira linha (neste caso, o nome da primeira coluna da tabela fornecida) enquanto o FOR é usado para iterar por todas as linhas retornadas.

Comentário de @Rob.Não tenho permissão para comentar, então atualizo aqui.O parâmetro que falta é o que descrevo acima.Você adicionou uma resposta informando que simplesmente excluiu o loop FOR.Na época, não parecia que você entendia por que excluí-lo fazia diferença.É por isso que tentei explicar, pois, dependendo da sua necessidade, o loop FOR pode ser uma solução melhor.

Funciona bem para mim.

create or replace procedure so_test_procedure as 
 CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName; 
BEGIN      
 OPEN columnNames('TEMP');
 CLOSE columnNames;
END;

procedure so_test_procedure Compiled.
execute so_test_procedure();

anonymous block completed
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top