1 - Nunca esqueça de usar o ; para finalizar uma bloco PL/SQL.
SQL> begin
2 dbms_output('não esqueça de usar ;');
3 end
4 /
end
*
ERRO na linha 3:
ORA-06550: linha 3, coluna 3:
PLS-00103: Encontrado o símbolo "end-of-file" quando um dos seguintes símbolos
era esperado:
;
O símbolo ";" foi substituído por "end-of-file" para continuar.
SQL> begin
2 dbms_output.put_line('o ; finaliza um bloco PL/SQL');
3* end;
SQL> /
Procedimento PL/SQL concluído com sucesso.
SQL>
2 - Uma tipo VARCHAR2 tem 4000 bytes de comprimento no banco mas em PL/SQL o limite
sobe para 32767 bytes.
3 - Existem dois subtipos para o tipo VARCHAR2: VARCHAR e STRING. A ORACLE recomenda
que não se usem estes dois subtipos, pois existe apenas para compatibilidade com
outras marcas de banco de dados e também com o padrão SQL.
SQL>
1 declare
2 x varchar2(100);
3 y string(100);
4 z varchar(100);
5 begin
6 x:= 'Use sempre o tipo VARCHAR2 ';
7 y:= 'em vez de subtipos STRING ';
8 z:= 'ou VARCHAR.';
9 dbms_output.put_line(x || y || z);
10* end;
SQL> /
Use sempre o tipo VARCHAR2 em vez de subtipos STRING ou VARCHAR.
Procedimento PL/SQL concluído com sucesso.
SQL>
4 - Ao declarar uma variável VARCHAR2 dentro de um procedimento
armazenado sempre especifique o comprimento ou um erro ocorrerá.
5 - Ao invocar uma função que não retorne valor um erro será levantado.
6 - A comparação entre variáveis VARCHAR2 e CHAR pode retornar falso, pois
o tipo CHAR é fixo.
SQL> declare
2 x1 varchar2(10);
3 x2 char(10);
4 begin
5 x1:= 'agilar';
6 x2:= 'agilar';
7 if x1 = x2 then
8 dbms_output.put_line('exatamente iguais');
9 else
10 dbms_output.put_line('diferente!');
11 end if;
12 end;
13 /
Procedimento PL/SQL concluído com sucesso.
SQL> set serveroutput on
SQL> /
diferente!
Procedimento PL/SQL concluído com sucesso.
7 - Use funções e procedimentos aninhados para obter modularidade.
SQL>
1 declare
2 x1 number;
3 x2 number;
4 procedure troca(x in out number, y in out number)
5 as
6 temp number;
7 begin
8 temp:= x;
9 x:= y;
10 y:= temp;
11 end;
12 begin
13 x1:= 100;
14 x2:= 200;
15 dbms_output.put_line(x1);
16 dbms_output.put_line(x2);
17 troca(x1, x2);
18 dbms_output.put_line(x1);
19 dbms_output.put_line(x2);
20* end;
SQL> /
100
200
200
100
Procedimento PL/SQL concluído com sucesso.
8 - Não use os tipos obsoletos: LONG, RAW e LONG RAW.
9 - Use PLS_INTEGER em vez de BINARY_INTEGER em aplicativos novos para obter performance.
10 - Cuidado com o escopo das variáveis. Uma variável pode ser referenciada
apenas dentro do bloco em que foi declarado.
SQL>
1 declare
2 x varchar2(10):= 'everton';
3 begin
4 declare
5 y varchar2(10):= 'agilar';
6 begin
7 dbms_output.put_line(x);
8 dbms_output.put_line(y);
9 end;
10 dbms_output.put_line(y); -- erro pois y está declarado dentro do bloco anterior
11* end;
SQL> /
dbms_output.put_line(y);
*
ERRO na linha 10:
ORA-06550: linha 10, coluna 23:
PLS-00357: A referência 'Y' Ó Tabela, View ou Seqência não permitida neste
contexto
ORA-06550: linha 10, coluna 2:
PL/SQL: Statement ignored
SQL>
11 - Exemplos de uso da função CAST
SQL> select cast(123.1254 as number(12,3)) as num from dual;
NUM
----------
123,125
SQL> select cast(123.1254 as number(12,2)) as num from dual;
NUM
----------
123,13
SQL> select cast(123.1254 as number(12,1)) as num from dual;
NUM
----------
123,1
SQL> select cast(123.1254 as number(12,0)) as num from dual;
NUM
----------
123
SQL> select cast(123.1254 as number(12,-1)) as num from dual;
NUM
----------
120
SQL> select cast(123.1254 as number(12,-2)) as num from dual;
NUM
----------
100
SQL> select cast(123.1254 as number(12,-3)) as num from dual;
NUM
----------
0
SQL>
12 - Você pode usar o operador de exponenciação em PL/SQL mas não em SQL.
SQL> l
1 declare
2 x number:= 10;
3 y number:= 2;
4 begin
5 dbms_output.put_line(x**y);
6* end;
SQL> /
100
Procedimento PL/SQL concluído com sucesso.
SQL> select 10**2 from dual;
select 10**2 from dual
*
ERRO na linha 1:
ORA-00936: expressão não encontrada
13 - É possível atribuir um valor durante a declaração da variável.
SQL> l
1 declare
2 pi number:= 3.14;
3 x number;
4 y number:= 10;
5 begin
6 dbms_output.put_line('O número PI is '|| to_char(pi));
7* end;
SQL>
14 - Operadores de desigualdade da PL/SQL: <>, != e ~=
1 begin
2 if 1 != 2 then
3 dbms_output.put_line('diferente');
4 end if;
5 if 1 <> 2 then
6 dbms_output.put_line('diferente');
7 end if;
8 if 1 ~= 2 then
9 dbms_output.put_line('diferente');
10 end if;
11* end;
SQL>
15 - Expressões envolvendo NULL em PL/SQL
SQL>
1 declare
2 a number;
3 b number;
4 begin
5 -- Atribui 10 a variável A mas deixa B null.
6 a:= 10;
7 -- A lógica dos três valores diz que o resultado
8 -- de uma expressão pode ser true, false ou null.
9 if a = b then
10 dbms_output.put_line('a = b is true');
11 elsif a <> b then
12 dbms_output.put_line('a = b is not true');
13 else
14 dbms_output.put_line('a = b is null');
15 end if;
16 -- Eis uma expressão que muitos esperam ser true
17 if (a = b) or (a <> b) then
18 dbms_output.put_line('true');
19 else
20 dbms_output.put_line('is not true');
21 end if;
22* end;
SQL> /
a = b is null
is not true
Procedimento PL/SQL concluído com sucesso.
SQL>
16 - Oracle considera uma string vazia como sendo null.
SQL>
1 declare
2 x varchar2(10);
3 y varchar2(10);
4 begin
5 -- Oracle considera uma string vazia como sendo null
6 x:= '';
7 if x = '' then
8 dbms_output.put_line('x is vazio');
9 elsif x is null then
10 dbms_output.put_line('x is null');
11 else
12 dbms_output.put_line('x contém algo?');
13 end if;
14 -- Comparação entre duas variáveis vazias
15 y:= '';
16 if x = y then
17 dbms_output.put_line('x = y');
18 elsif x is null then
19 dbms_output.put_line('x is null');
20 else
21 dbms_output.put_line('x <> y');
22 end if;
23* end;
SQL> /
x is null
x is null
Procedimento PL/SQL concluído com sucesso.
SQL>
17 - NULL não se propaga na concatenação de strings em ORACLE. Em outros
RDBMS o valor retornado é NULL.
SQL>
1* select 'everton ' || 'agilar' || null from dual;
'EVERTON'||'AG
--------------
everton agilar
SQL> begin
2 dbms_output.put_line('everton ' || 'agilar' || null);
3 end;
4 /
everton agilar
Procedimento PL/SQL concluído com sucesso.
SQL>
18 - Use a função NVL ou COALESCE para trocar valores nulls por outro valor.
SQL> select nvl(null, 10) from dual;
NVL(NULL,10)
------------
10
SQL> select coalesce(null, 10) from dual;
COALESCE(NULL,10)
-----------------
10
19 - Como comparar duas datas em PL/SQL para saber se o ano é o mesmo ?
SQL>
1 declare
2 d1 date;
3 d2 date;
4 begin
5 d1:= to_date('30/03/2010', 'dd/mm/yyyy');
6 d2:= sysdate;
7 if trunc(d1, 'yyyy') = trunc(d2, 'yyyy') then
8 dbms_output.put_line('ano igual...');
9 else
10 dbms_output.put_line('ano diferente...');
11 end if;
12* end;
SQL> /
ano igual...
Procedimento PL/SQL concluído com sucesso.
SQL>
20 - Obtendo as partes de uma data através da função TO_CHAR.
SQL> select to_char(to_date('10/01/2010', 'dd/mm/yyyy'), 'dd') from dual;
TO
--
10
SQL> select to_char(to_date('10/01/2010', 'dd/mm/yyyy'), 'mm') from dual;
TO
--
01
SQL> select to_char(to_date('10/01/2010', 'dd/mm/yyyy'), 'yyyy') from dual;
TO_C
----
2010
SQL>
Pesquisar este blog
domingo, 10 de janeiro de 2010
Dicas e Truques PL/SQL - Parte 1
Assinar:
Postar comentários (Atom)
Cara me ajudou muito a parte de criar uma procedure dentro de um bloco anônimo. Valeu mesmo.
ResponderExcluirMuito bom o tutorial cara, mas tem como me dizer como fazer uma comparação entre duas bases de dados diferentes e o select me mostrar apenas os dados divergentes? Exemplo:
ResponderExcluir//logado na baseA
select * from tabelaX
inner join
select * from tabelaX@baseB
where CC@baseB != CC //segundo CC referente à baseA
Isto funcionaria?
É possível sim com o uso da feature "database link". Documentação completa pode ser obtida em: http://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_5005.htm
Excluir