Вы находитесь на странице: 1из 20

Funes de valores simples: ABS(n) CEIL(n) FLOOT(n) MOD (m, n) NVL (valor, expresso) POWER (m, exponente) ROUND

(numero [, m]) SIGN (valor) SQRT(n) TRUNC (numero, [m]) VAIRANCE (valor) = Devolve o valor absoluto de (n). =Obtm o valor inteiro imediatamente superior ou igual a n. = Devolve o valor inteiro imediatamente inferior ou igual a n. = Devolve o resto resultante de dividir m entre n. = Substitui um valor nulo por outro valor. = Calcula a potncia de um nmero. = Arredonda nmeros com o nmero de dgitos de preciso indicados. = Indica o signo do valor. = Devolve a raiz quadrada de n. = Trunca nmeros para que tenham uma certa quantidade de dgitos de preciso. = Devolve a mdia de um conjunto de valores.

Funes de grupos de valores: AVG(n ) = Calcula o valor mdio de n ignorando os valores nulos. COUNT (* | Expresso) = Conta o nmero de vezes que a expresso avalia algum dado com valor no nulo. A opo * conta todas as filas selecionadas. MAX (expresso )= Calcula o mximo. MIN (expresso) = Calcula o mnimo. SUM (expresso) = Obtm a soma dos valores da expresso. GREATEST (valor1, valor2)= Obtm o maior valor da lista. LEAST (valor1, valor2) = Obtm o menor valor da lista. Funes que devolvem valores de caracteres: CHR(n) = Devolve o caractere cujo valor em binrio equivalente a n. CONCAT (cad1, cad2) = Devolve cad1 concatenada com cad2. LOWER (cad) = Devolve a cadeia cad em minsculas. UPPER (cad) = Devolve a cadeia cad em maisculas. INITCAP (cad) = Converte a cadeia cad a tipo ttulo. LPAD (cad1, n[,cad2]) = Adiciona caracteres esquerda da cadeia at que tenha uma certa longitude. RPAD (cad1, n[,cad2]) = Adiciona caracteres direita at que tenha uma certa longitude. LTRIM (cad [,set]) = Suprime um conjunto de caracteres esquerda da cadeia. RTRIM (cad [,set]) = Suprime um conjunto de caracteres direita da cadeia. REPLACE (cad, cadeia_busca [, cadeia_substitucao])= Substitui um caractere ou caracteres de uma cadeia com 0 ou mais caracteres. SUBSTR (cad, m [,n]) = Obtm parte de uma cadeia. TRANSLATE (cad1, cad2, cad3)= Converte caracteres de uma cadeia em caracteres diferentes, segundo um plano de substituio marcado pelo usurio. Funes que devolvem valores numricos: ASCII(cad) = Devolve o valor ASCII da primeira letra da cadeia cad. INSTR (cad1, cad2 [, comeco [,m]])= Permite uma busca de um conjunto de caracteres em uma cadeia, mas no suprime nenhum caractere depois. LENGTH (cad) = Devolve o nmero de caracteres de cad. Funes para o manejo de datas: SYSDATE= Devolve a data do sistema. ADD_MONTHS (data, n) = Devolve a data data incrementada em n meses. LASTDAY (data)= Devolve a data do ltimo dia do ms que contm data. MONTHS_BETWEEN (data1, data2)= Devolve a diferena em meses entre as datas data1 e data2. NEXT_DAY (data, cad) = Devolve a data do primeiro dia da semana indicado por cad depois da data indicada por data.

Funes de converso: TO_CHAR TO_DATE TO_NUMBER = Transforma um tipo DATE ou NUMBER em uma cadeia de caracteres. = Transforma um tipo NUMBER ou CHAR em DATE. = Transforma uma cadeia de caracteres em NUMBER.

Outras dicas sobre manipulao de datas Uma das maiores dificuldades com relao ao gerenciamento e manipulao de bases de dados est relacionado a manipulao de datas, no PL-SQL do Oracle, acho que isso no um problema. Irei comear com a converso de string para data (uso da funo TO_DATE), mas no Oracle existem vrias outras funes de data que so muito fceis para manipular datas. Abordarei as mesmas em outros artigos. O TO_DATE recebe 1 parametro obrigatrio e dois opcionais como se segue: to_date( string1, [ format_mask ], [ nls_language ] ) O parametro string1 obviamente a string com o valor que ser convertido para a data, ou seja 01/01/2011, ou 2011/01/01 e muitos outros possveis dependendo do formato que est configurado no Oracle ou ento do formato que voc especificar no parametro format_mask. O ltimo parametro, quase no usado, ele para definir a linguagem para assim obter qual o formato padro daquela lingua. O parametro format_mask ser um string com um padro definido, o qual deve seguir as seguintes opes: Parametro YEAR YYYY YYY YY Y IYY IY I IYYY RRRR Ano por extenso Ano com 4 digitos Ultimos 3, 2 e 1 digitos do ano. Explicao

