본문 바로가기
Database/MSSQL

ORACLE/MSSQL 차이점

by 나비와꽃기린 2016. 5. 19.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

출처 http://www.sqler.com/271411

 

. DDL 구문
MSSQL  
 생성 : CREATE PROCEDURE / CREATE FUNCTION
 수정 : ALTER PROCEDURE / ALTER FUNCTION

Oracle : 
 생성과 수정 : CREATE OR REPLACE PROCEDURE / CREATE OR REPLACE FUNCTION
개인적인 경험에서 이 부분이 매우 어색했고, "Oracle 구문이 생각보다 편한데?" 라고 느꼈던 부분입니다.
생성하거나 수정하거나 동일한 구문을 쓴다는 것은 실제 객체 구현시 생각보다 편했습니다.

 

. 객체 이름 길이 제한
MSSQL : 
 Stored Procedure 혹은 Function 이름을 정하는데 특별히 신경써 본 기억이 없습니다.
 제한이 있긴 하지만, 제한만큼의 길이를 채워본적이 없습니다.
Oracle : 
 모든 객체 이름은 30자를 넘을 수 없습니다.
 
이 부분은 MSSQL DBA 태생인 저에게 매우 큰 고통을 주었습니다.
 
테이블 이름도 가끔 발생하지만... 프로시저 이름은 수시로 30자 압박에 시달립니다.
 
이름만 보고 어떤 기능의 프로시져인지 명확하게 이름짓기를 좋아하는 저에게는 스트레스였습니다.

 

. 변수선언
MSSQL : declare 라고 명시 후 어디서나 가능. @를 앞에 명시해야 함.
Oracle : 변수 선언 section이 있음. 객체이름 (테이블, 프로시져, 함수)에서 사용되지 않은 단어. prefix 등으로 구분하지 않아도 됨.
example)
CREATE OR REPLACE PROCEDURE USP_XXXXXXXXX
IS
 v_AddPartitionName varchar2(30);
 v_AddDate varchar2(8);
 v_DropPartitionName varchar2(30);
 v_i int;
BEGIN
END;
위의 붉은 색 부분이 변수 선언부분 입니다.
이 부분이 Oracle 문법이 불편합니다. 프로시저 작성 시 프로시져가 길어질 경우 변수를 바로 선언하지 못하고 맨 위로 올라가서 변수를 선언해야 합니다.
또한 변수를 구분하는 prefix 가 없는 것이 생각보다 불편합니다. 변수인지, 테이블인지, 컬럼인지 프로시져 내에서 바로 확인하기 위해 인위적은 prefix를 사용합니다.
parameter
의 경우 p_ ... 로컬 변수인 경우 v_ .. 흔히 사용합니다.

 

. 문자열 쿼리 실행 구문
MSSQL : exec ('SELECT * FROM TAB1');
Oracle : EXECUTE IMMEDIATE 'SELECT * FROM TAB';
이 부분은 큰 감상이 없습니다. DBMS 모두 기능을 제공해 줘서 고마웠다 정도...

 

. 프로시져 내의 DDL 가능 여부
MSSQL : 가능;
Oracle : 불가능. EXECUTE IMMEDIATE 를 이용하면 가능하지만, 추천해 주고 싶지 않음.
성능이나 기타 다른 관점은 논외로 하고... 임시테이블, 테이블 변수, truncate table 구문.. 등을 프로시져 내에서 간혹 사용할 일이 있습니다.
MSSQL은 아주 자연스럽게 사용이 가능했기에 별 의문없이 사용했습니다.
Oracle은 프로시져 내의 DDL이 기본적으로 모두 불가능합니다. 꼭 사용하고 싶다면, EXECUTE IMMEDIATE 를 사용해서 처리하여야 합니다.
한가지 더 언급하자면, Oracle은 객체 상태 라는 것이 있습니다. 프로시저나 함수가 생성은 되었지만, 객체 상태가 invalid 라고 되어 있으면 실행이 불가능 합니다.
MSSQL
은 일단 생성이 된 프로시져나 함수는 프로시져 생성 후 사용된 테이블을 수정해도 문법오류가 발생하도록 작성되어 있지 않는 한 알아서 컴파일 해서 실행합니다.
Oracle
의 경우 
일부 버전은 알아서 컴파일 해주지 않습니다. 객체 상태가 vaild에서 invalid 바뀌면서 실행이 불가능 해집니다.


Oracle
Package의 경우는 자동으로 컴파일 해준다고 합니다. (정확하지 않지만, 버전에 따라 다른 듯 합니다.)

이 부분이 전통적인 Oracle DBA들이 프로시져, 혹은 함수를 사용하고 싶지 않는 원인 중에 하나 입니다.

 

'Database > MSSQL' 카테고리의 다른 글

[MS] Transaction  (0) 2016.05.19
procedure  (0) 2016.05.18