Steven Feuerstein

De DTI Wiki

Ir para: navegação, pesquisa

Bp.png 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

Comonfazer.png COMO NÃO FAZER

CREATE OR REPLACE PROCEDURE prc_exemplo IS
			...
		BEGINUPDATE 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;



Comofazer.png COMO FAZER

CREATE OR REPLACE PROCEDURE prc_exemplo ISPROCEDURE 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

Comonfazer.png 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;


Comofazer.png COMO FAZER

 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;
Ferramentas pessoais
Espaços nominais
Variantes
Ações
Navegação
Ferramentas