colocar função if em meio a uma stored procedure...

Firebird

19/06/2006

CREATE PROCEDURE MEMBROSDIZIMOS_RELATORIO2 (
CODIGREJA_IN INTEGER,
CODMEMBRO_IN INTEGER,
ANO_IN INTEGER)
RETURNS (
NOME_MEMBROS VARCHAR(50),
NOME_IGREJAS VARCHAR(50),
DATA DATE,
CODIGO INTEGER,
CODIGREJA INTEGER,
CODMEMBRO INTEGER,
DT_INSCRICAO DATE,
DT_ALTERACAO DATE,
VALOR NUMERIC(15,2),
CODTIPOSPAGAMENTOS INTEGER,
OBSERVACOES VARCHAR(50),
CHQ_BANCO VARCHAR(3),
CHQ_AGENCIA VARCHAR(5),
CHQ_NUMERO VARCHAR(10),
CHQ_CONTACORRENTE VARCHAR(10),
CAR_NUMERO VARCHAR(10),
TIPO_TIPOSPAGAMENTOS VARCHAR(30),
CHEQUE_TIPOSPAGAMENTOS CHAR(1),
CARTAO_TIPOSPAGAMENTOS CHAR(1))
AS
BEGIN
FOR SELECT MD.CODIGO,
MD.CODIGREJA,
MD.CODMEMBRO,
MD.DT_INSCRICAO,
MD.DT_ALTERACAO,
MD.DATA,
MD.VALOR,
MD.CODTIPOSPAGAMENTOS,
MD.OBSERVACOES,
MD.CHQ_BANCO,
MD.CHQ_AGENCIA,
MD.CHQ_NUMERO,
MD.CHQ_CONTACORRENTE,
MD.CAR_NUMERO,
TP.TIPO AS TIPO_TIPOSPAGAMENTOS,
TP.CHEQUE AS CHEQUE_TIPOSPAGAMENTOS,
TP.CARTAO AS CARTAO_TIPOSPAGAMENTOS,
M.NOME AS NOME_MEMBROS,
I.NOME AS NOME_IGREJAS
FROM MEMBROSDIZIMOS MD
INNER JOIN IGREJAS I ON (MD.CODIGREJA = I.CODIGO)
INNER JOIN MEMBROS M ON (MD.CODMEMBRO = M.CODIGO)
LEFT OUTER JOIN TIPOSPAGAMENTOS TP ON (MD.CODTIPOSPAGAMENTOS = TP.CODIGO)
WHERE (MD.CODIGREJA = :CODIGREJA_IN)
AND (extract(year from MD.DATA) = :ANO_IN)
ORDER BY I.NOME, M.NOME,
extract(year from MD.DATA) ASC,
extract(month from MD.DATA) ASC,
extract(day from MD.DATA) ASC
INTO :CODIGO,
:CODIGREJA,
:CODMEMBRO,
:DT_INSCRICAO,
:DT_ALTERACAO,
:DATA,
:VALOR,
:CODTIPOSPAGAMENTOS,
:OBSERVACOES,
:CHQ_BANCO,
:CHQ_AGENCIA,
:CHQ_NUMERO,
:CHQ_CONTACORRENTE,
:CAR_NUMERO,
:TIPO_TIPOSPAGAMENTOS,
:CHEQUE_TIPOSPAGAMENTOS,
:CARTAO_TIPOSPAGAMENTOS,
:NOME_MEMBROS,
:NOME_IGREJAS
DO
BEGIN
SUSPEND;
END



Eu gostaria de fazer um stored procedure do tipo personalizada, tipo:

Eu criar um novo parametro de entrada chamado ´CODMEMBRO_IN´
o que eu gostaria de fazer é o seguinte:
Na cláusula ´WHERE´ colocar tipo:

IF CODMEMBRO_IN IS NOT NULL THEN
AND (MD.CODMEMBRO = :CODMEMBRO_IN);


Thiagopedro

Thiagopedro

Curtidas 0

Respostas

Acacio

Acacio

19/06/2006

