Steven Feuerstein
De DTI Wiki
BOA PRÁTICA
Evitar a construção de instruções SQL complexas dentro do PL/SQL;
Instruções complexas, além de aumentar o custo do SQL, dificultam também a compreensão e a manutenção do código. Divida a instrução em pequenos SQLs, faça uso de funções, evite SQLs aninhados. O PL/SQL possibilita a criação de PROCEDURES e FUNCTIONS dentro de PROCEDURES e FUNCTIONS caso seja necessário a restrição de acesso a um determinado código a um ponto específico do sistema. Esta técnica também pode ser utilizada em PROCEDURES e FUNCTIONS não contidos em PACKAGES, o que facilita muito a reutilização de código.
Código Repetido
COMO NÃO FAZER
CREATE OR REPLACE PROCEDURE prc_exemplo IS ... BEGIN … UPDATE tabela tblexemplo SET campo1 = variavel1, campo2 = variavel2 WHERE codigo = variavel3; … UPDATE tabela tblexemplo SET campo1 = variavel1, campo2 = variavel2 WHERE codigo = variavel3; … UPDATE tabela tblexemplo SET campo1 = variavel1, campo2 = variavel2 WHERE codigo = variavel3; ... END;
CREATE OR REPLACE PROCEDURE prc_exemplo IS … PROCEDURE prc_update (in_variavel1 … in_variavel2 … in_variavel3 …) IS BEGIN UPDATE tabela tblexemplo SET campo1 = variavel1, campo2 = variavel2 WHERE codigo = variavel3; END prc_update; BEGIN … prc_update(variavel1, variavel2, variavel3); … prc_update(variavel1, variavel2, variavel3); … prc_update(variavel1, variavel2, variavel3); ... END;
Código complexo
COMO NÃO FAZER
Como não fazer (Código complexo); CURSOR c_email IS SELECT MAX(parcela.datasituacao) AS dia, aluno.codaluno, aluno.nome, parcela.codparcela, parcela.datavencimento, parcela.mesparcela, parcela.anoparcela, parcela.codturma, curso.descricao, curso.codcurso, aluno.emaildoc, doccurso.codinstituicaofinanceira, (SELECT CASE WHEN(TRUNC(SYSDATE) <= (con.diapagamentodesconto || '/' || parc.mesparcela || '/' || parc.anoparcela)) THEN (addesenv.fun_saldoparcela_database(parcela.codparcela,SYSDATE) - ((addesenv.fun_saldoparcela_database(parcela.codparcela,SYSDATE) * (SELECT percdesconto FROM descontoparcconveniocooper WHERE codparcela = parcela.codparcela)) / 100)) ELSE addesenv.fun_saldoparcela_database(parcela.codparcela, SYSDATE) END AS valor FROM descontoparcconveniocooper desco, parcela parc, alunoconvenioemp alu, convenioempresa con WHERE desco.codparcela = parcela.codparcela AND desco.codparcela = parc.codparcela AND parc.codcurso = alu.codcurso AND parc.codturma = alu.codturma AND parc.codaluno = alu.codaluno AND alu.codconvenioemp = con.codconvenioemp) AS valorparcela FROM parcela, aluno, curso, doccurso WHERE parcela.codultimasituacao = 21 AND TRUNC(parcela.datasituacao) = TRUNC(SYSDATE - 1) AN D parcela.codtipoparcela = 1 AND aluno.codaluno = parcela.codaluno AND curso.codcurso = parcela.codcurso AND doccurso.codcurso = curso.codcurso AND doccurso.tipostatus = 0 AND aluno.emaildoc IS NOT NULL GROUP BY aluno.codaluno, aluno.nome, parcela.codparcela, parcela.datavencimento, parcela.mesparcela, parcela.anoparcela, parcela.codturma, curso.descricao, curso.codcurso, aluno.emaildoc, doccurso.codinstituicaofinanceira; r_email c_email%ROWTYPE;
CURSOR c_email IS SELECT MAX(parcela.datasituacao) AS dia, aluno.codaluno, aluno.nome, parcela.codparcela, parcela.datavencimento, parcela.mesparcela, parcela.anoparcela, parcela.codturma, curso.descricao, curso.codcurso, aluno.emaildoc, doccurso.codinstituicaofinanceira FROM parcela, aluno, curso, doccurso WHERE parcela.codultimasituacao = 21 AND TRUNC(parcela.datasituacao) = TRUNC(SYSDATE - 1) AN D parcela.codtipoparcela = 1 AND aluno.codaluno = parcela.codaluno AND curso.codcurso = parcela.codcurso AND doccurso.codcurso = curso.codcurso AND doccurso.tipostatus = 0 AND aluno.emaildoc IS NOT NULL GROUP BY aluno.codaluno, aluno.nome, parcela.codparcela, parcela.datavencimento, parcela.mesparcela, parcela.anoparcela, parcela.codturma, curso.descricao, curso.codcurso, aluno.emaildoc, doccurso.codinstituicaofinanceira; r_email c_email%ROWTYPE; … BEGIN OPEN c_email; LOOP FETCH c_email INTO r_email; EXIT WHEN c_email%NOTFOUND; BEGIN SELECT CASE WHEN(TRUNC(SYSDATE) <=(con.diapagamentodesconto || '/' || parc.mesparcela || '/' || parc.anoparcela)) THEN (addesenv.fun_saldoparcela_database(r_email.codparcela,SYSDATE) - ((addesenv.fun_saldoparcela_database(r_email.codparcela,SYSDATE) * (SELECT percdesconto FROM descontoparcconveniocooper WHERE codparcela = r_email.codparcela)) / 100)) ELSE addesenv.fun_saldoparcela_database(r_email.codparcela, SYSDATE) END AS valor INTO v_valorparcela FROM descontoparcconveniocooper desco, parcela parc, alunoconvenioemp alu, convenioempresa con WHERE desco.codparcela = r_email.codparcela AND desco.codparcela = parc.codparcela AND parc.codcurso = alu.codcurso AND parc.codturma = alu.codturma AND parc.codaluno = alu.codaluno AND alu.codconvenioemp = con.codconvenioemp; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('Sem Valor ' || r_email.codparcela); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.put_line('Mais de um valor ' || r_email.codparcela); END; …