Você está na página 1de 35

Oracle SQL

Funes comuns em MS SQL


implementadas em Oracle

SELECT
Em MS SQL
Select getdate()
Em Oracle
Select sysdate from dual;
A tabela DUAL, do owner SYS, uma tabela com uma nica coluna,
DUMMY, e uma nica linha. O propsito servir como referncia para os
casos onde desejamos executar uma funo do banco de dados e obter
uma nica linha de retorno usando SQL.

SELECT
Em MS SQL
Select getdate() data_do_dia into tabela_x
Em Oracle
Insert into tabela_x (data_do_dia) values (sysdate);
Em havendo apenas esta coluna na tabela, a sintaze abaixo tambm
vlida:
Insert into tabela_x select sysdate from dual;

INSERT
Em MS SQL
Insert tabela_x values (valor_do_campo_1, valor_do_campo_2)
Em Oracle
Insert into tabela_x values (valor_do_campo_1, valor_do_campo_2);
Insert into tabela_x select valor_do_campo_1, valor_do_campo_2 from
dual;

UPDATE
Em MS SQL
update mytable
set mycolumn=myothertable.mycolumn
from mytable,myothertable
where mytable.mycolumn like 'MY%'
and myothertable.myothercolumn='some text';
Em Oracle
update mytable
set mycolumn=
(select a.mycolumn
from myothertable a
where myothertable.myothercolumn='some text';
)
where mytable.mycolumn like 'MY%';

DELETE
Em MS SQL
delete mytable where mycolumn like 'some%';
Em Oracle
delete from mytable where mycolumn like 'some%';

DELETE
Em MS SQL
Delete products
from products, product_deletes
where products.a = product_deletes.a
and products.b = product_deletes.b
and product_deletes.c = 'd';

DELETE
Em Oracle
delete
from products
where ( a, b ) in
( select a, b
from product_deletes
where c = 'd' );

MERGE (ORACLE)
merge into bonuses d using
(select employee_id, salary, department_id from employees
where department_id = 80
) s on (d.employee_id = s.employee_id)
when matched then
update set d.bonus = d.bonus + s.salary * .01
when not matched then
insert (d.employee_id, d.bonus)
values (s.employee_id, s.salary * .01);

JOINS
A sintaxe INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN,
CROSS JOIN, FULL OUTER JOIN completamente suportada em Oracle
Porm...
Em MS SQL
select d.deptname, e.ename from dept d, emp e where d.empno *=
e.enum
Em Oracle
select d.deptname,e.ename from dept d, emp e where d.empno = e.enum
(+);

JOINS
O uso dos smbolos para representar o lado OUTER no usual.
Normalmente so usados os comandos para relacionamento LEFT
OUTER JOIN, RIGHT OUTER JOIN, etc.
select d.deptname,e.ename from dept d left outer join emp on (d.empno =
e.enum)

SUBQUERY
Em MS SQL
select distinct year,
q1 = (select Amount amt FROM sales
where Quarter=1 AND year = s.year),
q2 = (SELECT Amount amt FROM sales
where Quarter=2 AND year = s.year),
q3 = (SELECT Amount amt FROM sales
where Quarter=3 AND year = s.year),
q4 = (SELECT Amount amt FROM sales
where Quarter=4 AND year = s.year)
from sales s

SUBQUERY
Em Oracle
SELECT year,
DECODE( quarter, 1, amount, 0 ) q1,
DECODE( quarter, 2, amount, 0 ) q2,
DECODE( quarter, 3, amount, 0 ) q3,
DECODE( quarter, 4, amount, 0 ) q4
FROM sales s;

lias para Colunas


Em MS SQL
Select c1 = coluna1, c2 = coluna2, c3 = coluna3 from tabela
Em Oracle
Select coluna1 as c1, coluna2 as c2, coluna3 as c2 from tabela;

Tipos de Dados

MS SQL
INTEGER
SMALLINT
TINYINT
REAL
FLOAT
BIT
VARCHAR(n)
TEXT
IMAGE
BINARY(n)
VARBINARY
DATETIME
SMALLDATETIME
MONEY
NCHAR(n)
NVARCHAR(n)
SMALLMONEY
TIMESTAMP
SYSNAME

Oracle
NUMBER(10)
NUMBER(6)
NUMBER(3)
FLOAT
FLOAT
NUMBER(1)
VARCHAR2(n)
CLOB
BLOB
RAW(n) or BLOB
RAW(n) or BLOB
DATE
DATE
NUMBER(19,4)
CHAR(n*2)
VARCHAR(n*2)
NUMBER(10,4)
NUMBER
VARCHAR2(30),
VARCHAR2(128)