É só colocar entre parenteses, e coloca os dois pontos como coloquei.

IF (:CODMEMBRO_IN IS NOT NULL) THEN


GOSTEI 0
Thiagopedro

Thiagopedro

19/06/2006

É só colocar entre parenteses, e coloca os dois pontos como coloquei. IF (:CODMEMBRO_IN IS NOT NULL) THEN



Amigo já tentei fazer assim também como vc disse.
Estou postando abaixo o código completo que tentei colocar na stored procedure no IBExpert.

Notem que apenas há alteração na clause ´IF´ adicionada em relação ao primeiro exemplo da minha dúvida.


BEGIN
FOR SELECT MD.CODIGO,
MD.CODIGREJA,
MD.CODMEMBRO,
MD.DT_INSCRICAO,
MD.DT_ALTERACAO,
MD.DATA,
MD.VALOR,
MD.CODTIPOSPAGAMENTOS,
MD.OBSERVACOES,
MD.CHQ_BANCO,
MD.CHQ_AGENCIA,
MD.CHQ_NUMERO,
MD.CHQ_CONTACORRENTE,
MD.CAR_NUMERO,
TP.TIPO AS TIPO_TIPOSPAGAMENTOS,
TP.CHEQUE AS CHEQUE_TIPOSPAGAMENTOS,
TP.CARTAO AS CARTAO_TIPOSPAGAMENTOS,
M.NOME AS NOME_MEMBROS,
I.NOME AS NOME_IGREJAS
FROM MEMBROSDIZIMOS MD
INNER JOIN IGREJAS I ON (MD.CODIGREJA = I.CODIGO)
INNER JOIN MEMBROS M ON (MD.CODMEMBRO = M.CODIGO)
LEFT OUTER JOIN TIPOSPAGAMENTOS TP ON (MD.CODTIPOSPAGAMENTOS = TP.CODIGO)
WHERE (MD.CODIGREJA = :CODIGREJA_IN) AND (extract(year from MD.DATA) = :ANO_IN)
IF (:CODMEMBRO_IN IS NOT NULL) THEN
AND (MD.CODMEMBRO = :CODMEMBRO_IN)
ORDER BY I.NOME, M.NOME,
extract(year from MD.DATA) ASC,
extract(month from MD.DATA) ASC,
extract(day from MD.DATA) ASC
INTO :CODIGO,
:CODIGREJA,
:CODMEMBRO,
:DT_INSCRICAO,
:DT_ALTERACAO,
:DATA,
:VALOR,
:CODTIPOSPAGAMENTOS,
:OBSERVACOES,
:CHQ_BANCO,
:CHQ_AGENCIA,
:CHQ_NUMERO,
:CHQ_CONTACORRENTE,
:CAR_NUMERO,
:TIPO_TIPOSPAGAMENTOS,
:CHEQUE_TIPOSPAGAMENTOS,
:CARTAO_TIPOSPAGAMENTOS,
:NOME_MEMBROS,
:NOME_IGREJAS
DO
BEGIN
SUSPEND;
END
END


Quando tento compilar no IBExpert dá o seguinte erro:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 51, column 7.
IF.


GOSTEI 0
Acacio

Acacio

19/06/2006

Jogue todo o teu sql até antes do where numa string
e depois use como no exemplo

-----------------------------------------
declare variable scripty varchar(1000);
begin

scripty = ´select codcli,nomcli,data from tabcliente´ ||
if (:varaux = ´1´) then
´where codcli = ´ || varentr1
else
if (:varaux = ´2´) then
´where codcli = ´ || varentr2


for execute statement scripty do
into :codigo,:nome:data1;
begin
suspend;
end


GOSTEI 0
Thiagopedro

Thiagopedro

19/06/2006

Corrigi conforme você disse e ficou assim:

===============