Ultimos 3, 2 e 1 digitos do ano ISO. Ano ISO com 4 digitos Esse foi o modo de se proteger do bug do milenio, ele aceita dois digitos de ano se for abaixo de 49 assume como 20XX, se for acima de 49 assume como 19XX. Trimestre (1 = JAN-MAR, 2 = ABR-JUN, 3 = JUL-SET, 4 = OUT-DEZ). Mes (01-12; JAN = 01). Mes por extenso abreviado. Nome do mes por extenso. Mes em algarismos romanos. Semana do ano. Semana do mes. Semana do ano com base no Ano ISO.

Q MM MON MONTH RM WW W IW

D DAY DD DDD DY J HH HH12 HH24 MI SS SSSSS FF AM, A.M., PM, ou P.M. TZH TZM TZR

Dia da semana. Dia da semana por extenso. Dia do mes. Dia do ano. Abreviao do nome do dia. Julian day; O nmero do dia desde 1, de Janeiro de 4712 Antes de Cristo. Hora do dia no formato 1-12. Hora do dia no formato 1-12. Hora do dia no formato 0-23. Minuto. Segundos. Segundos passados da meia-noite. Milisegundos, indique a quantidade de digitos na frente do FF, por exemplo 4 digitos seria FF4. Indicador de hora (Antes do Meio-dia, Pos meio dia) Hora com fuso. Minuto com fuso. Fuso.

Com todos esses padres voc pode usar tanto para obter uma informao, como para formatar uma data. No caso do TO_DATE, ser s para formatar a data, ou seja, dizer o que voc quer que a data contenha. Vamos a exemplos: Atribuindo uma data simples: view source print?
1 select to_date('01/01/2011','DD/MM/YYYY') from dual;

Veja no cdigo que inclusive a string / usada na separao tambm utilizada na mscara, funcionando como uma mscara padro. Esse exemplo ir retornar uma data no formato oracle, com dia, mes e ano informados e horas, minutos zerados. Formatando uma data com hora: view source print?
1 select to_date('01/01/2011 21:10:05','DD/MM/YYYY HH24:MI:SS') from dual;

Nesse exemplo, j mostra a adio de hora, minuto e segundo. Creio que com esses exemplos e a tabela de padres, seja suficiente para fazer vrias outras combinaes, caso tenha alguma dvida, por favor s fazer nos comentrios que terei prazer em responder.

Funes - Functions no Oracle


segunda-feira, julho 20th, 2009

Ao contrrio das procedures as Funes (ou Functions) so blocos PL/SQL que devem obrigatoriamente retornar ao menos um valor. Uma funo manipula o contedo de uma coluna em uma declarao SQL. Ao se usar uma funo em uma declarao SQL, o valor da coluna sobre o qual a funo executada alterado quando apresentado. Sintaxe Bsica: CREATE [OR REPLACE] FUNCTION nome_da_funo [( parameter1 [ mode1] datatype1, parameter2 [ mode2] datatype2, . . .)] RETURN tipo_de_dado IS|AS Bloco PL/SQL; Ao contrrio das procedures as funes tem que retornar ao menos um valor. CREATE OR REPLACE FUNCTION pega_sal (p_id IN emp.empno%TYPE) RETURN NUMBER IS v_sal emp.sal%TYPE :=0; BEGIN SELECT sal INTO v_sal FROM scott.emp WHERE empno = p_id; RETURN v_sal; END pega_sal; / Executando VARIABLE g_sal NUMBER EXECUTE :g_sal := pega_sal(7839) PRINT g_sal Funo para calcular CPMF CREATE OR REPLACE FUNCTION cpmf(p_value IN NUMBER) RETURN NUMBER IS BEGIN RETURN (p_value * 0.038); END cpmf; / SELECT empno, ename, sal, cpmf(sal) FROM scott.emp WHERE deptno = 10;

Oracle - Trigger

segunda-feira, julho 13th, 2009