Dicionrio de Dados
Em Oracle, temos 3 tipos de views para consultas no dicionrio de dados:
DBA_*: Todas as views DBA_* disponibilizam uma viso completa da
estrutura do banco de dados
ALL_*: Todas as views ALL_* disponibilizam uma viso completa de tudo
o que o usurio tem permisso de ver/manipular, inclundo PUBLIC
USER_*: Todas as views USER_* disponibilizam uma viso completa de
tudo o que o usurio possui

Dicionrio de Dados (Developer / AD)

USER_OBJECTS: Objetos
USER_TABLES: Tabelas
USER_TAB_PARTITIONS: Parties de tabelas
USER_VIEWS: Vises
USER_TAB_COLUMNS: Colunas das tabelas e vises
USER_CONSTRAINTS: Constraints
USER_CONS_COLUMNS: Colunas das constraints
USER_INDEXES: ndices
USER_IND_COLUMNS: Colunas dos ndices
USER_IND_EXPRESSIONS: Colunas dos ndices, quando funes
USER_SEQUENCES: Sequncias
USER_PROCEDURES: Procedimentos armazenados, funes e pacotes
USER_TRIGGERS: Gatilhos
USER_SOURCE: Cdigo fonte de objetos compilados

Obter o cdigo DDL de um objeto


create or replace function sp_helptext
(i_object_name in varchar, i_owner in varchar default user)
return clob
is
result clob;
begin
result := null;
select dbms_metadata.get_ddl (data.object_type, data.object_name, data.owner)
into result
from all_objects data
where data.object_name = i_object_name
and data.owner = i_owner;
return result;
exception
when others then
return null;
end;
/

Obter o cdigo DDL de um objeto


select sp_helptext ('HAND_DATA') from dual;

CREATE TABLE "PROJETOX"."HAND_DATA"