ALTER PROCEDURE MEMBROSDIZIMOS_RELATORIO2 (
CODIGREJA_IN INTEGER,
ANO_IN INTEGER)
RETURNS (
NOME_MEMBROS VARCHAR(50),
NOME_IGREJAS VARCHAR(50),
DATA DATE,
CODIGO INTEGER,
CODIGREJA INTEGER,
CODMEMBRO INTEGER,
DT_INSCRICAO DATE,
DT_ALTERACAO DATE,
VALOR NUMERIC(15,2),
CODTIPOSPAGAMENTOS INTEGER,
OBSERVACOES VARCHAR(50),
CHQ_BANCO VARCHAR(3),
CHQ_AGENCIA VARCHAR(5),
CHQ_NUMERO VARCHAR(10),
CHQ_CONTACORRENTE VARCHAR(10),
CAR_NUMERO VARCHAR(10),
TIPO_TIPOSPAGAMENTOS VARCHAR(30),
CHEQUE_TIPOSPAGAMENTOS CHAR(1),
CARTAO_TIPOSPAGAMENTOS CHAR(1),
ANO INTEGER,
MES INTEGER,
DIA INTEGER)
AS
DECLARE VARIABLE SCRIPTY VARCHAR(1000);
BEGIN
scripty = ´
SELECT MD.CODIGO,
MD.CODIGREJA,
MD.CODMEMBRO,
MD.DT_INSCRICAO,
MD.DT_ALTERACAO,
MD.DATA,
MD.VALOR,
MD.CODTIPOSPAGAMENTOS,
MD.OBSERVACOES,
MD.CHQ_BANCO,
MD.CHQ_AGENCIA,
MD.CHQ_NUMERO,
MD.CHQ_CONTACORRENTE,
MD.CAR_NUMERO,
TP.TIPO AS TIPO_TIPOSPAGAMENTOS,
TP.CHEQUE AS CHEQUE_TIPOSPAGAMENTOS,
TP.CARTAO AS CARTAO_TIPOSPAGAMENTOS,
M.NOME AS NOME_MEMBROS,
I.NOME AS NOME_IGREJAS,
extract(year from MD.DATA) AS ANO,
extract(month from MD.DATA) AS MES,
extract(day from MD.DATA) AS DIA
FROM MEMBROSDIZIMOS MD
INNER JOIN IGREJAS I ON (MD.CODIGREJA = I.CODIGO)
INNER JOIN MEMBROS M ON (MD.CODMEMBRO = M.CODIGO)
LEFT OUTER JOIN TIPOSPAGAMENTOS TP ON (MD.CODTIPOSPAGAMENTOS = TP.CODIGO)
WHERE (MD.CODIGREJA = :CODIGREJA_IN)
AND (extract(year from MD.DATA) = :ANO_IN)
ORDER BY I.NOME,
extract(year from MD.DATA) ASC,
extract(month from MD.DATA) ASC,
extract(day from MD.DATA) ASC,
M.NOME ´ ;

for execute statement scripty do

INTO :CODIGO,
:CODIGREJA,
:CODMEMBRO,
:DT_INSCRICAO,
:DT_ALTERACAO,
:DATA,
:VALOR,
:CODTIPOSPAGAMENTOS,
:OBSERVACOES,
:CHQ_BANCO,
:CHQ_AGENCIA,
:CHQ_NUMERO,
:CHQ_CONTACORRENTE,
:CAR_NUMERO,
:TIPO_TIPOSPAGAMENTOS,
:CHEQUE_TIPOSPAGAMENTOS,
:CARTAO_TIPOSPAGAMENTOS,
:NOME_MEMBROS,
:NOME_IGREJAS,
:ANO,
:MES,
:DIA

DO
BEGIN
SUSPEND;
END

END

============================

Está dando erro

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 65, column 33.
do.


GOSTEI 0
Acacio

Acacio

19/06/2006

Coloquei um exemplo abaixo. Mas a string com o sql pode ser feita no delphi ou no compilador que você usa.
Criei as tabelas a facao mas a procedure foi criada;