Boa tarde pessoal, Como foi o final de semana? Deu para descansar um pouco? Espero que sim! Vamos retomar nossos estudos? Voc ja ouviu falar em gatilho do Banco de dados ou mais conhecido como triggers? Ento vamos l: Triggers so procedimentos que podem ser gravados em Java, PL/SQL ou C. So executados (ou disparados) implicitamente quando uma tabela modificada, um objeto criado ou ocorrem algumas aes de usurio ou de sistema de banco de dados. As triggers so similares as stored procedures diferindo, apenas, na maneira como so chamadas. A trigger executada implicitamente quando ocorre algum evento de trigger enquanto a stored procedure deve ser executado explicitamente. Uma trigger composta por quatro partes: - Momento - Evento - Tipo - Corpo O momento define quando uma trigger ir ser acionada. Pode ser: - BEFORE (tabela) - AFTER (tabela) - INSTEAD OF (view) BEFORE indica que os comandos PL/SQL do corpo da trigger sero executados ANTES dos dados da tabela serem alterados. Normalmente usamos BEFORE nos casos em que precisamos incializar variveis globais, validar regras de negcios, alterar o valor de flags ou para salvar o valor de uma coluna antes de alterarmos o valor delas. Exemplo: CREATE OR REPLACE TRIGGER novo_func BEFORE . . . END; / AFTER indica que os comando PL/SQL do corpo da trigger ser executado APS os dados da tabela serem alterados. Normalmente usamos AFTER para completar os dados de outras tabelas e para completar a atividade de outra trigger de momento BEFORE. Exemplo: CREATE OR REPLACE TRIGGER novo_func AFTER . . . END; / INSTEAD OF indica que a trigger ir ser executada no lugar da instruo que disparou a trigger. Literalmente, a instruo substituda pela trigger. Essa tcnica permite que faamos, por exemplo, alteraes em uma tabela atravs de uma view. usado nos casos em que a view no pode alterar uma tabela por no

referenciar uma coluna com a constraint not null. Nesse caso a trigger pode atualizar a coluna que a view no tem acesso. Dois detalhes muito importantes sobre INSTEAD OF: - S funcionam com views e - sempre de linha. Ser considerado assim, mesmo que FOR EACH ROW for omitido. Exemplo: CREATE OR REPLACE TRIGGER novo_func INSTEAD OF INSERT ON vemp FOR EACH ROW WHEN . . . END; / O evento define qual a instruo DML que aciona a trigger. Informa qual instruo SQL ir disparar a trigger. Pode ser: - INSERT - UPDATE - DELETE Quando o evento for um UPDATE podemos informar quais colunas que, ao serem alteradas, iro disparar a trigger. O mesmo NO ocorre com INSERT e DELETE porque essas instrues sempre afetam a linha por inteiro. Exemplo: CREATE OR REPLACE TRIGGER novo_func AFTER INSERT ON emp . . . END; / O evento pode conter uma, duas ou todas as trs operaes DML em uma nica linha de comando. Exemplo: CREATE OR REPLACE TRIGGER novo_func BEFORE INSERT OR UPDATE OR DELETE ON emp . . . END; / O tipo define quantas vezes uma trigger ser executada. A trigger pode ser executada uma vez para a instruo que a disparou ou ser disparada para cada linha afetada pela instruo que disparou a trigger. Pode ser: - Instruo (STATEMENT) - Linha (ROW) Quando a trigger for do tipo instruo ela ser disparada uma vez para cada evento de trigger, mesmo que nenhuma linha tenha sido afetada. So teis para aquelas trigger que eventualmente no alteram dados ou para