(
"LINE" NUMBER,
"CONTENT" VARCHAR2(2048)
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE
DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SYSTEM"

Obter o cdigo DDL de um objeto


select sp_helptext ('SP_HELPTEXT') from dual;
CREATE OR REPLACE FUNCTION "PROJETOX"."SP_HELPTEXT"
(i_object_name in varchar, i_owner in varchar default user)
return clob
is
result clob;
begin
result := null;
select dbms_metadata.get_ddl (data.object_type, data.object_name, data.owner)
into result
from dual,
all_objects data
where data.object_name = i_object_name
and data.owner = i_owner;
return result;
exception
when others then
return null;
end;

TOP 100
Em MS SQL
Select top 100 * from clientes
Em Oracle
Select * from clientes where rownum <= 100;
Select * from (select * from clientes order by clienteid) where rownum <=
100;

SEQUENCE
Create sequence seq_x;
create sequence seq_x increment by 1 start with 1 maxvalue 1048576
minvalue 1 cache 128 order nocycle;
Select seq_x.nextval from dual;
Select seq_x.currval from dual; /* ltimo valor que a sua sesso pediu,
no o valor atual do contador */
Quando informamos NOMAXVALUE, a sequence suporta at 10^28-1, ou
seja, 9.999.999.999.999.999.999.999.999.999

DATEPART x EXTRACT

SELECT DATEPART(year, '12:10:30.123')


,DATEPART(month, '12:10:30.123')
,DATEPART(day, '12:10:30.123')
,DATEPART(dayofyear, '12:10:30.123')
,DATEPART(weekday, '12:10:30.123');

Select extract (year from sysdate), extract


(month from sysdate), extract (day from
sysdate);
Select to_char (sysdate, WW) as
semana_do_ano, to_char (sysdate, W) as
semana_do_mes, to_char (sysdate, D) as
dia_da_semana, to_char (sysdate, DAY) as
nome_do_dia_da_semana from dual;

DATE functions

Select dateadd (day, 10, getdate())

Select sysdate + 10 from dual;

Select datediff (dd, getdate(),


dateadd (day, 10, getdate())

select (sysdate + 10) - sysdate from


dual;

SELECT DATENAME(month,
getdate()) AS 'Month Name'

select to_char (sysdate, 'month')


from dual;
select next_day (sysdate, 2) from
dual; /* Prxima segunda-feira */
select last_day (sysdate) from
dual; /* ltimo dia do ms */

ROUND
select round (113.18, 1) from dual;
select round (113.18, 0) from dual;
select round (113.18, -1) from dual;
select round (113.18, -2) from dual;
select round (113.18, -3) from dual;
ROUND(113.18, 1) => 113.2
ROUND(113.18, 0) => 113
ROUND(113.18, -1) => 110
ROUND(113.18, -2) => 100
ROUND(113.18, -3) => 0

Outros...

Select isnull(precounitario,0) from


titmmov
Select substring(codconta, 1, 3) from
cconta

Select nvl(precounitario,0) from titmmov


Select substr(codconta, 1, 3) from
cconta
Select decode (4, 1, Varivel = 1, 2,
Varivel = 2, 3, Varivel = 3, Varivel
Desconhecida) from dual;

TEMPORARY TABLE

create table ##loc_locacaotemp


(
loc_in_codigo int not null,
loc_dt_locacao smalldatetime,
loc_re_valor numeric(12,2)
);

create global temporary table


loc_locacaotemp
(
loc_in_codigo int not null,
loc_dt_locacao smalldatetime,
loc_re_valor numeric(12,2)
) on commit preserve rows;
No existem tabelas temporrias a nvel de
sesso, ou seja, correlatas s tabelas MS
SQL com apenas um #.

INT IDENTITY em Oracle


CREATE TABLE departments
(
ID NUMBER(10) NOT NULL,
DESCRIPTION VARCHAR2(50) NOT NULL
);
ALTER TABLE departments ADD
(
CONSTRAINT dept_pk PRIMARY KEY (ID)
);
CREATE SEQUENCE dept_seq;
CREATE OR REPLACE TRIGGER dept_bir
BEFORE INSERT ON departments
FOR EACH ROW WHEN (new.id IS NULL)
BEGIN
SELECT dept_seq.NEXTVAL INTO :new.id FROM dual;
END;
/

EXTERNAL TABLE
Tabela externa, normalmente texto ASCII, que podemos ler como se fosse uma
tabela regular do Oracle.
C:\> copy con countries1.txt
ENG,England,English
SCO,Scotland,English
IRE,Ireland,English
WAL,Wales,Welsh
^Z
1 file(s) copied.
C:\> sqlplus system/system
SQL*Plus: Release 11.2.0.2.0 Production on Sun May 12 17:00:57 2013
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
SQL> create or replace directory root as 'c:\';
Directory created.

EXTERNAL TABLE
SQL> CREATE TABLE countries_ext (
2 country_code
VARCHAR2(5),
3 country_name
VARCHAR2(50),
4 country_language VARCHAR2(50)
5 )
6 ORGANIZATION EXTERNAL (
7 TYPE ORACLE_LOADER
8 DEFAULT DIRECTORY root
9 ACCESS PARAMETERS (
10
RECORDS DELIMITED BY NEWLINE
11
FIELDS TERMINATED BY ','
12
MISSING FIELD VALUES ARE NULL
13
(
14
country_code
CHAR(5),
15
country_name
CHAR(50),
16
country_language CHAR(50)
17
)
18 )
19 LOCATION ('Countries1.txt')
20 )
21 PARALLEL 5
22 REJECT LIMIT UNLIMITED;
Table created.

EXTERNAL TABLE
SQL> select * from countries_ext;
COUNT
----ENG
SCO
IRE
WAL

SQL>

COUNTRY_NAME
-------------------------------------------------England
Scotland
Ireland
Wales

COUNTRY_LANGUAGE
-------------------------------------------------English
English
English
Welsh

WRAP
C:\> copy con fn_soma.sql
create or replace function fn_soma (i_valor1 in number, i_valor2 in number) return number
is
begin
return i_valor1 + i_valor2;
end;
/
^Z
1 file(s) copied.
C:\> wrap iname=fn_soma.sql oname=fn_soma.sqw
PL/SQL Wrapper: Release 11.2.0.2.0- Production on Sun May 12 16:54:30 2013
Copyright (c) 1993, 2009, Oracle. All rights reserved.
Processing fn_soma.sql to fn_soma.sqw
C:\>

WRAP
C:\> type fn_soma.sqw
create or replace function fn_soma wrapped
a000000
b2
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
74 8d
tlZx2GMWU9FL+GpKsMirKNAga5gwg8eZgcfLCNL+XlrZbZb/ci5dJaVfKMfSCChlw6XSXqWZ
gTLAsiXMqRiIqNshvqxxhObWcHHRcnDRSeq/riTRRERNNmh2eVOf9tHqJB/2OaZU3ByY
/

WRAP
C:\> sqlplus system/system @fn_soma.sqw
SQL*Plus: Release 11.2.0.2.0 Production on Sun May 12 16:55:03 2013
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
Function created.
SQL> select fn_soma (2, 3) from dual;
FN_SOMA(2,3)
-----------5
SQL>

Melhores prticas em SQL


Apenas alguns pontos
Refaa subconsultas muito complexas com tabelas temporrias
Use a operao MINUS ao invs de usar NOT EXISTS
Evite fazer clculos envolvendo colunas na clusula WHERE para
comparar com algum valor especfico
Evite o uso de NOT IN e HAVING
Evite o uso de LIKE com smbolo percentual esquerda
Nunca misture tipos de dados diferentes
Use o decode ou case sempre que necessrio, principalmente quando
houverem expresses de agregao
Vrios livros a respeito do tema disponveis no mercado
http://www.oracle.com/pls/db112/homepage - Todos os manuais para
Oracle 11g R2

Você também pode gostar