CREATE OR ALTER PROCEDURE MEMBROSDIZIMOS_RELATORIO2 (
CODIGREJA_IN INTEGER,
ANO_IN INTEGER)
RETURNS (
NOME_MEMBROS VARCHAR(50),
NOME_IGREJAS VARCHAR(50),
DATA DATE,
CODIGO INTEGER,
CODIGREJA INTEGER,
CODMEMBRO INTEGER,
DT_INSCRICAO DATE,
DT_ALTERACAO DATE,
VALOR NUMERIC(15,2),
CODTIPOSPAGAMENTOS INTEGER,
OBSERVACOES VARCHAR(50),
CHQ_BANCO VARCHAR(3),
CHQ_AGENCIA VARCHAR(5),
CHQ_NUMERO VARCHAR(10),
CHQ_CONTACORRENTE VARCHAR(10),
CAR_NUMERO VARCHAR(10),
TIPO_TIPOSPAGAMENTOS VARCHAR(30),
CHEQUE_TIPOSPAGAMENTOS CHAR(1),
CARTAO_TIPOSPAGAMENTOS CHAR(1),
ANO INTEGER,
MES INTEGER,
DIA INTEGER)
AS
DECLARE VARIABLE SCRIPTY VARCHAR(1500);
BEGIN
scripty = ´SELECT MD.CODIGO,MD.CODIGREJA,MD.CODMEMBRO,´ ||
´MD.DT_INSCRICAO,MD.DT_ALTERACAO,MD.DATA,´ ||
´MD.VALOR,MD.CODTIPOSPAGAMENTOS,MD.OBSERVACOES,´ ||
´MD.CHQ_BANCO,MD.CHQ_AGENCIA,MD.CHQ_NUMERO,´ ||
´MD.CHQ_CONTACORRENTE,MD.CAR_NUMERO,´||
´TP.TIPO AS TIPO_TIPOSPAGAMENTOS,´||
´TP.CHEQUE AS CHEQUE_TIPOSPAGAMENTOS,´||
´TP.CARTAO AS CARTAO_TIPOSPAGAMENTOS,´||
´M.NOME AS NOME_MEMBROS,´||
´I.NOME AS NOME_IGREJAS,´||
´extract(year from MD.DATA) AS ANO,´||
´extract(month from MD.DATA) AS MES,´||
´extract(day from MD.DATA) AS DIA´||
´FROM MEMBROSDIZIMOS MD´||
´INNER JOIN IGREJAS I ON (MD.CODIGREJA = I.CODIGO)´||
´INNER JOIN MEMBROS M ON (MD.CODMEMBRO = M.CODIGO)´||
´LEFT OUTER JOIN TIPOSPAGAMENTOS TP ON (MD.CODTIPOSPAGAMENTOS = TP.CODIGO)´||
´WHERE (MD.CODIGREJA = ´ || :CODIGREJA_IN || ´)´ ||
´AND (extract(year from MD.DATA) = ´ || :ANO_IN || ´)´ ||
´ORDER BY I.NOME,extract(year from MD.DATA) ASC,´ ||
´extract(month from MD.DATA) ASC,´ ||
´extract(day from MD.DATA) ASC,M.NOME;´;

for execute statement scripty
INTO :CODIGO,
:CODIGREJA,
:CODMEMBRO,
:DT_INSCRICAO,
:DT_ALTERACAO,
:DATA,
:VALOR,
:CODTIPOSPAGAMENTOS,
:OBSERVACOES,
:CHQ_BANCO,
:CHQ_AGENCIA,
:CHQ_NUMERO,
:CHQ_CONTACORRENTE,
:CAR_NUMERO,
:TIPO_TIPOSPAGAMENTOS,
:CHEQUE_TIPOSPAGAMENTOS,
:CARTAO_TIPOSPAGAMENTOS,
:NOME_MEMBROS,
:NOME_IGREJAS,
:ANO,
:MES,
:DIA
DO
BEGIN
SUSPEND;
END

END


GOSTEI 0
Thiagopedro

Thiagopedro

19/06/2006

E o IF ??????????? Na procedure ????????????


GOSTEI 0
Acacio

Acacio

19/06/2006

Fiz outro exemplo

