تبدیل بانک اطلاعاتی از SQL Server به Oracle

براساس نیاز پروژه ای قصد تبدیل بانک اطلاعاتی از MS SQL Server 2014  به ORACLE 12c را دارم. تجارت کسب شده خودم را در این ارتباط با شما به اشتراک می گذارم.

یک نکته راه اندازی اوراکل روی ویندوز: 
- اولین مشکلی که در نصب اوراکل به آن برخورد کردم، آن بود که در 59% از نصب متوقف می شد و فایلی با عنوان dr0ulib.sql.sbs را پیدا نمی کرد.
راه حل: در واقع این فایل در داخل filegroup1.jar وجود دارد جالب اینکه این مشکل به دلیل ساختار مشکل دار  دی.وی.دی نصب اوراکل بروز می کند. یعنی فایل filegroup1.jar  در جایی که باید باشد نیست. کافی است که تمامی فایل های موجود در مسیر فولدرstage (داخلی) را در مسیر stage بیرونی آن کپی کنید. البته شاید این مشکل ناشی از دی.وی.دی نصب شرکت پرنیان باشد .
- نکته دیگر آنکه باید پس از نصب اوراکل مسیر قرارگیری فایل های tns را در environment variable ها تحت عنوان TNS_ADMIN معرفی نمایید.

انتقال جداول اطلاعاتی به اوراکل: 
- اگر در نام گذاری عناصر اطلاعاتی (مانند جداول و ستون ها) از مقادیر کلیدی اوراکل مانند مواردی زیر استفاده کرده اید باید ابتدا آنها را تغییر نام دهید.
comment, number, desc, date
- اگر در نامگذاری عناصر اطلاعاتی از بیش از 30 کاراکتر استفاده کرده اید لازم است تا تمامی آنها (یعنی همه، حتی FK ها و ...) را به حداکثر 30 کاراکتر تقلیل طول دهید.
- ظاهرا در اوراکل باید نام عناصر اطلاعاتی را تماما کوچک یا بزرگ انتخاب کنید. که متاسفانه این از خوانایی عناصر کم می کند. یعنی بجای MyTable دارید MYTABLE 
- لازم است تا در کدهای ساخت جداولتان که از SQL Server استخراج کرده اید تغییراتی دهید:
در sql server داریم:
CREATE TABLE [dbo].[TEST](
[TESTID] [int] IDENTITY(1,1) NOT NULL,
[TESTTTITLE] [nvarchar](100) NOT NULL,
[TAG] [varchar](500) NULL,
[CMMNT] [varchar](500) NULL,
[CREATEDBY] [varchar](250) NOT NULL DEFAULT ('myuser'),
[CREATEDDATE] [datetime] NOT NULL  DEFAULT (getdate()),
[MODIFIEDBY] [varchar](250) NULL,
[MODIFIEDDATE] [datetime] NULL,
[RECORDVERSION] [timestamp] NOT NULL,
 CONSTRAINT [PK_TEST] PRIMARY KEY  ([TESTID] ASC));
در اوراکل داریم:
CREATE TABLE TEST
( TESTID NUMBER(10,0) NOT NULL,, 
TITLETITLE NVARCHAR2(100) NOT NULL,
TAG VARCHAR2(500 BYTE), 
CMMNT VARCHAR2(500 BYTE), 
CREATEDBY VARCHAR2(250 BYTE) DEFAULT 'myuser' NOT NULL,
CREATEDDATE DATE DEFAULT SYSDATE NOT NULL,
MODIFIEDBY VARCHAR2(250 BYTE), 
MODIFIEDDATE DATE, 
RECORDVERSION RAW(16) DEFAULT SYS_GUID(), 
CONSTRAINT PK_TEST PRIMARY KEY (TESTID));

