Comparison of Oracle & SQL Server

1. Programming

Oracle: PL/SQL is the language used for programming

SQL Server: T-SQL is the language used for programming

2. ROWID

Oracle:

Select Rowid, A.* from Temp;
ROWIDNumID
AAAJWTAAWAAB+BiAAA10
AAAJWTAAWAAB+BiAAB20

SQL Server:

CREATE TABLE Temp (num INT)
go

INSERT INTO Temp VALUES (10), (20)
go

SELECT %%physloc%% AS [%%physloc%%],
       sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot],
       num 
  FROM Temp
go

Output

%%physloc%%File:Page:SlotNUM
0x2926020001000000(1:108786:0)10
0x2926020001000100(1:108786:1)20

3. Dual

Oracle: Dual Table is made available by default.

Select * from Dual;

SQL Server: Dual table can be created.

--Solution 1
Create Table Dual (Dummy varchar(1))
go

Insert Into Dual (Dummy) Values (‘x’)
go

--Solution 2
SELECT 'X' AS DUMMY INTO DUAL
go

--Solution 3
CREATE VIEW DUAL AS SELECT 'X' AS DUMMY
go

--and then use as following
Select * from Dual
go

4. Minus

Oracle:

Select column1, column2 from table1
Minus
Select column1, column2 from table2;

SQL Server:

Select column1, column2 from table1
Except
Select column1, column2 from table2
go

5. Decode

Oracle:

Select DECODE(Rankings, 'First',  1,
                        'Second', 2,
                        'Third',  3, 0) as Ranks
  From StudRanks;

SQL Server:

Select Case when Rankings = 'First'  then 1
            when Rankings = 'Second' then 2
            when Rankings = 'Third'  then 3
            else 0
       end as Ranks
  From StudRanks
Go

Note: Case statement is available in Oracle too.

6. DBMS_Output.Put_Line

Oracle: DBMS_Output.Put_Line is used to display values of passed parameters on the console.

SQL Server: Print is used to display values of passed parameters on the console.

7. Varchar2

Oracle:

Declare
  V_name varchar2(20);
Begin
  V_name := 'TechOraFAQ.in';
  DBMS_Output.Put_Line(V_Name);
End;

SQL Server:

Begin
  Declare @V_name varchar(20);
  Set @V_name = 'TechOraFAQ.in';
  Print @V_Name;
End
go

8. String Concatenation

Oracle: || is used as string concatenation operator.

Select 'TechOraFAQ.' || 'in' as lnk from dual;

SQL Server: + is used as string concatenation operator.

--dual table created in Point # 3 above
Select 'TechOraFAQ.' + 'in' as lnk
go

9. Sysdate & SystemTimeStamp

Oracle:

Select sysdate, SystemTimeStamp from dual;

SQL Server:

Select getdate(), SYSDATETIME()
GO

10. Variables

Oracle:

Declare
  v_sales     number(10, 2);
  c_pi        CONSTANT double := 3.1415;
  v_name      varchar2(25);
  v_address   varchar2(100);
  v_counter   binary_integer := 0;
  v_greetings varchar2(20) DEFAULT 'Have a Good Day';
  v_dt        Date;
begin
  v_dt        := To_Date('01-Jan-2021', 'DD-Mon-YYYY');
  v_sales     := 1000.55;
  v_name      := 'Ramesh Jha';
  v_greetings := 'Happy Birthday';
  v_counter   := 1;
  v_dt        := Sysdate;
  Dbms_output.put_line(v_dt);
  Dbms_output.put_line(v_sales);
  Dbms_output.put_line(v_name);
  Dbms_output.put_line(v_greetings);
  Dbms_output.put_line(v_counter);
  Dbms_output.put_line(c_pi);
end;

SQL Server:

Begin
  Declare @v_sales     Decimal(10, 2);
  Declare @c_pi        double precision = 3.1415;
  Declare @v_name      nvarchar(25);
  Declare @v_address   nvarchar(100);
  Declare @v_counter   binary_integer = 0;
  Declare @v_greetings nvarchar(20) = 'Have a Good Day';
  Declare @v_dt        DateTime;

  Set @v_dt        = Convert(DateTime,'2021-01-01');
  Set @v_sales     = 1000.55;
  Set @v_name      = N'Ramesh Jha';
  Set @v_greetings = N'Happy Birthday';
  Set @v_counter   = 1;
  Set @v_dt        = getdate();

  Print @c_pi
  Print @v_sales
  Print @v_name
  Print @v_greetings
  Print @v_counter
  Print @v_dt
end
go

11. Commit

Oracle: Auto Commit is by default OFF. So, don’t forget to execute commit after modifying the data in the tables.

