Ajuda com Stored Procedure (minha primeira!)
Galera,
Depois de muito ler e pesquisar (seja aqui no fórum, seja na Internet) consegui montar minha primeira stored procedure (sp). O problema é que ainda não consegui resolver tudo nela. O código dela é:
Como podem notar eu passo [b:c9b288aa5a]duas datas de parâmetro [/b:c9b288aa5a]e executo um [b:c9b288aa5a]WHILE [/b:c9b288aa5a]até a variável [b:c9b288aa5a]DATAMINHA[/b:c9b288aa5a], que inicialmente tem o valor de DATAINI, [b:c9b288aa5a]seja incrementada até a DATAFIM[/b:c9b288aa5a].
O problema é que quando executo isso no Firebird recebo a mensagem:
Como eu corrijo isso? Onde eu estou errando? Já li o link [url]http://community.borland.com/article/0,1410,27197,00.html[/url] (introdução a sp do Interbase) e mesmo assim não consegui descobrir o problema.
Alguma idéia?
Willian Lopes
Depois de muito ler e pesquisar (seja aqui no fórum, seja na Internet) consegui montar minha primeira stored procedure (sp). O problema é que ainda não consegui resolver tudo nela. O código dela é:
CREATE PROCEDURE GERA_FALTA ( DATAINI DATE, DATAFIM DATE ) AS DECLARE VARIABLE DATAMINHA DATE; BEGIN DATAMINHA = :DATAINI; WHILE (DATAMINHA <= :DATAFIM) DO BEGIN INSERT INTO TMP_FALTAS SELECT DISTINCT DATAMINHA AS DATA, HORARIO.MATRICULA FROM HORARIO WHERE HORARIO.MATRICULA NOT IN (SELECT MATRICULA FROM PRESENCA WHERE DATA = DATAMINHA) AND DIA = (EXTRACT(WEEKDAY FROM DATAMINHA)+1) ORDER BY HORARIO.MATRICULA; DATAMINHA = DATAMINHA + 1; SUSPEND; END END
Como podem notar eu passo [b:c9b288aa5a]duas datas de parâmetro [/b:c9b288aa5a]e executo um [b:c9b288aa5a]WHILE [/b:c9b288aa5a]até a variável [b:c9b288aa5a]DATAMINHA[/b:c9b288aa5a], que inicialmente tem o valor de DATAINI, [b:c9b288aa5a]seja incrementada até a DATAFIM[/b:c9b288aa5a].
O problema é que quando executo isso no Firebird recebo a mensagem:
Column does not belong to referenced table.Dynamic SQL Error. SQL error code = -206. Column unknown. DATAMINHA. At line 19, column 22.
Como eu corrijo isso? Onde eu estou errando? Já li o link [url]http://community.borland.com/article/0,1410,27197,00.html[/url] (introdução a sp do Interbase) e mesmo assim não consegui descobrir o problema.
Alguma idéia?
Willian Lopes
Willian
Curtidas 0
Respostas
Emerson Nascimento
28/03/2006
o correto é:
você havia deixado de colocar o ´:´ (dois pontos) em ´WHERE DATA = DATAMINHA´ (olhe o código acima).
o fato é que DATAMINHA se referencia a um campo, que não existe na tabela, e :DATAMINHA é um parâmetro, que vai utilizar o valor da sua variável.
CREATE PROCEDURE GERA_FALTA ( DATAINI DATE, DATAFIM DATE ) AS DECLARE VARIABLE DATAMINHA DATE; BEGIN DATAMINHA = :DATAINI; WHILE (DATAMINHA <= :DATAFIM) DO BEGIN INSERT INTO TMP_FALTAS SELECT DISTINCT DATAMINHA AS DATA, HORARIO.MATRICULA FROM HORARIO WHERE HORARIO.MATRICULA NOT IN (SELECT MATRICULA FROM PRESENCA WHERE DATA = :DATAMINHA) AND DIA = (EXTRACT(WEEKDAY FROM DATAMINHA)+1) ORDER BY HORARIO.MATRICULA; DATAMINHA = DATAMINHA + 1; SUSPEND; END END
você havia deixado de colocar o ´:´ (dois pontos) em ´WHERE DATA = DATAMINHA´ (olhe o código acima).
o fato é que DATAMINHA se referencia a um campo, que não existe na tabela, e :DATAMINHA é um parâmetro, que vai utilizar o valor da sua variável.
GOSTEI 0
Willian
28/03/2006
Obrigado pela ajuda, emerson.en.
Fiz a mudança sugerida, embora após ela ocorreram outros problemas que eu resolvi (baseado na sua dica) e consegui compilar, mas não consegui o resultado desejado, por isso fiz um novo post. Mas obrigado, sua dica foi muito útil.
Fiz a mudança sugerida, embora após ela ocorreram outros problemas que eu resolvi (baseado na sua dica) e consegui compilar, mas não consegui o resultado desejado, por isso fiz um novo post. Mas obrigado, sua dica foi muito útil.
GOSTEI 0