You are on page 1of 7

Manual

Viso geral sobre PL/SQL


PL/SQL significa "Procedural Language extensions to SQL".O PL/SQL pode ser usado em bancos de dados Oracle, no Oracle Server, em ferramentas clientes, isto , Oracle Forms. O PL/SQL muito similar linguagem SQL mas acrescenta construes de programao similares a outras liguagens. A histria do PL/SQL Antes de 1991 a nica forma deusar construes procedureis com o SQL era usar PRO*C. Foi onde as instrues SQL do Oracle foram embutidas em cdigo C. O cdigo C era prcompilado para converter as instrues SQL em chamadas de bibliotecas. Em 1991 o PL/SQL 1.0 foi lanado com o Oracle Verso 6.0. Ele era muito limitado nas suas capacidades. O PL/SQL Verso 2.0 foi lanado com o Oracle Verso 7.0. Esta era uma atualizao maior. Ele suportava storedpackages, procedures, funes, tabelas PL/SQL, registros definidos pelo programador e packageextensions. O PL/SQL Verso 2.1 foi liberado com a Verso 7.1 do Oracle. Isto permitiu o uso de storedfunctions dentro de instrues SQL e a criao de SQL dinmico pelo uso do pacote DBMS_SQL. Foi tambm possvel executar instrues de Linguagens de Definio de Dados de programas PL/SQL. A Verso 2.2 PL/SQJL foi lanada com a Verso 7.2 do Oracle. Ele implementava um envlucro para programas PL/SQL para proteger o cdigo de olhares curiosos. Tambm foi possvel agendar trabalhos do banco de dados com o pacote DBMS_JOB. A Verso 2.3 do PL/SQL foi lanado com a Verso 7.3 do Oracle. Esta verso aumentou as capacidades das tabelas PL/SQL e adicionou funcionalidades de E/S de arquivos. A Verso 2.4 do PL/SQL foi liberada com a Verso 8.0 do Oracle. Esta verso suporta os melhoramentos do Oracle 8, incluindo LargeObjects, projeto orientado a objetos, tabelas aninhadas e Oracle advancedqueuing. Fundamentos do PL/SQL O conjunto de caracteres do PL/SQL Programas PL/SQL consistem dos seguintes caracteres, as letras A- Z, a- z, os nmeros 0 9, os smbolos ~!@#$%&*()[]{};:'"<>,.?/. O PL/SQL caso insensitivo, letras maisculas e letras minsculas so equivalentes. Comentando o nosso cdigo Todo bom cdigo PL/SQL merece ser comentado. Temos duas maneiras de comentar cdigo. Podemos usar o duplo '-' para comentar uma nica linha de cdigo. Tudo depois de -- ignorado at o fim da linha. Por exemplo:

-- 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:

IF sales> 0 THEN commission := sales * 0.1; -- A % da comisso de 10 porcento. END IF;


Agora quando queremos comentar mltiplas linhas dentro do PL/SQL podemos usar os seguintes caracteres /* */. Tudo entre esses caracteres ignorado e tratado como um comentrio. Porexemplo:

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 sales > 0 THEN commission := sales * 0.1; END IF;


Nosso primeiro ponto-e-vrgula finaliza a instruo commission := sales * 0.1 e o segundo ponto-e-vrgula encerra a instruo IF-THEN-END- IF. O mesmo trecho de cdigo poderia ser escrito assim:

IF sales> 0 THEN commission := sales * 0.1; END IF;


Funcionalmente as duas instrues so idnticas, a primeira muito mais leg el. No v prximo captulo discutiremos formatao em blocos do PL/SQL. Formatando o PL/SQL Existe apenas um objetivo do layout eficaz de seu cdigo PL/SQL e 'Revelar e reforar a estrutura lgica do programa'. PL/SQL beneficia-se por ser uma linguagem bem estruturada, cada bloco de cdigo tem um comeo e um fim bem definidos. Porexemplo:

IF - END IF , LOOP - END LOOP and DO - WHILE .


Criando uma estrutura lgica Criar nossa estrutura lgica no PL/SQL bastante simples, fazemos isso usando endentao eficas do nosso cdigo. Aqui est um pedao de cdigo no -endentado. Por 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

ser teis as clusulas. Exemplo:

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 object_name, status FROM user_objects WHERE object_name LIKE '%AUMENTA%';


Agora podemos verificar o funcionamento de nossa procedure:

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

comandos bsicos SQL http://pt.scribd.com/doc/1555956/Comandos-basicos-de-SQL

You might also like