Sie sind auf Seite 1von 5

Migrando de Oracle para SQL Server - Parte I

20/01/04

Muitas vezes precisamos migrar de Banco de Dados de acordo com as necessidades de nossos clientes. Automaticamente temos que fazer o tratamento de nossas aplicaes que fazem consultas, incluses, excluses e executam procedimentos armazenados para atender a estas necessidades, tornando nossas aplicaes mais flexveis e atendendo um nmero maior de clientes. Ento vou mostrar em primeira instncia como fazer para migrar as instrues mais simples e utilizadas como consultas, incluses e excluses, numa segunda instncia vou mostrar como fazer para migrar procedimentos armazenados e alteraes na estrutura de tabelas. No vamos nos aprofundar nas estruturas internas dos Bancos de Dados abordados, porque apesar de serem diferentes, estam mais voltadas para o DBA e no para o desenvolvedor. Nota: Vou apresentar as expresses referentas sintaxe dos comandos e funes sem usar uma liguagem especfica para conexo ou envio de transao ao Banco de Dados. Tabela 1: A tabela abaixo mostra algumas difereas de sintaxe entre Oracle e SQL Server que nos ajudar no decorrer deste artigo.

Funo Converter Numerico para Caracter Converter Caracter para Numerico Converter Data para Caracter Converter Caracter para Data Retornar parte de uma expresso Concatenar expresses Retornar parte de uma expresso

Transact SQL

PL/SQL

STR(expresso,tamanho,decima to_char(expresso,formato) l) cast(expresso AS Numeric) cast(expresso AS Char) cast(expresso AS DateTime) to_number(expresso,formato ) to_char(expresso,formato) to_date(expresso,formato)

SubString(expresso,incio,tama SubStr(expresso,incio,taman nho) ho) + ||

SubString(expresso,incio,tama SubStr(expresso,incio,taman nho) ho) NVL(Campo, Expresso)

Verifica se o valor do campo nulo e ISNULL(Campo, Expresso) troca pela expresso especificada

Vou mostrar agora como fazer isso atravs de alguns senrios baseados no mundo real, criados simplesmente para exemplificar a utilizao dos comandos e funes do Bancos abordados. Temos um mdulo de vendas que possui as seguintes tabelas:

Temos os seguintes cenrios: Concatenando colunas Precisamos mostrar o endereo dos clientes concatenando as colunas rua, numero, bairro, cidade e CEP. Oracle Select 'Endereo: '||rua||', '||numero|| '-Bairro: '||bairro|| '-Cidade: '||cidade||

'-CEP: '||cep As Endereco_Completo from Clientes SQL Server Select 'Endereo: '+rua+', '+numero+ '-Bairro: '+bairro+ '-Cidade: '+Cidade+ '-CEP: '+cep As Endereco_Completo from Clientes Consultando um nmero de linha pr-definidos da tabela, queremos mostrar 10 primeiros registros de clientes que moram na cidade de Belo Horizonte: Oracle No Oracle usaremos a expresso RowNum <= 'n' onde 'n' o numero de linhas a ser retornado Select * From Clientes Where Cidade = 'Belo Horizonte' AND RowNum <=10 SQL Server No SQL Server posso usar o SET ROWCOUNT 'n' ou a instruo TOP 'n' onde 'n' o numero de linhas a se obter Set RowCount 10 Select * From Clientes Where Cidade = 'Belo Horizonte' Set RowCount 0 A intruo RowCount 0 serve para voltar ao padro OU Select Top 10 * From Clientes Where Cidade = 'Belo Horizonte' Agora mostraremos isso em percentual ou seja 10% dos clientes: Oracle No Oracle usarei a funo sample(n) onde 'n' deve ser o percentual de linha a ser retornado dividido por 100 Select * From Clientes Sample(0.10) Where Cidade = 'Belo Horizonte' SQL Server Neste caso usarei apenas a instruo TOP 'n' PERCENT onde 'n' o percentual de linhas a se obter Select Top 10 Percent * From Clientes Where Cidade = 'Belo Horizonte'

Clculos com datas Precisamos saber quais foram os pedidos entregues nos ultimos 5 dias, usaremos uma funo para retornar a data atual em cada Banco de Dados mas, este clculo pode ser feito entre datas da prpria tabela ! Oracle No Oracle usaremos a instruo SysDate que retorna a data atual do Banco de Dados. Select * From

