Professional Documents
Culture Documents
-- Funo que calcula comisso de vendas IF sales> 0 THEN commission := sales * 0.1; END IF;
Podemos tambm colocar nosso comentrio em uma linha que contm cdigo a ser executado. Por exemplo:
PROCEDURE update_balance (cust_id IN NUMBER) IS /* Procedure: update_balance Autor: Jos Silva Descrio: Procedure de Teste */
Usando aspas dentro de strings Muitas pessoas que comeam a trabalhar com PL/SQL (e algumas outras variaes do SQL) enfrentam problemas com o uso de aspas em literais. A seguir esto algumas dicas ao se usar aspas: . Para colocar uma aspa simples dentro de uma literal, ponha duas aspas simples juntas; . Para colocar uma aspa simples no comeo ou no final de um literal, ponha trs aspas juntas; . Para criar uma string literal consistindo de uma nica aspa, ponha quatro aspas simples juntas; . Para criar uma string consistindo de duas aspas simples juntas, ponha seis aspas simples juntas. As regras so simples, por isso bom decor-las! Identificadores Um identificador o nome para um objeto PL/SQL. Objetos podem incluir o seguinte: . . . . . . . . . Variveis; Constantes; Cursores; Packages; Procedures; Functions; Registros; Tabelas PL/SQL; Palavras Reservadas.
Identificadores do PL/SQL devem comear com uma letra, no contm espaos, podem conter os seguintes caracteres $, _ e #. O tamanho mximo de um identificador de 30 caracteres. Palavras reservadas O PL/SQL possui palavras reservadas, no uma boa idia tentar usar uma palavra reservada como uma varivel em seu cdigo. Aqui esto algumas das palavras reservadas em PL/SQL mas no a lista definitiva, verifique sua documentao atual para a lista
completa. Evite o seguinte, BEGIN, END, IF, ELSE, END IF, WHILE, LOOP, OPEN, CLOSE, FETCH. Acho que agora voc j tem uma boa idia. Literais J mencionamos literais, mas o que so eles? Aqui est a definio correta, 'Um literal um valor que no representado por um identificador'. Um literal pode ser composto de nmeros, por exemplo, 123, 95 34.56, strings, por exemplo, 'Hello World', 'Joo Silva' e valores booleanos como TRUE e FALSE. O delimitador de instrues Todo programa PL/SQL consiste de muitas instrues. Nossas instrues so terminadas com o caracter';'. Um fim de linha no um fim de uma instruo, olhe para nossa instruo IFTHEN como um exemplo:
IF sal> 20000 THEN comm := sal * 0.1; ELSIF sal> 10000 and sal<20000 THEN comm := sal * 0.06; ELSE comm := 0; END IF;
No trecho de cdigo acima difcil determinar quais instrues vo em dada instruo IF. Se endentarmos cada bloco lgico do cdigo com dois espaos (algumas pessoas preferem trs) o cdigo torna-se mais legvel e compreensvel. Porexemplo:
IF sal> 20000 THEN comm := sal * 0.1; ELSIF sal> 10000 and sal<20000 THEN comm := sal * 0.06; ELSE comm := 0; END IF;
Usando maisculas e minsculas para melhorar a leitura do seu cdigo O cdigo PL/SQL consiste basicamente de tipos de texto. Palavras reservadas e identificadores. Palavras reservadas so elementos de linguagem que foram reservados pelo PL/SQL e tem um significado especial par ao compilador PL/SQL. Exemplos de palavras reservadas so IF, THEN, ELSE, DO WHILE, LOOP, BEGIN E END apenas para citar algumas. Para uma listagem completa das palavras reservadas, veja a docum entao do PL/SQL na documentao do Oracle. Voc pode ter notado que temos usado letras maisculas para palavras reservadas e minsculas para identificadores e variveis. Esta conveno ajuda na leitura do seu cdigo. O compilador PL/SQL no caso sensitivo, mas muitos desenvolvedores so!
http://www.htmlstaff.org/ver.php?id=6420 http://igorborba.com/cursos/programacao-plsql-com-oracle/aula-01-visao-geral/
COMMIT e ROLLBACK no SQL Sql um assunto do qual gosto bastante, ento sempre que posso dou uma pincelada no tema. Pois bem, no sql tem duas clusulas muito interessantes COMMIT e ROLLBACK. COMMIT - Responsvel por efetivar a transao corrente, pois quando se trabalha com um banco de dados em que vrios usurios vo utiliz-lo ao mesmo tempo, tem que se efetivar a operao, pois sem o COMMIT a alterao no ser visualizada para as outras "sesses", salvo se a sesso em que fez a alterao for fechada, o que por sua vez, traria muitos prejuzos, pois outros usurios iriam trabalhar com um banco de dados desatualizado e podendo at causar redundncia de dados. ROLLBACK - Desfaz a ltima alterao. Quando desenvolvemos um sistema, tentamos fazer todos os tratamentos de erros possveis, mas no podemos esquecer da astcia do usurio, ele sempre consegue arranjar um jeito de fazer m... no sistema e descobri um bug que voc nem imaginava ser possvel, por isso existe os tratamentos de erros e se tratando de um banco de dados essa preocupao tem que triplicar. Como mencionei anteriormente essas duas clusulas so muito interessantes, ainda mais utilizando Stored Procedure, Quando se faz uma operao no BD (INSERT, UPDATE, DELETE), este por sua vez retorna se a operao foi ou no bem sucedida. A partir daqui podemos imaginar como podem nos
SQL>insert into alunos (matricula, nome) values (4, 'Yusuke Urameshi'); 1 row created. SQL>IF @@ERROR <> 0 ROLLBACK ELSE COMMIT Commit complete.
No cdigo acima verificamos, se a insero foi bem-sucedida, se for efetiva a insero no bd, seno desfaz a insero. http://coisasdeweb.blogspot.com/2007/06/commit-e-rollback-no-sql.html
Procedures Uma procedure nada mais do um bloco PL/SQL nomeado. A grande vantagem sobre um bloco PL/SQL annimo que pode ser compilado e armazenado no banco de dados como um objeto de schema. Graas a essa caracterstica as procedures so de fcil manuteno, o cdigo reutilizvel e permitem que trabalhemos com mdulos de programa. Uma procedure , ento, um bloco PL/SQL nomeado que pode aceitar argumentos (tambm chamado de parmetros) e pode ser chamada por um programa, uma sesso SQL ou uma trigger. Durante a instalao do banco de dados Oracle um script executado automaticamente e cria toda a estrutura necessria para que as procedures sejam executadas. Eventualmente esse procedimento automtico pode falhar devido a alguma falha fsica no disco rgido, nesse caso o usurio SYS pode recriar a estrutura atravs do script SQL DBMSSTDX.SQL. Para criar uma procedure o usurio precisa ter o privilgio de sistema CREATE PROCEDURE, para criar a procedure em outros schemas o usurio deve ter o privilgio de CREATE ANY PROCEDURE. Este um ponto muito interessante sobre as procedures, os privilgios para criao de procedures tm que concedidos explicitamente, ou seja, no pode ser adquirido atravs de roles. Para executar uma procedure externa necessrio ter o privil gio de EXECUTE. Caso queira alterar a procedure de outro schema deve ter o privilgio de sistema ALTER ANY PROCEDURE. A sintaxe bsica de uma procedure :
CREATE [OR REPLACE] PROCEDURE [schema.]nome_da_procedure [(parmetro1 [modo1] tipodedado1, parmetro2 [modo2] tipodedado2, ...)] IS|AS Bloco PL/SQL
Onde: REPLACE - indica que caso a procedure exista ela ser eliminada e substituda pela nova verso criada pelo comando;
BLOCO PL/SQL - inicia com uma clusula BEGIN e termina com END ou END nome_da_procedure; NOME_DA_PROCEDURE - indica o nome da procedure; PARMETRO - indica o nome da varivel PL/SQL que passada na chamada da procedure ou o nome da varivel que retornar os valores da procedure ou ambos. O que ir conter em parmetro depende de MODO; MODO - Indica que o parmetro de entrada (IN), sada (OUT) ou ambos (IN OUT). importante notar que IN o modo default, ou seja, se no dissermos nada o modo do nosso parmetro ser, automaticamente, IN; TIPODEDADO - indica o tipo de dado do parmetro. Pode ser qualquer tipo de dado do SQL ou do PL/SQL. Pode usar referencias como %TYPE, %ROWTYPE ou qualquer tipo de dado escalar ou composto. Ateno: no possvel fazer qualquer restrio ao tamanho do tipo de dado neste ponto. IS|AS - a sintaxe do comando aceita tanto IS como AS. Por conveno usamos IS na criao de procedures e AS quando estivermos criando pacotes. BLOCO PL/SQL - indica as aes que sero executadas por aquela procedure. Vamos ver um exemplo de procedure para ajudar nosso e ntendimento:
CREATE OR REPLACE PROCEDURE aumenta_sal (p_empno IN emp.empno%TYPE) IS BEGIN UPDATE scott.emp SET sal = sal * 1.10 WHERE empno = p_empno; END aumenta_sal; /
Neste exemplo estamos criando uma procedure para aumentar o salrio de um funcionrio em 10%. A primeira linha define o NOME DA PROCEDURE, que vai ser AUMENTA_SAL. A linha dois define o parmetro P_EMPNO no modo IN. Ou seja, vai ser um dado informado na chamada da procedure. Em seguida determinamos que ele ser do mesmo tipo e tamanho que a coluna EMPNO da tabela EMP. Isso feito atravs da referencia EMP.EMPNO%TYPE. Podemos verificar o estado de nossa procedure atravs de uma simples consulta:
SELECT empno, sal FROM scott.emp; EMPNO SAL ---------- ---------7839 5000
7698 7782
2850 2450
CALL AUMENTA_SAL(7839);
Ou
EXECUTE AUMENTA_SAL(7839); SELECT empno, sal FROM scott.emp; EMPNO SAL ---------- ---------7839 5500 7698 2850 7782 2450
Podemos notar que o salrio do funcionrio 7839 aumentou em 10%. interessante notar que neste momento possvel executar a instruo ROLLBACK; possvel desfazer as alteraes porque os dados passados atravs dos modos OUT e IN OUT so registrados no arquivo de redo log e no segmento de rollback. Isso perfeito quando trabalhamos com parmetros pouco extensos, mas pode causar impactono sistema quando trabalhamos com parmetros extensos como, por exemplo, um registro ou um VARRAY. Para resolver esse problema podemos usar a opo de NOCOPY. Nossa procedure ficaria assim com a opo NOCOPY:
CREATE OR REPLACE PROCEDURE aumenta_sal (p_empno IN OUT NOCOPY emp.empno%TYPE) IS BEGIN UPDATE scott.emp SET sal = sal * 1.10 WHERE empno = p_empno; END aumenta_sal; /
http://www.linhadecodigo.com.br/artigo/335/PL_SQLProcedures-eFun%C3%A7%C3%B5es.aspx
jogos http://msdn.microsoft.com/pt-br/xna