SQL Server: Auto Commit is by default ON. So be cautious while executing Insert, Update & Delete statements.

12. Create select

Oracle:

Create table Temp_EMP as
  Select * from EMP;

SQL Server:

Select * into Temp_EMP from EMP
Go

13. Triggers 

Oracle: After and before triggers are available. Insteadof trigger is available.

SQL Server: Only After triggers are available. Insteadof trigger is available.

14. Packages

Oracle: Packages can be created in Oracle.

SQL Server: Packages are not supported in SQL Server. Here the procedures and functions are to be created and maintained individually. In order to group them together one can have a common prefix before each procedure and function that are to be grouped together.

15. ROWNUM

Oracle:

Select rownum, e.* from emp e;

SQL Server:

Select row_number() over(order by <column>) as rownum, e.*
  from emp
go

16. UTL_FILE

Oracle: UTL_FILE can be used to read from & write to text files using PL/SQL methods.

SQL Server: SSIS can be used for these purposes.

17. UTL_SMTP

Oracle: UTL_SMTP

SQL Server: sp_send_dbmail

18. Cursors

ORACLE:

CREATE OR REPLACE PROCEDURE sp_disp_date IS
  v_date DATE;
  CURSOR c1 IS
    SELECT SYSDATE FROM dual;
BEGIN 
  OPEN c1;
  FETCH c1 INTO v_date;
  CLOSE c1;   
  DBMS_OUTPUT.PUT_LINE(v_date);
END;

--Execution of procedure
EXEC sp_disp_date;

--Output
16-Mar-22

SQL Server:

CREATE PROCEDURE sp_disp_date AS
  DECLARE @v_date DATE

  DECLARE c1 CURSOR FOR
    SELECT GETDATE()

  OPEN c1
  FETCH c1 INTO @v_date
  CLOSE c1
  DEALLOCATE c1   

  PRINT @v_date
GO

--Execution of procedure
EXEC sp_disp_date

--Output
2022-03-16

19. Sequence

Oracle:

CREATE SEQUENCE id_seq
  START WITH 1
  MINVALUE 1
  MAXVALUE 999999
  INCREMENT BY 1
  CACHE 10
  CYCLE;

SELECT id_seq.NEXTVAL FROM dual;

OUTPUT: 1

SELECT id_seq.CURRVAL FROM dual;

OUTPUT: 1

SQL Server:

CREATE SEQUENCE Test.id_Seq As decimal(3,0)  
  START WITH 1
  INCREMENT BY 1
  MINVALUE 1 
  MAXVALUE 999999
  CACHE 10
  CYCLE
Go

SELECT NEXT VALUE FOR Test.DecSeq
Go

OUTPUT: 1

20. BLOB, CLOB

LOB TypeSQL Server Data TypeMax. Size
BLOBvarbinary(MAX)2,147,483,647
CLOBvarchar(MAX)2,147,483,647
CLOB – Unicodenvarchar(MAX)1,073,741,823

21. Meta data tables

OracleSQL ServerMeta data of
ALL_DIRECTORIES All directories
ALL_OBJECTS, DBA_OBJECTS, USER_OBJECTSsys.objectsAll DB objects
ALL_PROCEDURES, DBA_PROCEDURES, USER_PROCEDURESsys.procedures 
ALL_SOURCE, DBA_SOURCE, USER_SOURCEsys.sql_modules, INFORMATION_SCHEMA.ROUTINESSource code of all stored programs
ALL_SYNONYMS, DBA_SYNONYMS, USER_SYNONYMS All synonyms
ALL_TABLES, DBA_TABLES, USER_TABLESsys.tables, INFORMATION_SCHEMA.TABLESAll Tables
ALL_VIEWS, DBA_VIEWS, USER_VIEWSINFORMATION_SCHEMA.VIEWSALL views
ALL_USERS, DBA_USERS, USER_USERS All Users
SEQUENCESsys.sequencesAll Sequences
COLUMNSsys.columns INFORMATION_SCHEMA.COLUMNSAll Columns
INDEXESsys.indexes, sys.index_columns, sys.foreign_keys, sys.foreign_key_columns, sys.partitionsAll Indexes
TABLESsys.tables, INFORMATION_SCHEMA.TABLESAll Tables
VIEWSsys.viewsAll Views
ALL_CONSTRAINTS DBA_CONSTRAINTS USER_CONSTRAINTSsys.check_constraints, sys.default_constraints, sys.key_constraints, sys.foreign_keys, INFORMATION_SCHEMA.TABLE_CONSTRAINTSAll constraints

22. ROWTYPE

Oracle:

Declare
  Cursor c1 is
    Select emp_id, emp_name
      from EMP;

  Rec EMP%RowType;