situaes onde o que queremos uma resposta da trigger, por exemplo, em uma restrio complexa de negcio. Por DEFAULT toda trigger deste tipo. Exemplo: CREATE OR REPLACE TRIGGER novo_func BEFORE INSERT OR UPDATE OR DELETE ON emp FOR EACH STATEMENT . . . END; / Quando a trigger for do tipo linha, a trigger ser executada toda vez que a tabela for afetada pelo evento da trigger. Se nenhuma linha for afetada a trigger no ser executada. So muito teis quando a ao da trigger depende dos dados afetados pelo evento da trigger. Exemplo: CREATE OR REPLACE TRIGGER novo_func BEFORE INSERT OR UPDATE OR DELETE ON emp FOR EACH ROW . . . END; / O corpo define a ao que uma trigger ir executar quando acionada. O corpo de uma trigger composto por um bloco PL/SQL, a chamada de uma PROCEDURE ou por um procedimento JAVA. Por definio, o tamanho de uma trigger no pode ultrapassar 32K. Como, normalmente, precisamos trabalhar com os valores antes e depois da alterao dos dados, a trigger permite que faamos referencia aos valores antes da alterao (OLD) e aps a alterao (NEW). O nome de uma trigger deve ser nico dentro de um mesmo esquema, e sua sintaxe bsica : CREATE [OR REPLACE] TRIGGER [schema.] nome_da_trigger [BEFORE|AFTER] [DELETE|OR INSERT|OR UPDATE[OF coluna]] ON [schema.] nome_da_tabela_ou_da_view [REFERENCING [OLD [AS] OLD] [NEW [AS] NEW] [FOR EACH ROW] [WHEN [condio]] BLOCO PL/SQL Onde: Nome_da_trigger o nome da trigger; Nome_da_tabela_ou_da_view indica a tabela ou view associada com a trigger; Corpo_da_trigger a ao que a trigger ir executar. Inicia por DECLARE ou BEGIN e termina por END. Tambm pode conter a chamada de um procedimento. O uso do nome da coluna na clusula UPDATE pode aumentar a performance porque a trigger s ser disparada quando aquela coluna especificada na clusula for alterada. Agora que sabemos como criar uma trigger veremos um exemplo completo:

Primeiro vamos criar uma tabela para gravar um registro de todos os usurios que se conectaram ao banco: CREATE TABLE vigia (marca VARCHAR2(100)); CREATE OR REPLACE TRIGGER marca_logon AFTER LOGON ON DATABASE BEGIN INSERT INTO sys.vigia VALUES (USER || entrou no sistema em || TO_CHAR(sysdate, DD-MM-YYYY HH24:MI:SS)); COMMIT; END; / Pronto, temos nossa primeira trigger. Ela registra o nome do usurio e a que horas ele entrou. Esse exemplo foi retirado diretamente da documentao Oracle. No nosso exemplo fazemos referencia a um evento do sistema ao invs de referenciarmos uma tabela. Outros eventos do sistema so: - AFTER SERVERERROR - AFTER LOGON - BEFORE LOGOFF - AFTER STARTUP - BEFORE SHUTDOWN Voc pode criar triggers usando os eventos acima para DATABASE e SCHEMA. As duas excees so SHUTDOWN e STARTUP que s se aplicam a DATABASE. Exemplo: CREATE OR REPLACE TRIGGER marca_logoff BEFORE LOGOFF ON SCHEMA BEGIN INSERT INTO sys.vigia VALUES (USER || saiu do sistema em || TO_CHAR(sysdate, DD-MM-YYYY HH24:MI:SS)); COMMIT; END; / Eventualmente podemos ter algum tipo de erro em nossa trigger. Para verificar quais so os erros de compilao que temos na trigger basta usar o comando SHOW ERRORS TRIGGER nome_da_trigger. Caso voc queira ver os erros de compilao da ltima trigger que voc compilou pode escrever apenas SHOW ERRORS ou SHO ERR. Ao executarmos esse comando ele mostrar a linha onde est o erro. Ateno: caso a linha onde est o erro se estenda por mais de uma linha, este comando indicar o incio da linha. Vamos criar uma trigger com erro para servir como exemplo: CREATE OR REPLACE TRIGGER marca_logon AFTER LOGON ON DATABASE BEGIN INSERT INTO sys.vigia VALUES (USER || entrou no sistema em || TO_CHAR(sysdate, DD-MM-YYYY HH24:MI:SS)); COMMIT; END; / Gatilho criado com erro de compilao

Qual o erro desse gatilho? um erro bem banal, no caso deixamos de fechar a apstrofe (ou aspas simples ou quote) no final da instruo TO_CHAR. Ao executarmos o SHOW ERROR ele ir mostrar que houve um erro na linha 4. Isso porque ele aponta onde a linha que contem o erro comeou a ser escrita e no a linha onde efetivamente ocorreu o erro est. Caso precise de mais informaes sobre sua trigger, a view USER_TRIGGERS pode fornecer informaes muito teis. Exemplo: SELECT trigger_name FROM user_triggers; Com o nome da trigger que voc deseja analisar execute o comando: SELECT trigger_type, table_name, triggering_event FROM user_triggers WHERE trigger_name = nome_da_trigger; Ou, se precisar obter o cdigo usado para gerar a trigger: SELECT trigger_name, trigger_type, triggering_event, table_name, referencing_names, status, trigger_body FROM user_triggers WHERE trigger_name = nome_da_trigger; Caso descubra que no precisa mais da trigger existe duas formas de tratar a situao. Eliminar a trigger ou desabilit-la. Eliminando a trigger: DROP TRIGGER nome_da_trigger; Caso prefira apenas desabilitar a trigger use o comando: ALTER TRIGGER nome_da_trigger DISABLE; Quando a trigger criada pela primeira vez ela habilitada automaticamente. Para habilitar a trigger novamente basta usar o comando: ALTER TRIGGER nome_da_trigger ENABLE; Mas vamos continuar criando nossas triggers. O prximo caso vai nos ajudar a impedir que algum cadastre um funcionrio fora do horrio de expediente: CREATE TABLE nova_emp AS SELECT * FROM SCOTT.EMP; CREATE OR REPLACE TRIGGER hora_exp BEFORE INSERT ON nova_emp BEGIN IF (TO_CHAR(sysdate,DY) IN (SAB,'DOM)) OR (TO_CHAR(sysdate,HH24:MI) NOT BETWEEN 08:30 AND 17:30) THEN RAISE_APPLICATION_ERROR (-20500,Voc s pode atualizar os empregados no horrio de expediente); END IF;

END; / Essa trigger pode ser refinada para testar os predicados condicionais. Por exemplo: CREATE OR REPLACE TRIGGER hora_exp BEFORE INSERT OR UPDATE OR DELETE ON nova_emp BEGIN IF (TO_CHAR(sysdate,DY) IN (SAB,'DOM)) OR (TO_CHAR(sysdate,HH24:MI) NOT BETWEEN 08:30 AND 17:30) THEN IF DELETING THEN RAISE_APPLICATION_ERROR (-20500,Voc s pode excluir empregados no horrio de expediente); ELSIF INSERTING THEN RAISE_APPLICATION_ERROR (-20502,Voc s pode incluir empregados no horrio de expediente); ELSIF UPDATING (SAL) THEN RAISE_APPLICATION_ERROR (-20504,Voc s pode alterar salarios no horrio de expediente); ELSE RAISE_APPLICATION_ERROR (-20506,Voc s pode Fazer alteraes no horrio de expediente); END IF; END IF; END; / Vamos ver como usar valores OLD e NEW: Primeiro vamos criar uma tabela para conter os dados do nosso histrico. CREATE TABLE DDUR (USUARIO VARCHAR2(15), HORARIO DATE, EMPNO NUMBER(4), ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2)) / Agora vamos criar nossa trigger. Ela deve registrar tudo o que fizermos em nossa tabela. CREATE OR REPLACE TRIGGER hist_emp AFTER INSERT OR UPDATE OR DELETE ON nova_emp FOR EACH ROW BEGIN INSERT INTO ddur VALUES( user, sysdate, :OLD.empno, :OLD.ename, :OLD.job, :OLD.mgr, :OLD.hiredate, :OLD.sal, :OLD.comm, :OLD.deptno); END; /

A referncia :OLD indica que estamos usando os valores antes da alterao. Caso quisssemos usar o valor atualizado a referencia seria :NEW. Ambas podem ser usadas na mesma trigger. Por exemplo, nossa trigger poderia ter sido escrita assim: CREATE OR REPLACE TRIGGER hist_emp AFTER INSERT OR UPDATE OR DELETE ON nova_emp FOR EACH ROW BEGIN INSERT INTO ddur VALUES( user, sysdate, :NEW.empno, :NEW.ename, :OLD.JOB, :NEW.MGR, :OLD.HIREDATE, :OLD.sal, :OLD.comm, :OLD.deptno); END; / Voc pode usar :OLD e :NEW em comparaes dentro da sua trigger, montando estruturas PL/SQL cada vez mais complexas. Por exemplo: CREATE OR REPLACE TRIGGER aumento BEFORE UPDATE OF sal ON emp FOR EACH ROW BEGIN IF (:NEW.sal - :OLD.sal) < :OLD.sal * 0.025 THEN RAISE_APPLICATION_ERROR (-20512, Favor corrigir indice); END IF; END; No caso acima, se o aumento de salrio for inferior a 2,5% o sistema avisa que houve um erro na alterao salarial. Em um outro exemplo, mas agora com WHEN CREATE OR REPLACE TRIGGER ver_sal BEFORE INSERT OR UPDATE OF sal, job ON empl FOR EACH ROW WHEN (NEW.job_id PRESIDENT) DECLARE v_minsal emp.sal%TYPE; v_maxsal emp.sal%TYPE; BEGIN SELECT MIN(sal), MAX(sal) INTO v_minsal, v_maxsal FROM emp WHERE job = :NEW.job; IF :NEW.sal v_maxsal THEN RAISE_APPLICATION_ERROR(-20515,Salario invlido); END IF; END; / UPDATE emp SET sal = 3400 WHERE ename = BLAKE; Neste caso estamos garantido que ningum que for contratado com o cargo diferente de PRESIDENT ir receber um salrio menor que o menor salrio de seu cargo ou um salrio maior que o maior salrio de seu cargo.

Uma trigger pode ser bem mais simples do que os exemplos acima. Por exemplo, se quisermos implementar uma restrio onde o salrio do funcionrio nunca possa ser reduzido, basta aplicarmos a trigger: CREATE OR REPLACE TRIGGER veri_sal BEFORE UPDATE OF sal ON emp FOR EACH ROW WHEN (NEW.sal < OLD.sal) BEGIN RAISE_APPLICATION_ERROR (-20508, O salrio no pode ser reduzido); END; / Para que um usurio crie suas prprias triggers ele precisa ter o privilgio de sistema CREATE TRIGGER e ser o proprietrio da tabela onde ir criar a trigger. Caso no seja proprietrio ele deve ter o privilgio de sistema ALTER ou ALTER ANY TABLE. Caso precise criar triggers para eventos do banco de dados deve ter o privilgio de ADMINISTER DATABASE TRIGGER. Caso a trigger faa chamada de alguma procedure, quem estiver criando a trigger deve ter o privilgio de EXECUTE na procedure. Como podemos notar as trigger podem ser usadas de forma bem flexvel. Com elas podemos gerar mecanismos de segurana mais flexveis, auditar dados de tabelas e implementar regras de negcios com mais facilidade. Fonte: http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=322 Autor: Milton Goya Abraos galera! Postado em PL/SQL | 1 Comentrio

Procedimentos (stored procedure)


quarta-feira, julho 8th, 2009

Boa tarde pessoal, Resolvi dedicar este post a um assunto muito importante dentro de PL/SQL e importantssimo para quem deseja trabalhar com Oracle: Procedure. Ainda sente dvida em Procedure? Ento leia este post: Procedimentos (stored procedure) Uma procedure nada mais que 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 privilgio 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 entendimento: 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 2850 7782 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 impacto no 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; / Com nossa alterao o valor passado em nosso parmetro no gravado no arquivo de redo log e nem no segmento de rollback. Isso implica que, neste caso, NO POSSVEL FAZER ROLLBACK. A documentao Oracle afirma que h ganho de performance de 30% a 200% nos casos em que tabelas PL/SQL eram passadas como parmetro na procedure. Notem que a procedure pde ser chamada atravs do comando CALL quanto pelo comando EXECUTE. Isso ocorre porque uma procedure pode ser chamada a partir de qualquer uma das ferramentas de desenvolvimento Oracle como, por exemplo, o SQL*Plus. Uma das vantagens das procedures que elas podem ser chamadas a partir de uma aplicao, de outra procedure, de uma trigger e at mesmo a partir de uma simples query. Exemplo: BEGIN AUMENTA_SAL(7839); END; / Durante a criao de nossa procedure pode ocorrer algum erro. Nesse caso ser mostrada uma mensagem semelhante a esta: Aviso: Procedimento criado com erros de compilao. Ou MGR-00072: Warning: Procedure AUMENTA_SAL created with compilation errors Nesse caso o erro pode ser determinado atravs do SHOW ERROR pode ser usado para listar a linha/coluna onde o erro ocorreu. O comando SHOW ERROR sem parmetros adicionais mostra os erros da ltima compilao. Podemos qualificar o comando usando o nome de nosso pacote, procedure, funo, trigger ou corpo de pacote. Por exemplo: SHOW ERROR aumenta_sal Ou SHOW ERROR PROCEDURE aumenta_sal

Vamos criar uma procedure com erro para ver como o comando funciona: CREATE OR REPLACE PROCEDURE mand_embora (emp_num NUMBER) IS BEGIN DELETE FROM emp WHER empno = emp_num; END / Notem que falta a letra E em WHERE e falta um ponto-e-vrgula no final de END. Ao executarmos o SHOW ERROR teremos: SQL> SHOW ERROR Erros para PROCEDURE MAND_EMBORA: LINE/COL ERROR 5/14 PLS-00103:Encontrado o smbolo EMPNO quando um dos seguintes smbolos era esperado: ; return returning where O smbolo where foi substitudo por EMPNO para continuar. 7/0 PLS-00103: Encontrado o smbolo end-of-file quando um dos seguintes smbolos era esperado: ; delete exists prior O smbolo ; foi substitudo por end-of-file para continuar. Notem que foram listadas as linhas e a colunas onde ocorreram os erros. O ponto-e-vrgula foi mostrado na linha 7 porque s no momento em que foi encerrado o bloco PL/SQL que o compilador notou a falta do ltimo ponto-e-vrgula. O SHOW ERROR muito til, mas, eventualmente, temos necessidade de obter mais dados sobre os erros. Neste caso possvel consultar as views de dicionrio de dados: USER_ERRORS ALL_ERRORS DBA_ERRORS Caso haja necessidade possvel obter o cdigo fonte da procedure atravs das views de dicionrio de dados ALL_SOURCE, USER_SOURCE e DBA_SOURCE. Exemplo: SELECT text FROM user_source WHERE name = MAND_EMBORA ORDER BY line; Eventualmente podemos precisar ver todas procedures e todas as funoes do nosso usurio. Nesse caso podemos usar: COL FOR object_name A35 SELECT object_name, object_type FROM user_objects WHERE object_type in (PROCEDURE, FUNCTION)ORDER BY object_name;

Caso precisemos apenas dos argumentos de nossa procedure o comando DESC permite identifica-los rapidamente. Exemplo: DESC mand_embora Vejamos o uso de uma chamada de procedure com o uso do modo OUT. Vamos criar uma procedure que consulte a tabela de empregados atravs do nmero do empregado e retorne o salrio e o cargo do mesmo. CREATE OR REPLACE PROCEDURE query_emp (p_empid IN emp.empno%TYPE, p_sal OUT emp.sal%TYPE, p_job OUT emp.job%TYPE) IS BEGIN SELECT sal, job INTO p_sal, p_job FROM scott.emp WHERE empno = p_empid; END query_emp; / Agora vamos usar nossa procedure. Note que ela deve ser chamada com um parmetro de entrada e com dois parmetros de sada. Vamos declarar duas variveis globais para receber os valores da procedure: G_SAL e G_JOB: VARIABLE g_sal NUMBER VARIABLE g_job VARCHAR2(15) EXECUTE query_emp (7900, :g_sal, :g_job) PRINT g_sal PRINT g_job Caso no usemos todos os parmetros definidos para nossa procedure quando formos cham-la teremos um erro: SQL> call query_emp(7900); call query_emp(7900) * ERRO na linha 1: ORA-06553: PLS-306: nmero incorreto de tipos de argumentos na chamada para QUERY_EMP Tambm ocorrer um erro caso o empregado pesquisado no exista. Exemplo: SQL> EXECUTE query_emp (120, :g_sal, :g_job) BEGIN query_emp (120, :g_sal, :g_job); END; * ERRO na linha 1: ORA-01403: dados no encontrados ORA-06512: em SYS.QUERY_EMP, line 7 ORA-06512: em line 1 Esse tipo de erro pode ser tratado pelo prprio programador. Vamos criar uma procedure que elimine todos os funcionrios com o cargo que for informado pelo usurio e apresente um erro caso o cargo no exista: CREATE OR REPLACE PROCEDURE del_job (p_jobid IN emp.job%TYPE) IS BEGIN DELETE FROM scott.emp WHERE job = p_jobid; IF SQL%NOTFOUND THEN RAISE_APPLICATION_ERROR(-20203,Cargo no existe.); END IF;

END DEL_JOB; / Ao executarmos nossa procedure com um cargo que no exista obteremos a mensagem de erro que definimos: SQL> execute del_job(Presidente) BEGIN del_job(Presidente); END; * ERRO na linha 1: ORA-20203: Cargo no existe. ORA-06512: em SYS.DEL_JOB, line 8 ORA-06512: em line 1 Veja, logo aps linha 1: o cdigo de erro Cargo no existe. Vamos ver como uma procedure pode agir como um subprograma. Primeiro vamos criar uma procedure para calcular o valor de Delta. CREATE OR REPLACE PROCEDURE delta (p_a IN number, p_b IN number, p_c IN number, p_delta OUT number) IS BEGIN p_delta := (p_b * p_b) - (4 * p_a * p_c); END delta; / Agora vamos criar uma procedure que calcule o valor das razes de delta: CREATE OR REPLACE PROCEDURE eq2g (p_a IN number, p_b IN number, p_c IN number, p_x1 OUT number, p_x2 OUT number) IS p_delta NUMBER; BEGIN delta(p_a, p_b, p_c, p_delta); IF p_delta < 0 then p_x1 := -1; p_x2 := -1; ELSE p_x1 := -1 * p_b + sqrt(p_delta)/(2 * p_a); p_x2 := -1 * p_b - sqrt(p_delta)/(2 * p_a); end if; end eq2g; / Notem que P_DELTA foi declarado depois de IS, mas sem um DECLARE. Isto foi feito porque em uma procedure no aceita DECLARE e sua seo de declarao fica entre IS e BEGIN. Nossa procedure est chamando a procedure DELTA para calcular o delta de nossa equao. Agora vamos executar nossa procedure. VARIABLE g_x1 NUMBER VARIABLE g_x2 NUMBER EXECUTE eq2g (1, 4, 2, :g_x1, :g_x2) PRINT g_x1 PRINT g_x2 Em nossa procedure quando o delta for negativo, os valores das razes X1 e X2 retornam com -1. claro que existem solues melhores do que esta, trabalhar com razes imaginrias ou dar uma mensagem de erro quando isso acontecer.

Fonte: http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=335 Autor: Milton Goya Grande abrao e sucesso! Postado em PL/SQL | 8 Comentrio

PL/SQL - Introduo
quarta-feira, julho 1st, 2009

Bom dia meus amigos, Como andam os estudos em oracle? Esto achando a tecnologia muito complexa? Acham que no vai dar conta de aprender? Calma normal esse tipo de pensamento no incio. Essa rea como qualquer outra exige muita dedicao e persistncia. Com o tempo, tudo ser claro e de fcil entendimento pra vocbasta estudar e prticar bastante!!! Seguindo a ordem, no post anterior, comentei um pouco a respeito de SQL, que o ponta p inicial para comear os estudos e entender a Oracle, e tambm serve de pr-requisito para adentrar em PL/SQL. Vamos l? PL/SQL Sobre PL/SQL A linguagem PL/SQL (Procedural Language/SQL) uma extenso de linguagem procedural do SQL, a linguagem de acesso a dados padro para bancos de dados relacionais. O PL/SQL uma linguagem proprietria da Oracle Corporation. *Benefcios da Linguagem PL/SQL Integrao - A linguagem PL/SQL desempenha um papel central tanto para o Oracle Server atravs de procedimentos armazenados, funes armazenadas, gatilhos de banco de dados e pacotes. - Alm de os tipos de dados SQL tambm serem usados no cdigo PL/SQL. -Combinados com o acesso direto que a linguagem SQL fornece, esses tipos de dados compartilhados integram a linguagem PL/SQL com o dicionrio de dados do Oracle Server. Melhora o Desempenho - Reduz o Trfego da Rede, visto que ele agrupa as instrues SQL em um nico bloco e envia esse bloco inteiro para o servidor em uma nica chamada. - A linguagem PL/SQL tambm pode cooperar com as ferramentas de desenvolvimento de aplicao do Oracle Server como, por exemplo, Oracle Developer Forms e Reports. Ao adicionar recursos de processamento procedural a essas ferramentas, a linguagem PL/SQL aumenta o desempenho. *Estrutura de Bloco PL/SQL DECLARE Opcional Variveis, cursores, excees definidas pelo usurio BEGIN Obrigatrio Instrues SQL Instrues PL/SQL

EXCEPTION Opcional Aes a serem desempenhadas quando ocorrem erros END; Obrigatrio - A linguagem PL/SQL uma linguagem estruturada em blocos, o que significa que os programas podem ser divididos em blocos lgicos. Um bloco PL/SQL consiste em at trs sees: declarativa (opcional), executvel (necessria) e tratamento de exceo (opcional). Seo Declarativa/Declare: Contm todas as variveis, constantes, cursores e excees definidas pelo usurio que so referenciadas nas sees executvel e declarativa (Opcional) Seo Executvel/Begin: Contm instrues SQL para manipular dados no banco de dados e instrues PL/SQL para manipular dados no bloco (Obrigatria) Seo Tratamento de exceo/ Exception: Especifica as aes a desempenhar quando erros e condies anormais surgem na seo executvel (Opcional). Observaes: - Em PL/SQL, um erro chamado de exceo. - As unidades bsicas procedimentos e funes, tambm so conhecidas como subprogramas. - Uma funo similar a um procedimento, exceto que uma funo deve retornar um valor. - Subprogramas so blocos PL/SQL nomeados que podem assumir parmetros e podem ser chamados. Voc pode declar-los como procedimentos ou como funes. *Tipos de Blocos Toda unidade PL/SQL compreende um ou mais blocos. Onde esses blocos podem ser inteiramente separados ou aninhados um dentro do outro. Existem 3 tipos de blocos: Annimo BEGIN statements [EXCEPTION] END; Procedimento PROCEDURE name IS BEGIN statements [EXCEPTION] END; Funo FUNCTION name RETURN datatype IS BEGIN statements RETURN value; [EXCEPTION] END; - Blocos annimos: so blocos sem nome. Eles so declarados em um ponto do aplicativo onde eles devem ser executados e so passados para o mecanismo PL/SQL para serem executados em tempo de execuo.

- Bloco de Procedimento/Procedural: 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. - Bloco Funo: um bloco PL/SQL nomeado, semelhante ao Procedural, porm retorna valor.

Вам также может понравиться