CREATE OR ALTER PROCEDURE MEMBROSDIZIMOS_RELATORIO(
CODIGREJA_IN INTEGER,
ANO_IN INTEGER)
RETURNS (
NOME_MEMBROS VARCHAR(50),
NOME_IGREJAS VARCHAR(50),
DATA DATE,
CODIGO INTEGER,
CODIGREJA INTEGER,
CODMEMBRO INTEGER,
DT_INSCRICAO DATE,
DT_ALTERACAO DATE,
VALOR NUMERIC(15,2),
CODTIPOSPAGAMENTOS INTEGER,
OBSERVACOES VARCHAR(50),
CHQ_BANCO VARCHAR(3),
CHQ_AGENCIA VARCHAR(5),
CHQ_NUMERO VARCHAR(10),
CHQ_CONTACORRENTE VARCHAR(10),
CAR_NUMERO VARCHAR(10),
TIPO_TIPOSPAGAMENTOS VARCHAR(30),
CHEQUE_TIPOSPAGAMENTOS CHAR(1),
CARTAO_TIPOSPAGAMENTOS CHAR(1),
ANO INTEGER,
MES INTEGER,
DIA INTEGER)
AS
DECLARE VARIABLE SCRIPTY VARCHAR(1500);
BEGIN
scripty = ´SELECT MD.CODIGO,MD.CODIGREJA,MD.CODMEMBRO,´ ||
´MD.DT_INSCRICAO,MD.DT_ALTERACAO,MD.DATA,´ ||
´MD.VALOR,MD.CODTIPOSPAGAMENTOS,MD.OBSERVACOES,´ ||
´MD.CHQ_BANCO,MD.CHQ_AGENCIA,MD.CHQ_NUMERO,´ ||
´MD.CHQ_CONTACORRENTE,MD.CAR_NUMERO,´||
´TP.TIPO AS TIPO_TIPOSPAGAMENTOS,´||
´TP.CHEQUE AS CHEQUE_TIPOSPAGAMENTOS,´||
´TP.CARTAO AS CARTAO_TIPOSPAGAMENTOS,´||
´M.NOME AS NOME_MEMBROS,´||
´I.NOME AS NOME_IGREJAS,´||
´extract(year from MD.DATA) AS ANO,´||
´extract(month from MD.DATA) AS MES,´||
´extract(day from MD.DATA) AS DIA´||
´FROM MEMBROSDIZIMOS MD´||
´INNER JOIN IGREJAS I ON (MD.CODIGREJA = I.CODIGO)´||
´INNER JOIN MEMBROS M ON (MD.CODMEMBRO = M.CODIGO)´||
´LEFT OUTER JOIN TIPOSPAGAMENTOS TP ON (MD.CODTIPOSPAGAMENTOS = TP.CODIGO)´;
if (:CODIGREJA_IN = 1) then
scripty = scripty || ´ WHERE (MD.CODIGREJA = ´ || :CODIGREJA_IN || ´)´;
else
scripty = scripty || ´ WHERE (MD.CODIGREJA = ´ || :CODIGREJA_IN || ´)´
|| ´AND (extract(year from MD.DATA) = ´ || :ANO_IN || ´)´ ||
´ORDER BY I.NOME,extract(year from MD.DATA) ASC,´ ||
´extract(month from MD.DATA) ASC,´ ||
´extract(day from MD.DATA) ASC,M.NOME;´;
for execute statement scripty
INTO :CODIGO,
:CODIGREJA,
:CODMEMBRO,
:DT_INSCRICAO,
:DT_ALTERACAO,
:DATA,
:VALOR,
:CODTIPOSPAGAMENTOS,
:OBSERVACOES,
:CHQ_BANCO,
:CHQ_AGENCIA,
:CHQ_NUMERO,
:CHQ_CONTACORRENTE,
:CAR_NUMERO,
:TIPO_TIPOSPAGAMENTOS,
:CHEQUE_TIPOSPAGAMENTOS,
:CARTAO_TIPOSPAGAMENTOS,
:NOME_MEMBROS,
:NOME_IGREJAS,
:ANO,
:MES,
:DIA
DO
BEGIN
SUSPEND;
END
END


GOSTEI 0
POSTAR