Ajuda com Stored Procedure no IB 7.5

Firebird

31/01/2005

Olá pessoal do forum,

Andei vendo a documentação, procurei na internet, fiz a sintaxe exatamente como está, mas não consigo criar uma SP no IB7. Em Postgresql 7.4 ela existe e funciona direitinho (claro, não com a mesma sintaxe). É um sistema de agendamento de consultas que tenho em D7 e Postgresql que quero coloca-lo tambem em IB.

Tabela: Agendamento

CREATE TABLE AGENDA
(
COD_DENTVARCHAR(8) NOT NULL,
COD_ESPVARCHAR(4) NOT NULL,
DATACONSTIMESTAMP NOT NULL,
HORA VARCHAR(5) NOT NULL,
COD_LOCALVARCHAR(5) NOT NULL,
CODPLANVARCHAR(5) NOT NULL,
CODEMP VARCHAR(6) NOT NULL,
CONVENIOVARCHAR(25),
NUM VARCHAR(20),
NOME VARCHAR(30),
ATENDIDOVARCHAR(1),
AMB VARCHAR(11),
TELEFONEVARCHAR(15),
RETORNOVARCHAR(1),
QTDE INTEGER,
LOGIN VARCHAR(15),
TEMPO INTEGER,
CONSTRAINT CHAVE_AGENDA PRIMARY KEY (COD_DENT, COD_ESP, DATACONS, HORA, COD_LOCAL)
);

Function no PostgreSQL:

CREATE FUNCTION agendamento(timestamp, varchar, varchar) RETURNS agenda AS ´SELECT * FROM agenda
WHERE (DATACONS = $1) And (COD_LOCAL = $2) AND (Atendido = $3);´ LANGUAGE ´sql´ VOLATILE;

Ela funciona belezinha no PostgreSQL. Fui tentar criar uma SP no IB7 com o seguinte comando:

CREATE PROCEDURE agendamento(data1 timestamp, local varchar(5), atend varchar(1))
RETURNS (cod_dent varchar(8),cod_esp varchar(4),datacons timestamp,hora varchar(5), cod_local varchar(5),codplan varchar(5),codemp varchar(6),convenio varchar(25),num varchar(20),nome varchar(30),atendido varchar(1),amb varchar(11),telefone varchar(15), retorno varchar(1),qtde integer,login varchar(15),tempo integer)
AS
BEGIN
SELECT *
FROM agenda
WHERE DATACONS = :data1) and COD_LOCAL = :local and Atendido = :atend;
EXIT;
END;


obs: onde está o smile é o número OITO + PARENTESES

Dá o seguinte erro: Linha 7 caracter 28

Que é justamente o ponto-vírgula. retirando-o continua dando erro.

O que pode estar errado?


Danilo_zanaga

Danilo_zanaga

Curtidas 0

Respostas

Gandalf.nho

Gandalf.nho

31/01/2005

A sintaxe de uma SP selecionável usa o FOR... SELECT, assim:

