출처 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 |