پس  تفاوت ها: 
- در sql server ،  از identity استفاده می کنیم که در اوراکل معادلی ندارد و برای انجام کار مشابه از عنصر sequence استفاده می شود. به خاطر داشته باشید که sql server نیز جدیدا نوع sequence را به عناصر خود اضافه کرده است.
- در تعریف ستون های اطلاعاتی بجای int از numeric استفاده کردم، اگر به نتیجه جدیدی رسیدم این بخش را اصلاح خواهم کرد.
- جای قرار گرفتن عبارت default درصورتیکه استفاده کرده اید در عبارت sql server و oracle ی متفاوت است
- جایگزین getdate در اوراکل sysdate است
- اگر در sql server از timestamp استفاده کرده ایددر اوراکل باید از  RAW(16) DEFAULT SYS_GUID استفاده کنید.

برخی معادل های sql server در اوراکل
- جدول sysobjects در اوراکل tabs است
-در اوراکل  از جداول user_tables و user_constraints هم می توانید استفاده مناسب ببرید
- برای انتخاب چند رکورد اول به ترتیب زیر عمل می کنیم:
select  * from mytable where rownum < 11;
select * from mytable offset 0 rows fetch next 10 rows only

- برای تبدیل رشته تاریخی به تاریخ از عبارت زیر استفاده کنید:
TO_DATE('2014-05-24 13:11:01', 'YYYY-MM-DD HH24:MI:SS')
- معادل دستور print در اوراکل dbms_output است و روش کاربرد آن به ترتیب زیر است، ضمنا این دستور فقط در بین یک بلوک begin و end کار می کند:
BEGIN
  dbms_output.enable(1000000);
  dbms_output.put_line("HELLO");
END;
- روش تعیین alias  در sql server به 2 روش قابل انجام است، در اوراکل باید از روش دوم استفاده نمایید.
select * from Table1 AS T1
select * from Table1 T1
انتقال اطلاعات
ابزار SQL Server برای Export نمودن اطلاعات کارایی مناسبی نداشته (حداقل براین من اینطور بوده) و ترجیح دادم که دستورات Insert را در مبدا ساخته و در ادامه در oracle  اجرا کنم. برای ساخت دستور Insert از Stored Procedure آماده ای در لینک زیر البته با اندکی تحریف استفاده کردم.
Procedure: sp_generate_inserts  (Build 22) 
(Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.)
برای اجرای دستورات insert بدون دردسر و مزاحمت Foreign Key ها ابتدا دستورات زیر را در محیط اوراکل اجرا کنید:
----------------------  disable table constraints
set serveroutput on
declare 
  sql_stm    varchar2(2000);
BEGIN
  dbms_output.enable(1000000);
  for x in (select c.constraint_name, c.table_name, decode(c.constraint_type,'P',' cascade') casc 
            from user_constraints c, user_tables u where c.table_name = u.table_name) loop
    begin            
        sql_stm := 'Alter table '||x.table_name||' disable Constraint '||x.constraint_name;
        dbms_output.put_line(sql_stm);
        execute immediate sql_stm;
    
        EXCEPTION
        WHEN OTHERS THEN
         dbms_output.put_line('ERROR Disabing Constraints');    
    end;
  end loop;
END;
/
دریافت متغییر حین اجرای برنامه 
- در SQL SERVER مکانیزمی برای دریافت مقدار متغییر حین اجرا وجود ندارد اما در اوراکل درصورتیکه از علامت & قبل از متغییر مورد نظر در متن خود استفاده نمایید، در حین اجرا مقدار از شما پرسش می شود. درصورتیکه عبارات insert برای انتقال اطلاعات از SQL Server به اوراکل تولید کرده اید و در آن مقدار متنی شما دارای علامت &  باشد با مشکل روبرو می شوید. یک راه آسان برای گذر از این مشکل استفاده از دستور زیر قبل از اجرای عبارات مورد نظر است.
Set Define Off
چند نکته
- اگر می خواهید که یک block   خالی قابل اجرا داشته باشد به ترتیب زیر عمل کنید:
Begin
  null;
End;

نظرات 0 + ارسال نظر
امکان ثبت نظر جدید برای این مطلب وجود ندارد.