Technical information on migration from Microsoft
SQL Server to Oracle.
Last Update: Microsoft
SQL Server 2012 and Oracle 12c
Data type mapping between
SQL Server and Oracle :
Character and binary strings:
| | SQL Server | Oracle |
| 1 | CHAR(n) | Fixed-length non-Unicode string, 1 <= n <= 8000 | CHAR(n) |
| 2 | NCHAR(n) | Fixed-length Unicode UCS-2 string, 1 <= n <= 4000 | NCHAR(n) |
| 3 | NVARCHAR(n) | Variable-length Unicode UCS-2 string, 1 <= n <= 4000 | NVARCHAR2(n) |
| NVARCHAR(max) | 2 GB | NCLOB |
| 4 | VARCHAR(n) | Variable-length non-Unicode string, 1 <= n <= 8000 | VARCHAR2(n) |
| VARCHAR(max) | 2 GB | CLOB |
Numbers:
| | SQL Server | Oracle |
| 1 | BIGINT | 64-bit integer | NUMBER(19) |
| 2 | DECIMAL(p, s) | DEC(p, s) | Fixed-point number | NUMBER(p, s) |
| 3 | FLOAT(n) | Single (n <= 24) and double (n <= 53)
precision floating-point number | NUMBER |
| 4 | INTEGER | INT | 32-bit integer | NUMBER(10) |
| 5 | NUMERIC(p, s) | Fixed-point number | NUMBER(p, s) |
| 6 | REAL | Single precision floating-point number | NUMBER |
| 7 | SMALLINT | 16-bit integer | NUMBER(5) |
| 8 | TINYINT | 0 to 255 | NUMBER(3) |
Date and time:
| | SQL Server | Oracle |
| 1 | DATE | Date (year, month and day) | DATE | Also includes time  |
| 2 | DATETIME | Date and time with milliseconds (accuracy .000, .003, .007 seconds) | TIMESTAMP(3) |
| 3 | TIME(p) | Time, 0 <= p <= 7 (100 nanoseconds accuracy) | TIMESTAMP(p) |
Other data types:
| | SQL Server | Oracle |
| 1 | BIT | 0, 1 and NULL | NUMBER(1) |
| 2 | MONEY | Monetary data | NUMBER(19, 4) |
| 3 | SMALLMONEY | Monetary data | NUMBER(10, 4) |
| 4 | UNIQUEIDENTIFIER | GUID with dashes (-) | CHAR(36) |
| 5 | XML | XML data | XMLTYPE |
Converting built-in
SQL functions:
| | SQL Server | Oracle |
| 1 | CONVERT(CHAR | VARCHAR, exp) | Convert to string | TO_CHAR(exp) |
| 2 | GETDATE() | Get the current date and time | SYSTIMESTAMP |
| 3 | MONTH(datetime) | Extract month from datetime | EXTRACT(MONTH FROM datetime) |
| 4 | SYSTEM_USER | OS user name | SYS_CONTEXT('USERENV','OS_USER') |
| 5 | YEAR(datetime) | Extract year from datetime | EXTRACT(YEAR FROM datetime) |
Converting CREATE TABLE statement from
SQL Server to Oracle:
| | SQL Server | Oracle |
| 1 | IDENTITY(start, increment) | Identity column | Emulated using a sequence and trigger |
| 2 | DEFAULT exp | Column default | DEFAULT must be specified right after
data type, before NOT NULL etc. |
| 3 | CONSTRAINT name DEFAULT value | Named DEFAULT | DEFAULT value |
| 4 | CLUSTERED | NONCLUSTERED | Clustered and non-clustered
primary and unique key | Keyword removed |
| 5 | col type CONSTRAINT name
PRIMARY KEY(col) | Inline primary key | col type CONSTRAINT name
PRIMARY KEY - no column name
in inline constraint |
| 6 | PRIMARY KEY(col ASC | DESC, …) | Sorting order in constraint | PRIMARY KEY(col, …) - No ASC, DESC allowed |
| 7 | ROWGUIDCOL | Indicates that the column is
GUID, but IDs are not generated | Keyword removed |
Primary and unique key index options:
| | SQL Server | Oracle |
| 1 | ALLOW_PAGE_LOCKS = ON | OFF | Allow to use page locks | Removed |
| 2 | ALLOW_ROW_LOCKS = ON | OFF | Allow to use row locks | Removed |
| 3 | FILLFACTOR = num | Leave free space in leaf index nodes | Removed |
| 4 | IGNORE_DUP_KEY = ON | OFF | Ignore duplicate keys | Removed |
| 5 | PAD_INDEX = ON | OFF | Leave space in intermediate index nodes | Removed |
| 6 | STATISTICS_NORECOMPUTE = ON | OFF | Automatic statistics update | Removed |
Converting
SQL queries from
SQL Server to Oracle:
| | SQL Server | Oracle |
| 1 | SELECT @v = (SELECT c FROM …) | Assignment statement | SELECT c INTO v FROM … |
| 2 | SELECT @v = c, @v2 = c2 FROM … | SELECT INTO statement | SELECT c, c2 INTO v, v2 FROM … |
| 3 | SELECT … FROM | Result set from a procedure | OPEN out_refcur FOR SELECT … FROM |
Limit rows (Oracle 11g/10g):
| | SQL Server | Oracle |
| 1 | SELECT TOP n … | Without sorting | SELECT … WHERE rownum <= n |
| 2 | SELECT TOP n … ORDER BY | With sorting | SELECT * (SELECT … ORDER BY) WHERE rownum <= n |
| 3 | SELECT TOP n PERCENT … | % Without sorting | SELECT … WHERE rownum <= n/100 *
(SELECT COUNT(*) …) |
| 4 | SELECT TOP n PERCENT … ORDER BY | % With sorting | SELECT * (SELECT … ORDER BY) rownum <= n/100 *
(SELECT COUNT(*) …) |
Converting stored procedures from
SQL Server to Oracle:
| | SQL Server | Oracle |
| 1 | CREATE PROCEDURE | ALTER PROCEDURE name | CREATE OR REPLACE PROCEDURE name |
| 2 | @param datatype = default OUT | OUTPUT | p_param IN | OUT | IN OUT datatype DEFAULT default |
| 3 | Optional () for procedure parameters | () required |
| 4 | AS | IS | AS |
| 5 | RETURN int | Return the status code | RETURN; |
| 6 | GO | / |
For more information, see
Conversion of Transact-SQL Statements.
Converting SET statement for options from
SQL Server to Oracle:
| | SQL Server | Oracle |
| 1 | SET ANSI_NULLS ON | OFF | Use = <> with NULLs | Commented |
| 2 | SET ANSI_PADDING ON | OFF | Insert trailing blanks to VARCHAR | Commented |
| 3 | SET NOCOUNT ON | OFF | Send messages on affected rows | Removed |
| 4 | SET QUOTED_IDENTIFIER ON | OFF | Quote identifiers with "" | Commented |
Converting procedural Transact-
SQL statements used in stored procedures, functions and triggers from
SQL Server to Oracle PL/
SQL:
Variable declaration and assignment:
| | SQL Server | Oracle |
| 1 | DECLARE @var [AS] datatype(len) [= default] | Variable declaration | var datatype(len) [:= default]; |
| 2 | SET @var = value | Assignment statement | var := value; |
Flow-of-control statements:
| | SQL Server | Oracle |
| 1 | IF condition BEGIN … END | IF statement | IF condition THEN … END IF; |
Cursors operations and attributes:
| | SQL Server | Oracle |
| 1 | @@FETCH_STATUS = 0 | Fetch was successful | cur%FOUND |
Converting
SQL statements from
SQL Server to Oracle:
No comments:
Post a Comment