Begin
  Open c1;
  Fetch c1 into rec;
  Close c1;

  Dbms_output.put_line(rec.emp_id);
  Dbms_output.put_line(rec.emp_name);
End;

SQL Server:

Begin
  DECLARE @emp_id int, @emp_name varchar(50)

  DECLARE c1 Cursor for
    Select emp_id, emp_name
      from EMP

  OPEN c1

  FETCH NEXT FROM c1
   INTO @emp_id, @emp_name

  CLOSE c1
  DEALLOCATE c1

  Print @emp_id
  Print @emp_name
End
Go

23. Exit, continue, break

Oracle:

BEGIN
  WHILE (select avg(siPercentageCharge + 1) 
           from table1) < 18

  LOOP
    UPDATE table1
       SET siPercentageCharge = siPercentageCharge + 1;

    If (SELECT MAX(siPercentageCharge) 
          from table1) >= 20
      Exit;
    End if;
  End loop;
END;

SQL Server:

BEGIN
  WHILE (select avg(siPercentageCharge +1 ) 
           from table1) < 18
  BEGIN
    UPDATE table1
       SET siPercentageCharge = siPercentageCharge + 1

    If (SELECT MAX(siPercentageCharge) 
          from table1) >= 20
      BREAK
    ELSE
      CONTINUE
  END
END
GO

24. Date Arithmetic

OracleSQL Server
ADD_MONTHSDATEADD
DATE + / – NumberDATEADD
DATE1 – DATE2DATEDIFF
MONTHS_BETWEENDATEDIFF
LAST_DAYDATEADD(MONTH, DATEDIFF(MONTH, 0, @Date) + 1, 0) – 1

25. TypeCast using Cast, To_Date, To_Char, To_Number, Convert

Oracle:

SELECT '30-APR-2015' Str_Date,
       CAST('30-APR-2015' AS DATE) Date1,
       To_date('30-APRIL-2015', ‘DD-MON-YYYY’) Date2,
       41.522 Num1,    
       CAST(41.522 AS CHAR(10)) Str_Num,
       TO_NUMBER('41.522') Num2,
       CAST('41.522' as number(10,2)) Num3,
       To_Char(41.522) str_num2,
       To_char(sysdate, 'DD-MON-YYYY') str_date2
FROM dual;

SQL Server:

SELECT '30-APR-2015' Str_Date,
       CAST('30-APR-2015' AS DATE) Date1,
       CONVERT(NVARCHAR, '30-APRIL-2015', 0) Date2,
       41.522 Num1,   
       CAST(41.522 AS VARCHAR(10)) Str_Num,
       CAST('41.522' as DECIMAL(10,5)) Num2,
       CONVERT(DECIMAL(10,5), '41.522') Num3,
       CONVERT(varchar(10), 41.522) str_num2,
       CAST(getdate(), 'DD-MON-YYYY', 101) str_date2
go

26. Execute Immediate

Oracle:

DECLARE
  V_sql varchar2(1000);
  V_columnList varchar2(75);
  V_city varchar2(75);
Begin
  V_columnList := 'AddressID, AddressLine1, City';
  V_city := 'London';
  V_sqlCommand := 'SELECT '||v_columnList||
                  ' FROM Person_Address WHERE City = ‘||v_city;
  EXECUTE immediate v_sql;
End;

SQL Server:

Begin
  DECLARE @sqlCommand nvarchar(1000)
  DECLARE @columnList varchar(75)
  DECLARE @city varchar(75)

  SET @columnList = 'AddressID, AddressLine1, City'
  SET @city = 'London'
  SET @sqlCommand = 'SELECT ' + @columnList +
                    ' FROM Person.Address WHERE City = @city'

  EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', 
          @city = @city
End
Go

   Or

Begin
  DECLARE @sqlCommand varchar(1000)
  DECLARE @columnList varchar(75)
  DECLARE @city varchar(75)

  SET @columnList = 'AddressID, AddressLine1, City'
  SET @city = '''London'''
  SET @sqlCommand = 'SELECT ' + @columnList +
                    ' FROM Person.Address WHERE City = ' + @city

  EXEC (@sqlCommand)
End
Go

In case of any discrepancies or doubts do contact me.
Best of Luck Friends.

Published by Girish Kirtikumar Mehta.

Software engineer with 25+ years of experience in software development. Have exposure to domains like Core Banking System, Islamic Banking, Mutual Funds, Credit Cards, Insurance, Digital Gifts, Accounting, Construction, etc. Developed applications using C, various versions of Delphi (3, 5, 7, 2005, 2007, Xe2, Xe8 and 12.2), Oracle SQL & PL/SQL, MS SQL & T-SQL, MySQL, MS Access.

One thought on “Comparison of Oracle & SQL Server

Leave a comment