Ajuda com Stored Procedure no IB 7.5
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?
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
Curtidas 0
Respostas
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
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
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?
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
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
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
31/01/2005
Ok, consegui criar a procedure:
Mas ao executa-la, não retorna absolutamente nada...
Sendo que existem consultas marcadas para 31/01/2005 no local ´J1´ que não foram atendidas, ´N´
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
31/01/2005
esquece
LOL
o banco estava vazio
LOL
o banco estava vazio
GOSTEI 0
Gandalf.nho
31/01/2005
esquece
LOL
o banco estava vazio
Sem problemas
GOSTEI 0
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)
);
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
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
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?
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
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
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
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