teor tecnologia - treinamento plsql - ms sql comparison

35
Oracle SQL Funções comuns em MS SQL implementadas em Oracle

Upload: marcio

Post on 02-Nov-2015

235 views

Category:

Documents


0 download

DESCRIPTION

Teor Tecnologia - Treinamento PLSQL - MS SQL Comparison

TRANSCRIPT

  • Oracle SQLFunes comuns em MS SQL implementadas em Oracle

  • SELECTEm 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.

  • SELECTEm 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;

  • INSERTEm 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;

  • UPDATEEm MS SQLupdate mytableset mycolumn=myothertable.mycolumnfrom mytable,myothertablewhere mytable.mycolumn like 'MY%'and myothertable.myothercolumn='some text';

    Em Oracleupdate mytableset mycolumn=(select a.mycolumnfrom myothertable awhere myothertable.myothercolumn='some text';)where mytable.mycolumn like 'MY%';

  • DELETEEm MS SQL

    delete mytable where mycolumn like 'some%';

    Em Oracle

    delete from mytable where mycolumn like 'some%';

  • DELETEEm MS SQL

    Delete productsfrom products, product_deleteswhere products.a = product_deletes.aand products.b = product_deletes.band product_deletes.c = 'd';

  • DELETEEm Oracle

    deletefrom productswhere ( a, b ) in( select a, bfrom product_deleteswhere c = 'd' );

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

  • JOINSA sintaxe INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN, FULL OUTER JOIN completamente suportada em Oracle

    Porm...

    Em MS SQLselect d.deptname, e.ename from dept d, emp e where d.empno *= e.enum

    Em Oracleselect d.deptname,e.ename from dept d, emp e where d.empno = e.enum (+);

  • JOINSO 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)

  • SUBQUERYEm MS SQL

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

  • SUBQUERYEm 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 ) q4FROM sales s;

  • lias para ColunasEm 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 SQLOracleINTEGERNUMBER(10)SMALLINTNUMBER(6)TINYINTNUMBER(3)REALFLOATFLOATFLOATBITNUMBER(1)VARCHAR(n)VARCHAR2(n)TEXTCLOBIMAGEBLOBBINARY(n)RAW(n) or BLOBVARBINARYRAW(n) or BLOBDATETIMEDATESMALL-DATETIMEDATEMONEYNUMBER(19,4)NCHAR(n)CHAR(n*2)NVARCHAR(n)VARCHAR(n*2)SMALLMONEYNUMBER(10,4)TIMESTAMPNUMBERSYSNAMEVARCHAR2(30), VARCHAR2(128)

  • Dicionrio de DadosEm 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 dadosALL_*: Todas as views ALL_* disponibilizam uma viso completa de tudo o que o usurio tem permisso de ver/manipular, inclundo PUBLICUSER_*: Todas as views USER_* disponibilizam uma viso completa de tudo o que o usurio possui

  • Dicionrio de Dados (Developer / AD)USER_OBJECTS: ObjetosUSER_TABLES: TabelasUSER_TAB_PARTITIONS: Parties de tabelasUSER_VIEWS: VisesUSER_TAB_COLUMNS: Colunas das tabelas e visesUSER_CONSTRAINTS: ConstraintsUSER_CONS_COLUMNS: Colunas das constraintsUSER_INDEXES: ndicesUSER_IND_COLUMNS: Colunas dos ndicesUSER_IND_EXPRESSIONS: Colunas dos ndices, quando funesUSER_SEQUENCES: SequnciasUSER_PROCEDURES: Procedimentos armazenados, funes e pacotesUSER_TRIGGERS: GatilhosUSER_SOURCE: Cdigo fonte de objetos compilados

  • Obter o cdigo DDL de um objetocreate or replace function sp_helptext(i_object_name in varchar, i_owner in varchar default user)return clobis 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 objetoselect 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 objetoselect 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 clobis 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 100Em MS SQL

    Select top 100 * from clientes

    Em Oracle

    Select * from clientes where rownum

  • SEQUENCECreate 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 EXTRACTSELECT 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 functionsSelect dateadd (day, 10, getdate())

    Select datediff (dd, getdate(), dateadd (day, 10, getdate())

    SELECT DATENAME(month, getdate()) AS 'Month Name' Select sysdate + 10 from dual;

    select (sysdate + 10) - sysdate from dual;

    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 */

  • ROUNDselect 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.2ROUND(113.18, 0) => 113ROUND(113.18, -1) => 110ROUND(113.18, -2) => 100ROUND(113.18, -3) => 0

  • Outros...Select isnull(precounitario,0) from titmmovSelect substring(codconta, 1, 3) from ccontaSelect nvl(precounitario,0) from titmmovSelect substr(codconta, 1, 3) from ccontaSelect decode (4, 1, Varivel = 1, 2, Varivel = 2, 3, Varivel = 3, Varivel Desconhecida) from dual;

  • TEMPORARY TABLEcreate 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 OracleCREATE 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 TABLETabela externa, normalmente texto ASCII, que podemos ler como se fosse uma tabela regular do Oracle.

    C:\> copy con countries1.txtENG,England,EnglishSCO,Scotland,EnglishIRE,Ireland,EnglishWAL,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 TABLESQL> 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 TABLESQL> select * from countries_ext;

    COUNT COUNTRY_NAME COUNTRY_LANGUAGE----- -------------------------------------------------- --------------------------------------------------ENG England EnglishSCO Scotland EnglishIRE Ireland EnglishWAL Wales Welsh

    SQL>

  • WRAPC:\> copy con fn_soma.sqlcreate or replace function fn_soma (i_valor1 in number, i_valor2 in number) return numberisbegin 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:\>

  • WRAPC:\> type fn_soma.sqwcreate or replace function fn_soma wrappeda000000b2abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd874 8dtlZx2GMWU9FL+GpKsMirKNAga5gwg8eZgcfLCNL+XlrZbZb/ci5dJaVfKMfSCChlw6XSXqWZgTLAsiXMqRiIqNshvqxxhObWcHHRcnDRSeq/riTRRERNNmh2eVOf9tHqJB/2OaZU3ByY

    /

  • WRAPC:\> 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 SQLApenas alguns pontos

    Refaa subconsultas muito complexas com tabelas temporriasUse a operao MINUS ao invs de usar NOT EXISTSEvite fazer clculos envolvendo colunas na clusula WHERE para comparar com algum valor especficoEvite o uso de NOT IN e HAVINGEvite o uso de LIKE com smbolo percentual esquerdaNunca misture tipos de dados diferentesUse o decode ou case sempre que necessrio, principalmente quando houverem expresses de agregaoVrios livros a respeito do tema disponveis no mercadohttp://www.oracle.com/pls/db112/homepage - Todos os manuais para Oracle 11g R2