SET TERM ^;
CREATE PROCEDURE agendamento(data1 timestamp, local varchar(5), atend varchar(1)) 
RETURNS (cod_dent varchar(,cod_esp varchar(4),datacons timestamp,hora varchar(5), cod_local varchar(5),codplan varchar(5),codemp varchar(6),convenio varchar(25),num varchar(20),nome varchar(30),atendido varchar(1),amb varchar(11),telefone varchar(15), retorno varchar(1),qtde integer,login varchar(15),tempo integer) 
AS 
BEGIN 
FOR SELECT lista_campos FROM agenda 
WHERE DATACONS = :data1 AND COD_LOCAL = :local AND Atendido= :atend INTO lista_variaveis DO
   SUSPEND;
END ^
SET TERM ;^



GOSTEI 0
Danilo_zanaga

Danilo_zanaga

31/01/2005

Obrigado, vou testar. Engraçado que na internet não há nada sobre SET TERM, nos exemplos que vi.


GOSTEI 0
Danilo_zanaga

Danilo_zanaga

31/01/2005

Coloquei assim:

SET TERM ^;
CREATE PROCEDURE agendamento(data1 timestamp, local varchar(5), atend varchar(1))
RETURNS (cod_dent varchar(8),cod_esp varchar(4),datacons timestamp,hora varchar(5), cod_local varchar(5),codplan varchar(5),codemp varchar(6),convenio varchar(25),num varchar(20),nome varchar(30),atendido varchar(1),amb varchar(11),telefone varchar(15), retorno varchar(1),qtde integer,login varchar(15),tempo integer)
AS
BEGIN
FOR SELECT cod_dent,cod_esp,datacons,hora,cod_local,codplan,codemp,convenio,num,nome,atendido,amb,telefone,retorno,qtde,login,tempo FROM agenda
WHERE DATACONS = :data1 AND COD_LOCAL = :local AND Atendido= :atend INTO :data1,:local,:atend DO
SUSPEND;
END ^
SET TERM ;^

Deu o seguinte erro:

count of column list and variable list don´t match

Creio que seja sobre o numero de variaveis e numero de colunas nao bate. Como resolvo?


GOSTEI 0
Martins

Martins

31/01/2005

SET TERM ^; 
CREATE PROCEDURE agendamento(data1 timestamp, local varchar(5), atend varchar(1)) 
RETURNS (cod_dent varchar(,cod_esp varchar(4),datacons timestamp,hora varchar(5), cod_local varchar(5),codplan varchar(5),codemp varchar(6),convenio varchar(25),num varchar(20),nome varchar(30),atendido varchar(1),amb varchar(11),telefone varchar(15), retorno varchar(1),qtde integer,login varchar(15),tempo integer) 
AS 
BEGIN 
FOR SELECT lista_campos FROM agenda 
WHERE DATACONS = :data1 AND COD_LOCAL = :local AND Atendido= :atend INTO lista_variaveis DO 
   SUSPEND; 
END ^ 
SET TERM ;^


SET TERM indica o terminador que por padrão é (;) e é mudado para (^) e depois retorna para o default, ele apareceu aí por ter sido copiado do Ib-Expert ou IBConsole.

Espero q possa ajudar


GOSTEI 0
Gandalf.nho

Gandalf.nho

31/01/2005

Coloquei assim: SET TERM ^; CREATE PROCEDURE agendamento(data1 timestamp, local varchar(5), atend varchar(1)) RETURNS (cod_dent varchar(8),cod_esp varchar(4),datacons timestamp,hora varchar(5), cod_local varchar(5),codplan varchar(5),codemp varchar(6),convenio varchar(25),num varchar(20),nome varchar(30),atendido varchar(1),amb varchar(11),telefone varchar(15), retorno varchar(1),qtde integer,login varchar(15),tempo integer) AS BEGIN FOR SELECT cod_dent,cod_esp,datacons,hora,cod_local,codplan,codemp,convenio,num,nome,atendido,amb,telefone,retorno,qtde,login,tempo FROM agenda WHERE DATACONS = :data1 AND COD_LOCAL = :local AND Atendido= :atend INTO :data1,:local,:atend DO SUSPEND; END ^ SET TERM ;^ Deu o seguinte erro: count of column list and variable list don´t match Creio que seja sobre o numero de variaveis e numero de colunas nao bate. Como resolvo?


O nº e tipo de dados dos campos na cláusula SELECT deve coincidir com o nº e tipo de dados das variáveis na cláusula INTO


GOSTEI 0
Danilo_zanaga

Danilo_zanaga

31/01/2005

Ok, consegui criar a procedure:

Código: SET TERM ^; CREATE PROCEDURE agendamento(data1 timestamp, local varchar(5), atend varchar(1)) RETURNS (cod_dent varchar(8),cod_esp varchar(4),datacons timestamp,hora varchar(5), cod_local varchar(5),codplan varchar(5),codemp varchar(6),convenio varchar(25),num varchar(20),nome varchar(30),atendido varchar(1),amb varchar(11),telefone varchar(15), retorno varchar(1),qtde integer,login varchar(15),tempo integer) AS BEGIN FOR SELECT datacons,cod_local,atendido FROM agenda WHERE DATACONS = :data1 AND COD_LOCAL = :local AND Atendido= :atend INTO :data1,:local,:atend DO SUSPEND; END ^ SET TERM ;^


Mas ao executa-la, não retorna absolutamente nada...

Código: select * from agendamento(´01/31/2005´,´J1´,´N´);


Sendo que existem consultas marcadas para 31/01/2005 no local ´J1´ que não foram atendidas, ´N´


GOSTEI 0
Danilo_zanaga

Danilo_zanaga

31/01/2005

esquece

LOL

o banco estava vazio


GOSTEI 0
Gandalf.nho

Gandalf.nho

31/01/2005

esquece LOL o banco estava vazio


Sem problemas


GOSTEI 0
Danilo_zanaga

Danilo_zanaga

31/01/2005

É...realmente não deu. Não retornou nenhum registro. O que eu quero como resultado são todas as consultas de uma data/local/atendimento, exemplo (´01/02/2005´,´L1´,´N´).

Function no PostgreSQL:

CREATE FUNCTION agendamento(timestamp, varchar, varchar) RETURNS agenda AS ´SELECT * FROM agenda
WHERE (DATACONS = $1) And (COD_LOCAL = $2) AND (Atendido = $3);´ LANGUAGE ´sql´ VOLATILE;

No IB retorna os registros que quero, mas nulos.

Gostaria que alguem desse uma ajuda para a SP em IB.

Tabela Agenda:

CREATE TABLE AGENDA
(
COD_DENTVARCHAR(8) NOT NULL,
COD_ESPVARCHAR(4) NOT NULL,
DATACONSTIMESTAMP NOT NULL,
HORAVARCHAR(5) NOT NULL,
COD_LOCALVARCHAR(5) NOT NULL,
CODPLANVARCHAR(5) NOT NULL,
CODEMPVARCHAR(6) NOT NULL,
CONVENIOVARCHAR(25),
NUMVARCHAR(20),
NOMEVARCHAR(30),
ATENDIDOVARCHAR(1),
AMBVARCHAR(11),
TELEFONEVARCHAR(15),
RETORNOVARCHAR(1),
QTDEINTEGER,
LOGINVARCHAR(15),
TEMPOINTEGER,
CONSTRAINT CHAVE_AGENDA PRIMARY KEY (COD_DENT, COD_ESP, DATACONS, HORA, COD_LOCAL)
);


GOSTEI 0
Gandalf.nho

Gandalf.nho

31/01/2005

Eu notei que você declarou o campo DATACONS como Timestamp, acho que o problema está aí pq esse tipo de dados armazena data e hora e você passa só a data pra função, como existe a hora junto ele nunca vai achar. Tente recriar o campo como Date ou use um cast na procedure para transformar o campo em Date na cláusula WHERE


GOSTEI 0
Danilo_zanaga

Danilo_zanaga

31/01/2005

Ok, entendi. Note bem que se eu uso a seguinte busca:

select * from agenda where datacons=´02/01/2005´;

01 de fevereiro, diga-se. Retorna os registros normalmente.

portanto, de uso

select * from agendamento(´02/01/2005´,´J1´,´N´);

deveria funcionar, não concorda?


GOSTEI 0
Gandalf.nho

Gandalf.nho

31/01/2005

Você já conferiu se realmente existe algum registro que obedeça aos 3 critérios? Tente executar a query dentro da procedure separadamente passando os mesmos valores.


GOSTEI 0
Danilo_zanaga

Danilo_zanaga

31/01/2005

Resolvido.

Código: SET TERM ^; CREATE PROCEDURE agendamento(data1 timestamp, local varchar(5), atend varchar(1)) RETURNS (cod_dent varchar(8),cod_esp varchar(4),datacons timestamp,hora varchar(5), cod_local varchar(5),codplan varchar(5),codemp varchar(6),convenio varchar(25),num varchar(20),nome varchar(30),atendido varchar(1),amb varchar(11),telefone varchar(15), retorno varchar(1),qtde integer,login varchar(15),tempo integer) AS BEGIN FOR SELECT cod_dent,cod_esp,datacons,hora,cod_local,codplan,codemp,convenio,num,nome,atendido,amb,telefone,retorno,qtde,login,tempo FROM agenda WHERE DATACONS = :data1 AND COD_LOCAL = :local AND Atendido= :atend INTO :cod_dent,:cod_esp,:datacons,:hora,:cod_local,:codplan,:codemp,:convenio,:num,:nome,:atendido,:amb,:telefone,:retorno,:qtde,:login,:tempo DO SUSPEND; END ^ SET TERM ;^



GOSTEI 0
Gandalf.nho

Gandalf.nho

31/01/2005

Não tinha me dado conta, você não estava atribuindo valor a todos os parâmetros de retorno, embora deveria retornar os registros, apenas com alguns campos em branco.


GOSTEI 0
POSTAR