Pedidos Where (SysDate-Data_Entrega) = 5 SQL Server Tabela 2:Neste caso usaremos duas funes do SQL Server a GetDate() Que retorna a data atual do banco e a DateDiff(Tipo,DataMenor,DataMaior) que retorna a diferena entre duas datas conforme o tipo passado como parmetro. Vou mostra abaixo os parmetro mais usados (GetDate() neste dia retornou '04-04-2003 00:33').

Parmetr o Year Month Week Day Hour

Descrio Retorna a diferena em Anos Retorna a diferena em Meses Retorna a diferena em Semanas Retorna a diferena em Dias Retorna a diferena em Horas

Exemplo DateDiff(Year,'04-01-2001 00:00:00',GetDate()) DateDiff(Month,'04-01-2001 00:00:00',GetDate()) DateDiff(Week,'04-01-2001 00:00:00',GetDate()) DateDiff(Day,'04-01-2001 00:00:00',GetDate()) DateDiff(Hour,'04-01-2001 00:00:00',GetDate())

Resultado 2 24 104 733 17592

Vamos ao Exemplo: Select * From Pedidos Where DateDiff(Day,Data_Entrega,GetDate()) Estes clculos tambm sero encontrados em atualizaes da tabela ou excluses de registro de uma tabela. Apresentarei tambm um exemplo para destes para no ficarmos apegados s consultas. Ento vamos aumentar o prazo de entrega em 2 dias para pedidos com prazo de entrega menor que 5 dias. Oracle Update Pedido set Data_Entrega=Data_Entrega+2 Where (Data_Entrega-Data_Pedido) < 5 SQL Server Update Pedido set Data_Entrega=Data_Entrega+2 Where DateDiff(Day,Data_Entrega,Data_Pedido) < 5 Agora vamos excluir pedidos com mais de 180 dias. Oracle Delete Pedido Where (SysDate-Data_Pedido) > 180 SQL Server Delete Pedido Where DateDiff(Day,Data_Pedido,GetDate()) > 180

Comparaes de Valores

Num dirio relatrio de expedio de mercadorias precisamos, informar ao expedicionista se a entregas imediata, quando a data de entrega igual data do pedido, ou posterior quando a data de entrega for maior que a data do pedido, isto serviria para facilitar o trabalho do expedicionista evitando que ele faas tais comparaes. Aproveitaremos o exeplo para mostrar a sintaxe de um comando anterior para fixar mais. Oracle Select Pedido.*, Decode(Data_Pedido,Data_entrega,'Imediata','Posterior') As Entrega from Pedido Where Data_Pedido = SysDate SQL Server Select Pedido.*, Case When Data_Pedido=Data_entrega Then 'Imediata' ELSE 'Posterior' END As Entrega from Pedido Where Data_Pedido = SysDate Continuando com compraes de valores, agora ns precisamos atualizar os preos dos produtos em percentuais diferentes de acordo como uma faixa de valores que so: At 100,00 vamos atualizar em 10% De 101,00 a 500,00 vamos atualizar em 9% E acima de 500 vamos atualizar em 8% Oracle Update Produto Set Preo= DECODE(SIGN(Preco - 101,00), -1, (Preco + (Preco * (10/100))), DECODE(SIGN(Preco - 501,00), -1, (Preco + ( Preco * ( 9/100))), ( Preco + (Preco * (8/100))) )) SQL Server Update Produto Set Preo= Case When Preco <= 100,00 Then (Preco + (Preco * (10/100))) When Preco >= 101,00 and <= 500,00 Then (Preco + ( Preco * ( 9/100))) Else ( Preco + (Preco * (8/100) )) End Com estes exemplos terminamos a primeira parte deste artigo. O objetivo deste artigo alm de tirar algumas dvidas de converso do Oracle para SQL Server, tambm ajudar quem est comeando a trabalhar com o SQL Server a ver a sintaxe de alguns comandos e funes que sero necessrias para o dia-a-dia. Por isso procurei colocar exemplos bsicos para no confundir estas pessoas de forma que desenvolvedores mais avanados tambm possam tirar proveito deste artigo.

Na prxima parte deste artigo vou mostrar o uso do Join que bastante interessante e usarei alguns comandos e funes j abordados com o intuito de fixar mais o seu uso.

Das könnte Ihnen auch gefallen