Fórum Ajuda com store procedure usando firebird #383148
09/08/2010
0
Olá pessoal,
estou tentando criar um SP onde o SELECT depende de um valor passado por parâmetro.
Tenho as seguintes tabelas:
#Código
Compromisso(idCompromisso, data, texto)
PessoaFisica(idPessoaFisica, nome)
PessoaJuridica(idPessoaJuridica, nome)
PessoaCompromisso(idCompromisso, tipoPessoa, idPessoa)
A tabela PessoaCompromisso faz a ligação de compromissos a pessoas fisicas(tipoPessoa = 0) ou pessoas juridicas(tipPessoa = 1).
Preciso de um SQL que funcione da seguinte forma:
Quando eu tiver pesquisando por nome ele retorne apenas os compromissos que estão vinculados as pessoas quu tenha esse nome.
Quando eu tiver pesquisando por data que retorne todos os compormissos de acordo com a data independente dos mesmos estarem vinculados a pessoas ou não.
Estou tentando criar uma SP para fazer isso conforme abaixo:
#Código
DROP PROCEDURE "RETORNACOMPROMISSOS";
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;
/* Stored procedures */
CREATE PROCEDURE "RETORNACOMPROMISSOS"
(
"TIPO_PESSOA_PF" INTEGER,
"TIPO_PESSOA_PJ" INTEGER,
"TIPO_PESSOA_C_PJ" INTEGER,
"TEXTO_" VARCHAR(100) CHARACTER SET WIN1252,
"NOME" VARCHAR(100) CHARACTER SET WIN1252,
"DATA_01" DATE,
"DATA_02" DATE,
"C_LOGIN" VARCHAR(10) CHARACTER SET WIN1252,
"OPCAO_01" INTEGER,
"OPCAO_02" INTEGER,
"OPCAO_03" INTEGER
)
RETURNS
(
"IDENTIFICADOR" INTEGER,
"DATA" DATE,
"HORA" TIME,
"TEXTO" VARCHAR(30000) CHARACTER SET WIN1252,
"OPCAO" INTEGER,
"PUBLICO" INTEGER,
"LOGIN" VARCHAR(10) CHARACTER SET WIN1252,
"QUEM" VARCHAR(10) CHARACTER SET WIN1252
)
AS
BEGIN
FOR
SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C
WHERE C.IDENTIFICADOR NOT IN (SELECT ID_COMPROMISSO FROM PESS0A_COMPROMISSO)
AND C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN = :C_LOGIN AND TEXTO CONTAINING :TEXTO_
UNION ALL
SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C
LEFT JOIN PESS0A_COMPROMISSO PC ON C.IDENTIFICADOR = PC.ID_COMPROMISSO
LEFT JOIN PESSOAFISICA PF ON PC.ID_PESSOA = PF.IDENTIFICADOR
WHERE PC.TIPO_PESSOA = :TIPO_PESSOA_PF AND C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN = :C_LOGIN AND TEXTO CONTAINING :TEXTO_ and PF.NOME CONTAINING :NOME
UNION ALL
SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C
INNER JOIN PESS0A_COMPROMISSO PC ON C.IDENTIFICADOR = PC.ID_COMPROMISSO
INNER JOIN PESSOAJURIDICA PJ ON PC.ID_PESSOA = PJ.IDENTIFICADOR
WHERE PC.TIPO_PESSOA = :TIPO_PESSOA_PJ AND C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN = :C_LOGIN AND TEXTO CONTAINING :TEXTO_ and PJ.NOME CONTAINING :NOME
UNION ALL
SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C
INNER JOIN PESS0A_COMPROMISSO PC ON C.IDENTIFICADOR = PC.ID_COMPROMISSO
INNER JOIN CONTATO_PJ C_PJ ON PC.ID_PESSOA = C_PJ.IDENTIFICADOR
WHERE PC.TIPO_PESSOA = :TIPO_PESSOA_C_PJ AND C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN = :C_LOGIN AND TEXTO CONTAINING :TEXTO_ and C_PJ.NOME CONTAINING :NOME
INTO :IDENTIFICADOR, :DATA, :HORA, :TEXTO, :OPCAO, :PUBLICO, :LOGIN, :QUEM
DO
SUSPEND;
END
^
SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;
Gostaria de deixar o primeiro SELECT vinculado ao parâmetro de entrada NOME. Caso ele fosse diferente de NULL que o mesmo fosse executado do contrário que ele não fosse executado.
#Código
IF (:NOME NOT IS NULL) THEN
BEGIN
SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C
WHERE C.IDENTIFICADOR NOT IN (SELECT ID_COMPROMISSO FROM PESS0A_COMPROMISSO)
AND C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN = :C_LOGIN AND TEXTO CONTAINING :TEXTO_
UNION ALL
END
Ao tentar executar com essa alteração recebo a mensagem:
Token unknown - line 29, column 1 IF
O que estou fazendo de errado?
estou tentando criar um SP onde o SELECT depende de um valor passado por parâmetro.
Tenho as seguintes tabelas:
#Código
Compromisso(idCompromisso, data, texto)
PessoaFisica(idPessoaFisica, nome)
PessoaJuridica(idPessoaJuridica, nome)
PessoaCompromisso(idCompromisso, tipoPessoa, idPessoa)
A tabela PessoaCompromisso faz a ligação de compromissos a pessoas fisicas(tipoPessoa = 0) ou pessoas juridicas(tipPessoa = 1).
Preciso de um SQL que funcione da seguinte forma:
Quando eu tiver pesquisando por nome ele retorne apenas os compromissos que estão vinculados as pessoas quu tenha esse nome.
Quando eu tiver pesquisando por data que retorne todos os compormissos de acordo com a data independente dos mesmos estarem vinculados a pessoas ou não.
Estou tentando criar uma SP para fazer isso conforme abaixo:
#Código
DROP PROCEDURE "RETORNACOMPROMISSOS";
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;
/* Stored procedures */
CREATE PROCEDURE "RETORNACOMPROMISSOS"
(
"TIPO_PESSOA_PF" INTEGER,
"TIPO_PESSOA_PJ" INTEGER,
"TIPO_PESSOA_C_PJ" INTEGER,
"TEXTO_" VARCHAR(100) CHARACTER SET WIN1252,
"NOME" VARCHAR(100) CHARACTER SET WIN1252,
"DATA_01" DATE,
"DATA_02" DATE,
"C_LOGIN" VARCHAR(10) CHARACTER SET WIN1252,
"OPCAO_01" INTEGER,
"OPCAO_02" INTEGER,
"OPCAO_03" INTEGER
)
RETURNS
(
"IDENTIFICADOR" INTEGER,
"DATA" DATE,
"HORA" TIME,
"TEXTO" VARCHAR(30000) CHARACTER SET WIN1252,
"OPCAO" INTEGER,
"PUBLICO" INTEGER,
"LOGIN" VARCHAR(10) CHARACTER SET WIN1252,
"QUEM" VARCHAR(10) CHARACTER SET WIN1252
)
AS
BEGIN
FOR
SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C
WHERE C.IDENTIFICADOR NOT IN (SELECT ID_COMPROMISSO FROM PESS0A_COMPROMISSO)
AND C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN = :C_LOGIN AND TEXTO CONTAINING :TEXTO_
UNION ALL
SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C
LEFT JOIN PESS0A_COMPROMISSO PC ON C.IDENTIFICADOR = PC.ID_COMPROMISSO
LEFT JOIN PESSOAFISICA PF ON PC.ID_PESSOA = PF.IDENTIFICADOR
WHERE PC.TIPO_PESSOA = :TIPO_PESSOA_PF AND C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN = :C_LOGIN AND TEXTO CONTAINING :TEXTO_ and PF.NOME CONTAINING :NOME
UNION ALL
SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C
INNER JOIN PESS0A_COMPROMISSO PC ON C.IDENTIFICADOR = PC.ID_COMPROMISSO
INNER JOIN PESSOAJURIDICA PJ ON PC.ID_PESSOA = PJ.IDENTIFICADOR
WHERE PC.TIPO_PESSOA = :TIPO_PESSOA_PJ AND C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN = :C_LOGIN AND TEXTO CONTAINING :TEXTO_ and PJ.NOME CONTAINING :NOME
UNION ALL
SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C
INNER JOIN PESS0A_COMPROMISSO PC ON C.IDENTIFICADOR = PC.ID_COMPROMISSO
INNER JOIN CONTATO_PJ C_PJ ON PC.ID_PESSOA = C_PJ.IDENTIFICADOR
WHERE PC.TIPO_PESSOA = :TIPO_PESSOA_C_PJ AND C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN = :C_LOGIN AND TEXTO CONTAINING :TEXTO_ and C_PJ.NOME CONTAINING :NOME
INTO :IDENTIFICADOR, :DATA, :HORA, :TEXTO, :OPCAO, :PUBLICO, :LOGIN, :QUEM
DO
SUSPEND;
END
^
SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;
Gostaria de deixar o primeiro SELECT vinculado ao parâmetro de entrada NOME. Caso ele fosse diferente de NULL que o mesmo fosse executado do contrário que ele não fosse executado.
#Código
IF (:NOME NOT IS NULL) THEN
BEGIN
SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C
WHERE C.IDENTIFICADOR NOT IN (SELECT ID_COMPROMISSO FROM PESS0A_COMPROMISSO)
AND C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN = :C_LOGIN AND TEXTO CONTAINING :TEXTO_
UNION ALL
END
Ao tentar executar com essa alteração recebo a mensagem:
Token unknown - line 29, column 1 IF
O que estou fazendo de errado?
Carlos Phelippe
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)