Erro PLS-00306 ao chamar o cursor
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.
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