Curso_de_PL_SQL

download Curso_de_PL_SQL

of 29

Transcript of Curso_de_PL_SQL

  • 8/8/2019 Curso_de_PL_SQL

    1/29

  • 8/8/2019 Curso_de_PL_SQL

    2/29

    O que a Linguagem Pl/SQL?O que a Linguagem Pl/SQL?

    AA linguagemlinguagem PL/SQLPL/SQL aa linguagemlinguagem proceduralproceduraldodo Oracle,Oracle, sendosendo consideradaconsiderada umauma extensoextenso dada

    linguagemlinguagem SQLSQL.. RotinasRotinas escritasescritas emem Java,Java, C++,C++,CobolCobol podempodem serser chamadaschamadas pelopelo OracleOracle.. AAlinguagemlinguagem PL/SQLPL/SQL associaassocia aa facilidadefacilidade dedemanipulaomanipulao dada linguagemlinguagem SQLSQL dada

    programaoprogramao dede umauma linguagemlinguagem proceduralprocedural.. AtravsAtravs dada PL/SQL,PL/SQL, criacria--sese vriosvrios objetosobjetos comocomo ::functions,functions, storedstored procedures,procedures, triggerstriggers eepackagespackages..

  • 8/8/2019 Curso_de_PL_SQL

    3/29

    Uma aplicao Pl/SQL envia de uma sUma aplicao Pl/SQL envia de uma s

    vez o bloco Pl/SQL para SGBD,vez o bloco Pl/SQL para SGBD,

    Enquanto uma aplicao usando somenteEnquanto uma aplicao usando somenteSQL enviar um comando por vez resultandoSQL enviar um comando por vez resultando

    em perda de performanceem perda de performance

  • 8/8/2019 Curso_de_PL_SQL

    4/29

    Blocos Pl/SQLBlocos Pl/SQL

    AA linguagemlinguagem PL/SQLPL/SQL dividadivida emem trstrs blocosblocos::SeoSeo dede declarao,declarao, dede execuoexecuo ee dede exceoexceo..

    SeoSeo dede declaraodeclarao (opcional)(opcional) :: iniciadainiciadasempresempre comcom oo comandocomando DECLAREDECLARE.. oo locallocalondeonde soso declaradasdeclaradas asas variveisvariveis ee constantesconstantes..

    SeoSeo dede execuoexecuo (obrigatria)(obrigatria) :: IniciadaIniciada pelopelocomandocomando BEGINBEGIN.. EstaEsta rearea alocaaloca osos comandoscomandos

    PL/SQLPL/SQL.. SeoSeo dede exceoexceo (opcional)(opcional):: IniciadaIniciada pelopelocomandocomando EXCEPTIONEXCEPTION.. EstEst rearea oo locallocal ondeondesoso tratadostratados osos erroserros..

  • 8/8/2019 Curso_de_PL_SQL

    5/29

    Variveis e constantesVariveis e constantes

    A PL/SQL permite a declarao de variveis e constantes que podem serA PL/SQL permite a declarao de variveis e constantes que podem serutilizadas em comandos SQL contidos em stored procedures e functions. Asutilizadas em comandos SQL contidos em stored procedures e functions. Asvariveis podem ter qualquer tipo de datatype usados pelo Oracle (number,variveis podem ter qualquer tipo de datatype usados pelo Oracle (number,date, char, varchar2....), alm dos tipos apresentados abaixo:date, char, varchar2....), alm dos tipos apresentados abaixo:

    Boolean : Valores lgicos, podem assumir os seguintes valores : (true,Boolean : Valores lgicos, podem assumir os seguintes valores : (true,false, null).false, null). Binary_integer: Trabalha com nmeros entreBinary_integer: Trabalha com nmeros entre --2.147.483.647 2.147.483.647

    2.147.483.647.2.147.483.647. Positive: Trabalha com nmeros entre 1 2.147.483.647.Positive: Trabalha com nmeros entre 1 2.147.483.647. Natural : Trabalha com nmeros entre 0 2.147.483.647.Natural : Trabalha com nmeros entre 0 2.147.483.647. % type : Atribui varivel que est sendo criada o mesmo tipo de dados% type : Atribui varivel que est sendo criada o mesmo tipo de dados

    que faz referncia a utilizada no banco de dados.que faz referncia a utilizada no banco de dados. Ex.; codigo := clientes.codcli%type;Ex.; codigo := clientes.codcli%type; As duas formas de atribuio de valores a uma varivel so:As duas formas de atribuio de valores a uma varivel so: Atravs do smboloAtravs do smbolo :=:=, e do uso do comand select., e do uso do comand select. Ex.: total:=total+1;Ex.: total:=total+1; Select pvenda * 0.30 INTO novopreco from produtos;Select pvenda * 0.30 INTO novopreco from produtos;

  • 8/8/2019 Curso_de_PL_SQL

    6/29

    ConstantesConstantes

    A declarao de constantes idntica a deA declarao de constantes idntica a devariveis; com um adendo, a utilizao davariveis; com um adendo, a utilizao da

    palavra CONSTANT.palavra CONSTANT. Ex.: novopreco CONSTANT real :=3.54;Ex.: novopreco CONSTANT real :=3.54;

  • 8/8/2019 Curso_de_PL_SQL

    7/29

    Estrutura de controleEstrutura de controle IF /IF /Then / ElseThen / Else O comando IF .. THEN.. ELSIFO comando IF .. THEN.. ELSIF

    O comando IF.. THEN, avalia uma condio e executa uma ou mais instrues somente se a condio for verdadeira.O comando IF.. THEN, avalia uma condio e executa uma ou mais instrues somente se a condio for verdadeira.

    Sintaxe:Sintaxe:

    IF THENIF THEN END IFEND IF

    IF THENIF THEN ELSIF THENELSIF THEN ELSIF THENELSIF THEN ELSEELSE END IF;END IF;

    Ex IF novopreco < 100 THENEx IF novopreco < 100 THEN UPDATE produtosUPDATE produtos Set preco = preco * 1.10;Set preco = preco * 1.10; ELSIF novopreco < 200 THENELSIF novopreco < 200 THEN UPDATE produtosUPDATE produtos Set preco = preco * 1.20;Set preco = preco * 1.20; ELSEELSE UPDATE produtosUPDATE produtos Set preco = preco * 1.20;Set preco = preco * 1.20; END IF;END IF;

  • 8/8/2019 Curso_de_PL_SQL

    8/29

    O comando LOOPO comando LOOP

    O LOOP inicializa um grupo de comandos at que uma condio force o desvio para umaO LOOP inicializa um grupo de comandos at que uma condio force o desvio para umaoutra parte do programa. O comando LOOP, usado em conjunto com o comandooutra parte do programa. O comando LOOP, usado em conjunto com o comandoEXIT, responsvel pela parada de execuo do LOOP.EXIT, responsvel pela parada de execuo do LOOP.

    Sintaxe:Sintaxe:LOOPLOOP

    EXITEXIT

    END LOOP;END LOOP;LOOPLOOP

    EXIT [] WHEN EXIT [] WHEN END LOOP.END LOOP.

  • 8/8/2019 Curso_de_PL_SQL

    9/29

    O comando FOR...LOOPO comando FOR...LOOP

    OsOs comandoscomandos soso executadosexecutadosautomaticamenteautomaticamente atat queque umauma condiocondio

    avaliadaavaliada retorneretorne FALSEFALSE..SINTAXESINTAXE::ForFor ININ [REVERSE][REVERSE] .... LOO

    PLOO

    P

  • 8/8/2019 Curso_de_PL_SQL

    10/29

  • 8/8/2019 Curso_de_PL_SQL

    11/29

    O comando WHILEO comando WHILE

    O comando While analisa uma condio e,O comando While analisa uma condio e,somente se esta condio for verdadeira,somente se esta condio for verdadeira,

    executa os comandos contidos dentroexecuta os comandos contidos dentrodessa estrutura.dessa estrutura.SINTAXE:SINTAXE:

    WHILE LOO

    PWHILE LOO

    P

    END LOOPEND LOOP

  • 8/8/2019 Curso_de_PL_SQL

    12/29

    Exemplo do comando WhileExemplo do comando While

    ---- exemp2.sqlexemp2.sqldeclaredeclarecont int:=0;cont int:=0;beginbegin

    delete from testedelete from testewhile cont

  • 8/8/2019 Curso_de_PL_SQL

    13/29

    Terceiro exemplo.Terceiro exemplo.

    ---- exemp3.sqlexemp3.sqldeclaredeclarecont int:=0;cont int:=0;

    beginbeginfor cont in 1..10 loopfor cont in 1..10 loopif mod(cont,2) = 0 thenif mod(cont,2) = 0 then

    insert into testeinsert into testevalues (cont, sysdate, 'PAR');values (cont, sysdate, 'PAR');

    elseelse

    insert into testeinsert into testevalues (cont, sysdate, 'IMPAR');values (cont, sysdate, 'IMPAR');end if;end if;

    end loop;end loop;end;end;

  • 8/8/2019 Curso_de_PL_SQL

    14/29

    Referenciando variveis noReferenciando variveis no

    PL/SQLPL/SQLAlguns produtos externos ao Oracle comAlguns produtos externos ao Oracle com

    por exemplo Forms, Reports e o utilitriopor exemplo Forms, Reports e o utilitrio

    SQL PLUS, podem passar valores paraSQL PLUS, podem passar valores parablocos PL/SQL para serem utilizadosblocos PL/SQL para serem utilizadosinternamente. Para isso basta prefixar ainternamente. Para isso basta prefixar avarivel com dois pontos (:).varivel com dois pontos (:).

    Exemplo:Exemplo: :e_variavel_externa:=v_variavel_interna +:e_variavel_externa:=v_variavel_interna +

    10;10;

  • 8/8/2019 Curso_de_PL_SQL

    15/29

    Exemplo 4Exemplo 4

    Accept p_in_out PROMPT Entre com oAccept p_in_out PROMPT Entre com oparmetro IN/OUT: parmetro IN/OUT:

    Variable e_in_out char(20)Variable e_in_out char(20) DeclareDeclare v_interna varchar2(20):= &p_in_out;v_interna varchar2(20):= &p_in_out; beginbegin :e_in_out := SUBSTR(v_interna,3, 5);:e_in_out := SUBSTR(v_interna,3, 5); End;End; Agora digite :Agora digite : Print e_in_out e pressione a tecla enterPrint e_in_out e pressione a tecla enter

  • 8/8/2019 Curso_de_PL_SQL

    16/29

    Exemplo 5Exemplo 5 cursoaluno.sqlcursoaluno.sql

    ACCEPT p_cod PROMPT 'ENTRE COM UM CODIGO DOACCEPT p_cod PROMPT 'ENTRE COM UM CODIGO DOALUNO'ALUNO'

    VARIABLE e_nome varchar2(50);VARIABLE e_nome varchar2(50); declaredeclare v_nome cursoaluno.nome%type;v_nome cursoaluno.nome%type; beginbegin select nome into v_nome from alunosselect nome into v_nome from alunos

    where matricula=&p_cod;where matricula=&p_cod; :e_nome:=v_nome;:e_nome:=v_nome; end;end; print e_nomeprint e_nome

  • 8/8/2019 Curso_de_PL_SQL

    17/29

    Exemplo 6Exemplo 6 novo.sqlnovo.sql

    declaredeclarer_novo novo%rowtype;r_novo novo%rowtype;

    beginbeginr_novo.codigo:=1;r_novo.codigo:=1;r_novo.nome:='Ricardo Esteves Kneipp';r_novo.nome:='Ricardo Esteves Kneipp';

    insert into novo valuesinsert into novo values(r_novo.codigo,r_novo.nome, null);(r_novo.codigo,r_novo.nome, null);end;end;

  • 8/8/2019 Curso_de_PL_SQL

    18/29

    ProceduresProcedures

    Uma procedure nada mais do um bloco PL/SQLUma procedure nada mais do um bloco PL/SQLnomeado. A grande vantagem sobre um bloco PL/SQLnomeado. A grande vantagem sobre um bloco PL/SQLannimo que pode ser compilado e armazenado noannimo que pode ser compilado e armazenado no

    banco de dados como um objeto de schema. Graas abanco de dados como um objeto de schema. Graas aessa caracterstica as procedures so de fcilessa caracterstica as procedures so de fcilmanuteno, o cdigo reutilizvel e permitem quemanuteno, o cdigo reutilizvel e permitem quetrabalhemos com mdulos de programa.trabalhemos com mdulos de programa.

    Uma procedure , ento, um bloco PL/SQL nomeado queUma procedure , ento, um bloco PL/SQL nomeado quepode aceitar argumentos (tambm chamado depode aceitar argumentos (tambm chamado deparmetros) e pode ser chamada por um programa, umaparmetros) e pode ser chamada por um programa, umasesso SQL ou uma trigger.sesso SQL ou uma trigger.

  • 8/8/2019 Curso_de_PL_SQL

    19/29

    SintaxeSintaxe -- ProcedureProcedure

    A sintaxe bsica de uma procedure :A sintaxe bsica de uma procedure :CREATE [OR REPLACE] PROCEDURE [schema.]nome_da_procedureCREATE [OR REPLACE] PROCEDURE [schema.]nome_da_procedure[(parmetro1 [modo1][(parmetro1 [modo1]

    tipodedado1,tipodedado1, parmetro2 [modo2] tipodedado2,parmetro2 [modo2] tipodedado2, ...)]IS|ASBloco PL/SQL...)]IS|ASBloco PL/SQLOnde:Onde:REPLACEREPLACE -- indica que caso a procedure exista ela ser eliminada e substituda pela nova versoindica que caso a procedure exista ela ser eliminada e substituda pela nova verso

    criada pelo comando;criada pelo comando;BLOCO PL/SQLBLOCO PL/SQL -- inicia com uma clusula BEGIN e termina com END ou END nome_da_procedure;inicia com uma clusula BEGIN e termina com END ou END nome_da_procedure;NOME_DA_PROCEDURENOME_DA_PROCEDURE -- indica o nome da procedure;indica o nome da procedure;PARMETROPARMETRO -- indica o nome da varivel PL/SQL que passada na chamada da procedure ou oindica 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 emnome da varivel que retornar os valores da procedure ou ambos. O que ir conter emparmetro depende de MODO;parmetro depende de MODO;

    MODOMODO -- Indica que o parmetro de entrada (IN), sada (OUT) ou ambos (IN OUT). importanteIndica que o parmetro de entrada (IN), sada (OUT) ou ambos (IN OUT). importantenotar que IN o modo default, ou seja, se no dissermos nada o modo do nosso parmetro ser,notar que IN o modo default, ou seja, se no dissermos nada o modo do nosso parmetro ser,automaticamente, IN;automaticamente, IN;

    TIPODEDADOTIPODEDADO -- indica o tipo de dado do parmetro. Pode ser qualquer tipo de dado do SQL ou doindica o tipo de dado do parmetro. Pode ser qualquer tipo de dado do SQL ou doPL/SQL. Pode usar referencias como %TYPE, %ROWTYPE ou qualquer tipo de dado escalar ouPL/SQL. Pode usar referencias como %TYPE, %ROWTYPE ou qualquer tipo de dado escalar oucomposto. Ateno: no possvel fazer qualquer restrio ao tamanho do tipo de dado nestecomposto. Ateno: no possvel fazer qualquer restrio ao tamanho do tipo de dado nesteponto.ponto.

    IS|ASIS|AS -- a sintaxe do comando aceita tanto IS como AS. Por conveno usamos IS na criao dea sintaxe do comando aceita tanto IS como AS. Por conveno usamos IS na criao deprocedures e AS quando estivermos criando pacotes.procedures e AS quando estivermos criando pacotes.

    BLOCO PL/SQLBLOCO PL/SQL -- indica as aes que sero executadas por aquela procedure.indica as aes que sero executadas por aquela procedure.

  • 8/8/2019 Curso_de_PL_SQL

    20/29

    Exemplo 8Exemplo 8 -- ProcedureProcedure

    CREATE OR REPLACE PROCEDURE aumenta_salCREATE OR REPLACE PROCEDURE aumenta_sal (p_cod_func IN novo.codigo%TYPE)(p_cod_func IN novo.codigo%TYPE)

    ISIS BEGINBEGIN UPDATE novoUPDATE novo SET salario = salario * 1.10SET salario = salario * 1.10 WHERE p_cod_func = codigo;WHERE p_cod_func = codigo; END aumenta_sal;END aumenta_sal;

  • 8/8/2019 Curso_de_PL_SQL

    21/29

    CURSORESCURSORES

    Cursores so trechos alocados de memriaCursores so trechos alocados de memriadestinados a processar as declaraesdestinados a processar as declaraes

    SELECTSELECT. Podem ser definidos pelo prprio. Podem ser definidos pelo prprioPL/SQL, chamados dePL/SQL, chamados de CursoresCursoresImplcitosImplcitos, ou podem ser definidos, ou podem ser definidos

    manualmente, so os chamados demanualmente, so os chamados deCursores ExplcitosCursores Explcitos..

  • 8/8/2019 Curso_de_PL_SQL

    22/29

    Cursores ExplcitosCursores Explcitos

    Esta tcnica exige que o cursor seja declarado manualmente naEsta tcnica exige que o cursor seja declarado manualmente naseoseo DECLAREDECLARE, e deve conter somente declaraes, e deve conter somente declaraes SELECTSELECT..Para a sua utilizao os seguintes passos devem ser observados:Para a sua utilizao os seguintes passos devem ser observados:

    1.1. Declarar o CursorDeclarar o Cursor

    2.2. Abrir o Cursor ( Preparar para sua utilizao )Abrir o Cursor ( Preparar para sua utilizao ) OpenOpen3.3. Buscar os dadosBuscar os dados FetchFetch4.4. Liberar memria aps o uso ( Fechar o Cursor )Liberar memria aps o uso ( Fechar o Cursor ) CloseClose

    NotaNota: O Cursor sempre definido na Seo: O Cursor sempre definido na Seo DECLAREDECLARE e aberto apse aberto apsoo BEGINBEGIN. O nmero de variveis que recebem dados na declarao. O nmero de variveis que recebem dados na declaraoFETCHFETCH deve ser igual ao nmero de campos definidos nadeve ser igual ao nmero de campos definidos nadeclaraodeclarao SELECTSELECT, quando da declarao do cursor. O sucesso ou, quando da declarao do cursor. O sucesso ouinsucesso do cursor determinado pelo testeinsucesso do cursor determinado pelo teste %FOUND%%FOUND% ouou%NOTFOUND%%NOTFOUND%. Este teste deve ser feito antes que o cursor seja. Este teste deve ser feito antes que o cursor sejafechado.fechado.

  • 8/8/2019 Curso_de_PL_SQL

    23/29

    ATRIBUTOATRIBUTO DESCRIODESCRIO

    %ISOPEN%ISOPEN Atributo do tipo Boolean,Atributo do tipo Boolean,

    (True/False), sendo True(True/False), sendo Truequando o cursor est abertoquando o cursor est aberto%NOTFOUND%NOTFOUND Atributo do tipo Boolean, (True/False),Atributo do tipo Boolean, (True/False),

    sendo True quando o ltimo FETCHsendo True quando o ltimo FETCHno retornou linha.no retornou linha.

    %FOUND%FOUND Atributo do tipo Boolean, (True/False),Atributo do tipo Boolean, (True/False),sendo True quando o ltimo FETCHsendo True quando o ltimo FETCHretorna linha.retorna linha.

    %ROWCOUNT%ROWCOUNT Atributo numrico, que retorna oAtributo numrico, que retorna onmero da linha retornada.nmero da linha retornada.

  • 8/8/2019 Curso_de_PL_SQL

    24/29

    Exemplo de cursorExemplo de cursorcreate or replace procedure exempcreate or replace procedure exempisis

    cursor salario_cursor is select * from funcionarios for update;cursor salario_cursor is select * from funcionarios for update;

    v_salario funcionarios%rowtype;v_salario funcionarios%rowtype;beginbeginopen salario_cursor;open salario_cursor;looploopfetch salario_cursor into v_salario;fetch salario_cursor into v_salario;exit when salario_cursor%notfound;exit when salario_cursor%notfound;If v_salario.salario>10000If v_salario.salario>10000

    then Delete from funcionariosthen Delete from funcionarios

    Where current of salario_cursor;Where current of salario_cursor;End if;End if;if (v_salario.salario>=500) and (v_salario.salario=500) and (v_salario.salario=1500) and (v_salario.salario=1500) and (v_salario.salario

  • 8/8/2019 Curso_de_PL_SQL

    25/29

    CursorCursordeclaredeclare

    cursor c_insc_cursor iscursor c_insc_cursor isselect * from alunos_nas_turmas for update;select * from alunos_nas_turmas for update;v_aluno alunos_nas_turmas%rowtype;v_aluno alunos_nas_turmas%rowtype;v_num_insc number(12):=999;v_num_insc number(12):=999;

    beginbeginopen c_insc_cursor;open c_insc_cursor;looploopfetch c_insc_cursor into v_aluno;fetch c_insc_cursor into v_aluno;exit when c_insc_cursor%notfound;exit when c_insc_cursor%notfound;

    if v_aluno.numero_insc>=50 thenif v_aluno.numero_insc>=50 thenupdate alunos_nas_turmasupdate alunos_nas_turmasset numero_insc=v_num_inscset numero_insc=v_num_insc

    where current of c_insc_cursor;where current of c_insc_cursor;v_num_insc :=v_num_insc+1;v_num_insc :=v_num_insc+1;

    end if;end if;end loop;end loop;close c_insc_cursor;close c_insc_cursor;commit;commit;

    endend

  • 8/8/2019 Curso_de_PL_SQL

    26/29

    Outro exemploOutro exemplo

    declaredeclarecursor teste is select * from alunoscursor teste is select * from alunosfor update;for update;v_cidade alunos%rowtype;v_cidade alunos%rowtype;cont int:=1;cont int:=1;beginbeginopen teste;open teste;looploopfetch teste into v_endereco;fetch teste into v_endereco;exit when teste%NOTFOUND;exit when teste%NOTFOUND;if v_cidade= Petrpolisif v_cidade= Petrpolis

    then update alunosthen update alunosset endereco='Rua General Camara'|| cont;set endereco='Rua General Camara'|| cont;cont:=cont+1;cont:=cont+1;

    end if;end if;end loop;end loop;close teste;close teste;end;end;

  • 8/8/2019 Curso_de_PL_SQL

    27/29

    Cursor continuaoCursor continuao

    create or replace procedure exemp2create or replace procedure exemp2isiscursor c_cursos is select * from cursos for update;cursor c_cursos is select * from cursos for update;v_cursos cursos%rowtype;v_cursos cursos%rowtype;beginbegin

    open c_cursos;open c_cursos;looploopfetch c_cursos into v_cursos;fetch c_cursos into v_cursos;exit when c_cursos%notfound;exit when c_cursos%notfound;if v_cursos.duracao>=50if v_cursos.duracao>=50

    then update cursosthen update cursosset preco=preco*1.50set preco=preco*1.50where current of c_cursos;where current of c_cursos;

    end if;end if;if v_cursos.duracao>=20 and v_cursos.duracao=20 and v_cursos.duracao

  • 8/8/2019 Curso_de_PL_SQL

    28/29

    A figura abaixo apresenta os dados da tabela cursos antes da atualizao.A figura abaixo apresenta os dados da tabela cursos antes da atualizao.

  • 8/8/2019 Curso_de_PL_SQL

    29/29

    Figura aps a atualizaoFigura aps a atualizao