'SQL'에 해당되는 글 3건

  1. 2010.09.01 [강좌A11] 안드로이드 실전 개발 - 데이터베이스 : Part3 (Motodev database) (7)
  2. 2010.08.06 SQL & PL/SQL Naming Convention (3)
  3. 2010.08.06 SQL Style Guide (1)
2010.09.01 13:41

[강좌A11] 안드로이드 실전 개발 - 데이터베이스 : Part3 (Motodev database)




이번의 강좌는 잠깐 쉬어가는 편입니다. Database 개발 관련하여 글을 쓰다가 Motodev의 Database 기능을 사용해 봤는데, 생각보다 너무 좋습니다. 유용한 기능이 많아서 소개할까 합니다. 대부분 그림이니 맘 편하게 보시고 한 5분 정도만 투자하셔서 해 보시면 될 것 같습니다.

전체 강좌 목차

[강좌A01] Moteodev Studio를 이용한 안드로이드 개발 환경 구축 가이드
[강좌A02] 안드로이드 개발 참고 서적 소개
[강좌A03] Android 실전 개발 - 아이디어 / 기획 / Wireframe
[강좌A04] 안드로이드 실전 개발 - 아이콘 제작
[강좌A05] 안드로이드 실전 개발 - 레이아웃 및 리소스 : Part1
[강좌A06] 안드로이드 실전 개발 - 레이아웃 및 리소스 : Part2
[강좌A07] 안드로이드 실전 개발 - 리소스 해킹
[강좌A08] 안드로이드 실전 개발 - SQLite

[강좌A09] 안드로이드  실전 개발 - 데이터베이스 : Part1
[강좌A10] 안드로이드  실전 개발 - 데이터베이스 : Part2
[강좌A11] 안드로이드  실전 개발 - 데이터베이서 : Part3 (Motodev database)

1. Database 생성하기. 테이블 생성하기.

먼저, Motodev를 실행하고, Window > Open Perspective > Motodev Database 퍼스펙티브를 실행합니다.



왼쪽의 Motodev Database Explorer에서 우리 프로젝트인 Hangul2English를 선택한 후 우측마우스 > Create database.. 를 선택합니다.



데이터베이스명을 hangul2english.db라고 입력한 후 OK. 데이터베이스가 생성됩니다.
실제 데이터베이스는 프로젝트 디렉토리의 assets\ 하위에 생성됩니다. 테이블 생성을 위해서 생성한 DB를 아래 그림 처럼 선택하고 Connect 를 선택하여 DB에 연결합니다.



데이터베이스가 연결되면 파란색 아이콘이 생성됩니다. 우측마우스 > Create Table .. 선택합니다.



테이블명 및 컬럼 정보를 입력합니다.



테이블 정보 입력 완료된 화면입니다. Finish를 누르면 테이블이 만들어집니다.

2. DDL문 Generate 하기.

Motodev Database Explorer에서 생성한 db를 선택한 후 우측마우스 클릭 > Generate DDL을 선택하여 DDL문을 만들 수 있습니다.

3. DML 실행 및 테스트

Motodev Database에서는 SQL문도 처리가 가능합니다. Motodev Database Explorer에서 아래 그림과 같이 Open SQL Scrapbook을 선택하여 실행합니다.



열린 SQL Scrapbook 에디터에서 SQL문을 실행하면 하단 Grid에 결과가 나타납니다.<아래그림>


4. Create Database Management Classes..

정말 좋은 기능은 이 기능입니다. Database 관련 class를 자동으로 만들어 줍니다.
아래 그림처럼Motodev Database Explorer에서 Create Database Management Classess.. 를 실행합니다.



필요한 정보를 수정한 후 Finish 누르면……짜자잔~


2개의 class가 만들어 졌습니다. Generate 된 소스는 길어서  캡처하지 않았습니다. 한 번 해보시기 바랍니다.

일반적으로 Android database 개발은 다음과 같이 구분할 수 있습니다.

데이터베이스 생성 방식에 따라
1. Code.에서 DDL문 실행 – 일반적인 방식. 간단하고 초기 적재해야 될 데이터가 적은 경우.
2. Assets 폴더에 DB를 생성한 후 실행시에 DB 파일을 복사해서 처리하는 방식 – 초기 데이터가 많거나 DB구조가 복잡할 때 주로 사용함.

데이터베이스 관련 코드 개발 방식에 따라
1. Contents Provider – DB를 다른 어플과 공유해야 할 때, 혹은, 여러명이 개발할 때 주로 사용하는 방식으로 DB 처리를 별도의 Provider로 제공하는 방법
2. 직접 DB Access – 직접 DB에 query를 실행하여 처리하는 방식

위에서 준 옵션으로 Class를 Generate 했을 때는 테이블명 + ContentProvider.java라는 이름의 Content Provider용 자바 코드가 만들어지며, 데이터베이스는 생성했기 때문에 asets\하위에 생성된 db 파일을 복사해서 db를 생성하도록 코드가 만들어졌습니다.

필요한 코드를 Motodev에서 다 만들어주니 일이 한결 수월해 지는 군요.
그리고 앞서 제가 개발한 DB소스에서 다루지 않은 두 부분으로만 코드가 만들어 졌으니 정말 딱입니다.

생성된 클래스 파일을 지우고, Generate Content Providers for each table 체크를 끄고 다시 코드를 Generate 해보니, Content Provider Code만 생성이 안되고 나머지 처리는 동일하게 진행이 되었습니다.

끝으로 Motodev Database를 이용하면 애뮬레이터나 폰에서 테스트 할 때 DB에 붙어서 Query를 실행하고 DDL문을 Generate하는 식의 작업이 가능합니다.

다음 화면은 제 애물레이터의 telephony provider의 mmssms.db의 테이블 스키마를 Motodev Database Explorer에서 확인한 화면입니다.



이로서 안드로이드 실전강좌 데이터베이스 편을 마칩니다. 곧 이어 Main UI 소스 부분도 오픈 됩니다.


Trackback 3 Comment 7
  1. 이유진 2010.09.25 18:18 신고 address edit & del reply

    안드로이드를 공부하면서 어플을 만들고 있는 학생입니다.질문이 하나 있는데요. 따로 디비를 만든것은 SQLite용으로 변환하여 사용 할려고 하는데 그방법을 모르겠습니다. 관련 자료나 소스 있으시면 kodog1022@naver.com으로 메일하나 날려주시면 고맙겠습니다 ^^;

  2. kenny 2010.11.19 08:15 신고 address edit & del reply

    보고픈 글쓴이님 Eclipse에도 똑같은 기능을 쓸수있을까요? motodev만된다면, 갈아타야겠네요. 은근히 좋은 옵션인거같아보여요.

    • 보고픈 2010.11.20 10:09 신고 address edit & del

      Motodev를 이클립스 플러그인으로 설치하셔서 사용하시면 됩니다. 다운은 http://developer.motorola.com/docstools/motodevstudio/download/ 요기서 하시면 됩니다.

  3. kenny 2010.11.23 10:06 신고 address edit & del reply

    보고픈님 감사합니다.저도 강좌를 보다 마음이 급해서 플러그인을 설치하고야말았어요.
    꽤 gui가 많이 변하거같으면서도 변한거는없이 플러그인설치로인해 옵션이 더많이늘어났네요. ^^
    자주얘기해요 보고픈님.

  4. ugg boots kids 2010.11.25 17:48 신고 address edit & del reply

    Nothing is impossible to a willing heart。

  5. ugg boots kids 2010.11.25 17:50 신고 address edit & del reply

    Nothing is impossible to a willing heart。

2010.08.06 14:25

SQL & PL/SQL Naming Convention



본 내용은 이전에 작성된 SQL Style Guide에 이어진 문서입니다. 별도로 보셔도 상관없으나 함께 보시면 더 많은 도움이 되실 겁니다.   

Naming Conventions

 

File Naming Conventions

PL/SQL이나 SQL에서 코드를 저장할 때 다음과 같은 확장자를 사용한다. Oracle Object 타입별로 확장자를 사용함으로써 Toad 같은 툴에서 해당 에디터를 바로 실행시킬 수 있으며, 향후 Version Control 시스템과 연동하기도 유리하다. 또한, Object의 유지관리 및 editplus 같은 편집기에서 해당 확장자별로 Syntax Coloring 을 적용하기도 유리하다.

File Type

Extension

Package (spec, and optionally body)

pkg

Package Body

pkb

Procedure

prc

Function

fnc

Object type (spec, and optionally body)

typ

Object type body

tyb

Stored Java Procedure

sjp

Stored Java Function

sjf

Trigger

trg

Any other PL/SQL

pls

Any other SQL

sql

표 1 File Name Convention

Variable Names < Identifier elements>

일반적으로 변수명은 다음과 같은 5가지 요소로 구성되어진다. <Scope><Type><Primary Identifier><Modifier><Suffix> 하지만, 본 가이드에서는 <Scope><Type>을 하나의 <Prefix>로 구성하여 <Prefix><Primary Identifier>로 변수명을 구성한다.

변수명의 CASE는 prefix<소문자>_Primary Identifier<Camel Case>와 소문자 + '_'로 구성한다. CamelCase가 원칙이며, 오라클 변수 스타일인 소문자와 underbar(_)만으로 연결된 변수 스타일도 허용한다. 예) v_SiteCode(O), v_site_cd (o)

 

Prefix

 

글로벌 변수 : 'g_' + Primary Identifier

글로벌 변수는 주로 패키지 레벨에서 사용되며, private, public 변수에 상관없이 g 접두어를 사용한다. 예) g_ErrorText, g_SiteCode

로컬변수 : 'v_' + Primary Identifier

로컬변수는 로컬식별자인 l 과 변수식별자인 v로 합쳐서 구성할 수도 있으나, 변수식별자인 v만용 사용하여 작성한다. 예) ), v_SiteCode(O), lv_SiteCode(X), l_SiteCode(X)

파라미터변수 : 'p_' + Primary Identifier

주로 프로시저나 함수의 파라미터에 사용되며 접두어 p를 사용한다. in 파라미터, out 파라미터에 대한 suffix는 사용하지 않는다. 예) p_SiteCode(O), p_ProductModelCode(O), p_SiteCode_out (X)

상수 : 'K_' + Primary Identifier

상수는 접두어K를 사용한다. 일반적으로 c_를 사용할 수도 있으나, c는 cursor 변수인 경우에 사용하며 상수의 경우에는 K_를 사용한다. 상수의 경우에는 일반적인 코딩 관습에 따라 예외적으로 대문자로만 변수명을 구성한다. 예) K_InsertMsg(O), K_ACTION_TYPE(O)

커서 변수 : 'c_' + Primary Identifier

커서변수의 경우에는 접두어 'c'를 사용한다. cursor parameter경우에는 접두어 'cp'를 사용한다. 예) c_Employees, c_ModelCode

레코드변수 : 'r_' + Primary Identifier

테이블이나 커서의 ROWTYPE 변수의 경우에는 접두어 'r을 사용한다. 로컬변수라도 v 접두어와 함께 사용하지 않는다. 예) r_employee

루프변수

루프변수는 일반적으로 i, j 같은 simple 변수명을 사용한다. 그러나 v_month 같이 상황에 따라 의미있는 변수를 사용할 수도 있다. 예) FOR v_month IN 1 .. 12 LOOP

 

Primary Identifier

주 식별자는 변수명의 구성요소 중 가장 중요한 부분으로 의미적으로 명확한 것을 사용한다. 대체로 컬럼명은 약어들로 구성되므로 Primary Identifier로 컬럼명을 사용하기 보다는 Full Name을 사용하는 것을 권고한다. 예) v_PrdMdlCd (X), v_prd_mdl_cd(), v_ProductModelCode(O)

Object Naming Conventions

스키마 레벨의 오브젝트 테이블명, 컬럼명, 프로시저, 함수, 타입, 트리거 등의 Naming에 대한 가이드는 <Prefix><Primary Identifier><Suffix> 구조를 따른다. 테이블명과 컬럼명은 물리모델링 가이드를 따르며, 본 문서에서는 프로시저, 함수, 패키지, 타입명에 대한 규칙만을 정의한다. 데이터베이스 오브젝트명은 모두 대문자와 Underbar(_)로만 작성함을 원칙으로 한다.

함수명 : 'FN' + '_' + 함수 식별자

함수명은 'FN' 접두어를 사용한다. 예)FN_GET_ENG_NAME 단, 패키지내의 함수명은 FN 접두어를 사용하지 않아도 된다. 예) PKG_UTIL.GET_WORKING_DAY

 

프로시저 : 'SP' + '_' + 프로시저 식별자

프로시저명은 'SP' 접두어를 사용한다. 예) SP_SYS_LOG 단, 패키지내의 프로시저명은 FN 접두어를 사용하지 않아도 된다. 예) PKG_CODE.GET_CODE_LIST, PKG_COMMON.GET_LOCAL_TIME

 

패키지 : 'PKG' + '_' + 패키지 식별자

패키지명은 'PKG' 접두어를 사용한다. 예) PKG_DEPLOY 패키지 내의 함수, 프로시저 등의 오브젝트명은 접두어를 사용하지 않는 것을 원칙으로 한다. 예) PKG_COMMON.GET_SYS_TIME(O), PKG_COMMON.GET_USER_NAME(O)

 

타입 : 'T' + '_' + 타입 식별자

타입은 'T' 접두어를 사용한다. 예) T_VC_TAB

 

트리거 : 'TR' + '_' + 트리거 식별자<테이블명>

트리거명은 'TR' 접두어를 사용한다. 트리거가 트리거링 되는 조건에 관한 세부사항 (befor, after/Insert, Update, delete 등)은 트리거명에 넣지 않는다., 예) TR_SYS_USER

 

시퀀스 : 테이블명 + '_' + 'SEQ'

시퀀스 객체는 시퀀스 컬럼을 가진 테이블마다 하나씩 만드는 것을 원칙으로 하며, 접두어를 사용하지 않고, 'SEQ' 접미사를 사용한다. 예)USER_DEPT_SEQ

 

JOB : 'JOB' + '_' + Primary Identifier + ['_' + 스케줄정보]

JOB 객체나 Scheduled Job의 경우에는 'JOB' 접두어를 사용한다. 예) JOB_RSS 부가적으로 JOB 명에 배치주기 정보를 포함해도 무방하다.

 

Object Type

Naming Convention

Function

'FN' + '_' + 함수 식별자

Procedure

'SP' + '_' + 프로시저 식별자

Package

'PKG' + '_' + 패키지 식별자

Type

'T' + '_' + 타입 식별자

Trigger

'TR' + '_' + 트리거 식별자<테이블명>

Sequence

테이블명 + '_' + 'SEQ'

Job

'JOB' + '_' + Primary Identifier

표 2 Object Name Convention

 

Comments

주석은 유지보수 및 코드 설명을 위해 반드시 입력한다. 주석 입력단위는 DDL 이나 DML 스크립트를 파일로 작성할 때 파일레벨의 주석, 그리고 스키마의 OBJECT 레벨의 주석, 패키지내의 함수나 프로지저 등 서브 오브젝트, 그리고 프로그램 코드 중 필요한 부분에 주석을 작성한다.

주석문은 /* */ 를 사용하지 않고, -- 문을 사용하는 것을 원칙으로 한다.

파일레벨 / 스키마 OBJECT 레벨의 주석

파일레벨 이나 스키마 Object 레벨에서는 파일명이나 오브젝트 명 및 설명, 변경정보 등을 기술한다.

-- *****************************************************************************
-- Name : Support_RSS_DDL_20081119.SQL
-- Description : Support_RSS_연동기능 추가
--
-- History
-- 2008.11.19 jinook.lee 1.최초 생성
-- **************************************************************************************

 

함수 / 프로시저 등의 OBJECT 레벨의 주석

함수는 프로시서등의 오브젝트는 위의 기본 주석에 파라미터 정보, 리턴값 정보를 추가로 입력한다.

-- *****************************************************************************
-- Name : FN_URL_STR
-- Description : 문자열에 특수문자 공백을 제거한 문자열을 리턴
-- Param : p_String - 변환전 문자열
-- Return : 변환된 문자열.
--
-- History
-- 2007-10-08 jinook.lee 1.Created
-- ******************************************************************************

 * 끝으로 SQL Style Guide & Code Convention에 대한 출력자료(PDF문서)가 필요하시면 Comment로 남겨주시면 메일로 보내드립니다. 너무 요청자가 많으면 파일을 업로드 해 드리도록 하겠습니다. ㅋㅋ 제 생각에는 별로 요청하시는 분 없을것 같거든요.

'데이터베이스 > SQL' 카테고리의 다른 글

SQL & PL/SQL Naming Convention  (3) 2010.08.06
SQL Style Guide  (1) 2010.08.06
Trackback 0 Comment 3
  1. 기려심매 2010.08.12 11:30 신고 address edit & del reply

    정리가 잘 되어 있네요. 자료좀 부탁드리겠습니다.^^ dreamaker7@naver.com
    감사합니다.

  2. exexit 2010.10.06 19:42 신고 address edit & del reply

    exexit@naver.com 자료좀 부탁합니다.

  3. 떠비 2011.06.16 17:38 신고 address edit & del reply

    잘봤습니다. 필요한자료입니다.
    오라클 pl/sql 코딩 가이드 추가 자료 있으면 부탁드리겠습니다.
    감사합니다.

    sonicbaba@hanmail.net

2010.08.06 13:31

SQL Style Guide



아래 내용은 제가 2008년 프로젝트 당시에 작성한 문서입니다. 당시, 자바나 닷넷은 Code Style Guide 혹은 Code Convention등의 문서가 많았지만, SQL 및 PL/SQL에 대한 문서는 거의 없어서 제가 작성했던 문서입니다. 블로그 만든 기념으로 그 때 문서를 공유합니다. 문서가 길어서 Style Guide 와 Naming Convention 편을 분리해서 작성했습니다. 실제 내용은 프로젝트 개발자를 위한 가이드라서 좀 딱딱한 문체로 기술되었습니다.

프로젝트 팀간의 Formatting 공유를 위해 제가 사용중인 Toad용 Formatting 파일을 함께 첨부합니다. 첨부파일은 Toad Version별로 커스터마이징 되어 있습니다. 자신의 버전에 맞는것을 다운 받아 덮어쓰시면 됩니다. 모, 직접 Toad Formatter를 하나하나 설정해서 사용하셔도 됩니다.

본  문서는 SQL 작성시 필요한 기본적인 Coding Style을 제공함으로써 SQL의 가독성을 높이고 유지보수 편의성을 제공하고자 한다.

Basic Layout

 

Tabs

기본적인 탭 사이즈는 4로 한다. 또한, 탭을 나타낼 때 Tab을 사용하지 않고 Space를 사용한다.

Margin

출력을 위해서는 80컬럼을 기본적으로 사용하나, SQL은 복잡한 Subquery 사용시 라인이 많이 늘어나므로 기본적으로 120 컬럼을 사용한다.

Indenting

기본적인 Indent 사이즈는 4로 Tab 사이즈와 동일하게 한다.

Case

 

SQL은 대문자를 사용하여 작성함을 원칙으로 한다. 아래에 특별히 언급하지 않은 모든 텍스트는 대문자(Uppercase)를 사용하여 작성한다.

Keywords

SQL의 모든 키워드 (예:SELECT, INSERT, BEGIN 등)는 모두 대문자(Uppercase)를 사용한다.

Built-ins / Built-in packages

DBMS에 내장된 함수 (DECODE, SUBSTR, NVL 등) 및 내장 패키지 (DBMS_OUTPUT, DBMS_SQL, UTL_FILE 등)는 모두 대문자(Uppercase)를 사용한다.

Table Name / Column Name

일반적으로 테이블 명 및 컬럼명, Alias 명, User 함수명 등은 소문자를 주로 사용하나 국내에서 테이블명 및 컬럼명이 약자를 주로 사용하므로 대문자가 가독성이 높아 모두 대문자(Uppercase)로 기술하는 것을 원칙으로 한다.

 

PL/SQL Variables

PL/SQL의 변수명은 예외적으로 대문자를 사용하지 않으며, 접두어 및 Camel 표기법을 사용한다. 상세한 내용은 Naming Rule 부분을 참조한다.

Lists and Operators

 

Variable Declarations

변수선언은 변수명과 변수타입명의 정렬방식은 세로줄라인을 맞추는 Fixed 방식을 사용한다.

Alignment

(Fixed)

var1                        NUMBER(20);
my_string                 VARCHAR2(15);
v_C22 CONSTANT VARCHAR2(20) := 'GLOBAL';

(Compact)

var1 number(20);
my_string varchar2(15);
v_C22 CONSTANT VARCHAR2(20) := 'GLOBAL'; 

 

Parameter Declarations

함수, 프로시저, 패키지 등의 PL/SQL에서의 파라미터 선언 스타일은 각 변수별로 한 라인씩 작성하는 Stacked 방식을 사용한다. 정렬방식은 각 변수별로 변수명, 타입등의 세로줄을 맞추는 Fixed 방식을 사용한다.

단, 파라미터 변수가 2~3개이어서 한 라인을 넘지 않는 경우에는 변수를 라인별로 작성하지 않고 한 라인에 기술할 수 있다.

Style

(Stacked)

P1 IN NUMBER,
P2 OUT VARCHAR2,
P3_VAR OUT NUMBER

(Wrapped)

P1 IN NUMBER, P2 OUT VARCHAR2, P3_VAR OUT NUMBER, P4 IN VARCHAR2,
P5 IN NUMBER

 

Alignment

(Fixed)

P1           IN     NUMBER,
P2           OUT VARCHAR2,
P3_VAR  OUT NUMBER

(Compact)

P1 IN NUMBER,
P2 OUT VARCHAR2,
P3_VAR OUT NUMBER

 

Parameters

함수나 패키지등을 호출할 때 파라미터 변수를 입력하는 방식은 기본적으로는 Wrapped 방식 – 모든 파라미터 변수를 한줄에 입력하여 호출하도록 한다.

단, 파라미터로 입력하는 내용이 너무 길어질 경우 여러줄로 입력하여 한눈에 파악할 수 있도록 작성한다.

Named Parameters의 경우에는 여러줄로 나누어서 호출하는 것을 원칙으로 하며, 변수명과 인자값은 각 세로줄을 맞추는 Fixed 방식을 사용한다.

Style

(Wrapped)

MY_PROCEDURE((3 + 4) * A, VAR1, VAR2, VAR3);

(Stacked)

MY_PROCEDURE((3 + 4) * A
                               ,VAR1 
                               ,VAR2 
                               ,VAR3));

(Stack only on line overflow)

SELECT REPLACE(SYS_CONNECT_BY_PATH(PRD_IA_NAME, '>'), '>', P_DELIM)
INTO v_Path
FROM CATEGORY
WHERE PRD_IA_CD = :p_ProductIACode
AND PRD_IA_CD = GET_PIA_CD(p_SiteCode
                                                        ,p_ProductIACode
                                                        ,p_StartIATypeCode
                                                        ,p_ProductIaCode);

 

Aligment for Named Parameters (p => x)

(Fixed)

VAR1             => 1,
VARIABLE2   => 2 + A,
X                    => SIN(P2)

(Compact)

VAR1 => 1,
VARIABLE2 => 2 + A,
X => SIN(P2)

 

Parentheses

함수 호출시 괄호 및 스페이스 처리에 대한 규칙은 호출하는 인자들 간에만 공백을 주고, 함수명, 프로지서명과는 공백을 주지 않는다. 또한, 첫번째 변수와 마지막 변수와 괄호 사이에도 공백을 넣지 않는다.

Parentheses

MY_PROC(PART1, PART2)

Compact

MY_PROC (PART1, PART2)

파라미터, 컬럼리스트 이전에 공백 넣기

MY_PROC( PART1, PART2 )

괄호 안쪽에 공백 넣기

MY_PROC ( PART1, PART2 )

전부 공백 주기

 

Commas

컬럼리스트, 파라미터 리스트 등에서 ,(콤마)는 컬럼 앞에 둔다. 일반적으로 컬럼 뒤에 많이 기술하나 ,(콤마)를 앞쪽에 두면 콤마의 누락을 쉽게 파악 할 수 있다.

Commas

 ITEM1, 
,ITEM2, 
,ITEM3

콤마 + 리스트

(정렬은 단어기준으로 정렬, 첫번째 컬럼은 한칸 들여쓰기)

ITEM1, 
ITEM2,
ITEM3

리스트 + 콤마

  ITEM1
, ITEM2
, ITEM3

콤마 + 공백 + 리스트

        ITEM1
,       ITEM2
,       ITEM3

콤마 + 공백(여러 ) + 리스트

- CDM Style

 

And – Or

Where 조건에서 AND, OR 연산자를 사용할 때 기본적으로 각 연산자를 기준으로 한라인씩 기술하는 Stacked 방식을 사용하여 기술한다.

또한, AND, OR가 동시에 사용되는 경우에는 OR 부분을 명확히 하기 위해서 ( )를 사용하여 표기한다. 그리고 연산자를 좌측에 두고 컬럼리스트가 좌측 정렬되도록 정렬한다.

Style

(Stacked)

A > B
AND C < F(U,V)
AND X =Z

 

(Wrapped)

A > B AND C < F(U,V)
AND X =Z

 

 

Arrangement

         A > B
AND C < F(U,V)
AND X =Z

연산자를 좌측에, 컬럼 기준으로 정렬

A > B
AND C < F(U,V)
AND X =Z

좌측 정렬, 연산자를 좌측에

A > B AND
C < F(U,V) AND
X =Z

연산자를 우측에

A > B          AND
C < F(U,V) AND
X =Z

연산자를 우측, 연산자를 기준으로 정렬

 

Sample (AND, OR 동시 사용시)

SELECT PRD_IA_CD 
  FROM MODEL
 WHERE SITE_CD = 'kr'
   AND  PRD_MDL_CD = 'CODE'
       OR PRD_MDL_NAME = 'NAME')

SELECT PRD_IA_CD
  FROM MODEL
 WHERE SITE_CD = 'kr'
       AND PRD_MDL_CD = 'CODE'
   OR PRD_MDL_NAME = 'NAME'

SELECT PRD_IA_CD
  FROM MODEL
 WHERE SITE_CD = 'kr'
  AND(PRD_MDL_CD = 'CODE'
  OR PRD_MDL_NAME = 'NAME')

 

Plus-Minus-Mul-Div-Conat

사칙연산 및 문자열 연결 연산자의 경우 연산자를 기준으로 여러줄로 작성하지 않고, 한 줄로 기술한다.

Style

(Wrapped)

EXPR1 – F(ARG200) + EXPR3 – EXPR4

(Stacked)

EXPR1
- F(ARG200)
+ EXPR3

 

Specific Statements

 

:= Assignments

변수에 값을 할당할 때는 할당연산자(:=)를 기준으로 정렬한다.

Alignment

(Fixed)

v_SiteCode                 := 'kr'
g_ProductModelCode := 'AAAAB';
x                                 := func(p_Val);

(Compact)

v_SiteCode := 'kr'
g_ProductModelCode := 'XXXXX';
x := func(p_Val);_

 

SELECT / FETCH / EXECUTE

SELECT 문을 기술할 때 SELECT, INTO, FROM WHERE 등의 키워드는 우측 정렬을 원칙으로 한다.

Alignment

SELECT COL1, COL2
    INTO VAR1, VAR2
  FROM MY_TAB1, MY_TAB2;

SELECT COL1, COL2
INTO      VAR1, VAR2
FROM    MY_TAB1, MY_TAB2;

 

SELECT문의 컬럼 리스트는 한줄에 하나의 컬럼을 기술하는 것을 원칙으로 한다. 단, SQL의 조회하고자 하는 컬럼의 개수가 적어 한 줄에 기술이 가능한 경우에는 한 줄에 써도 무방하다.

Style of SELECT / INTO and FETCH / EXECUTE lists

(Stacked)

SELECT FIRST_COL
              ,SECOND_COL 
             ,THIRD_COL …

(Wrapped)

SELECT FIRST_COL, SECOND_COL,
THIRD_COL …

 

SELECT 컬럼 리스트와 동일하게 FROM, ORDER BY, GROUP BY RETURNING 리스트 도 한 줄에 하나의 컬럼을 기술하는 것을 원칙으로 한다. SELECT 문과 동일하게 해당절의 컬럼 개수가 적어 한 줄에 기술이 가능한 경우에는 한 줄에 써도 무방하다.

Style of FROM, ORDER BY , GROUP BY and RETURNING lists

(Stacked)

ORDER BY FIRST_COL
                 , SECOND_COL
                 ,THIRD_COL

(Wrapped)

ORDER BY FIRST_COL, SECOND_COL,
THIRD_COL

 

INSERT

INSERT문도 SELECT 문과 동일한 스타일을 따른다. 즉 INSERT문을 기술할 때 INSERT INTO, VALUES 등의 키워드는 우측 정렬을 원칙으로 한다.

Alignment

INSERT INTO MY_TAB (COL1, COL2)
        VALUES (VAL1, VAL2);

INSERT INTO MY_TAB
(COL1, COL2)
VALUES (VAL1, VAL2);

 

INSERT 문의 컬럼이나 VALUES리스트는 SELECT문의 컬럼 리스트와 동일하게 한줄에 하나의 컬럼을 기술하는 것을 원칙으로 한다. 단, SQL의 조회하고자 하는 컬럼의 개수가 적어 한 줄에 기술이 가능한 경우에는 한 줄에 써도 무방하다.

Style of COLUMN and VALUES lists

(Stacked)

INSERT INTO MYTAB
               ( FIRST_COL
                ,SECOND_COL
                ,THIRD_COL …

(Wrapped)

INSERT INTO MYTAB 
               ( FIRST_COL, SECOND_COL
               , THIRD_COL …

 

UPDATE

UPDATE문도 SELECT 문과 동일한 스타일을 따른다. 즉 UPDATE문을 기술할 때 UPDATE, SET, WHERE 등의 키워드는 우측 정렬을 원칙으로 한다.

Alignment

UPDATE MY_TAB 
       SET COL1 = EXPR1 
              ,COL2 = PXPR2

UPDATE MY_TAB
SET COL1 = EXPR1,
        COL2 = PXPR2

 

DELETE

DELETE문도 SELECT 문과 동일한 스타일을 따른다. 즉 DELETE문을 기술할 때 DELETE, WHERE 등의 키워드는 우측 정렬을 원칙으로 한다.

Alignment

DELETE FROM MY_TAB
             WHERE …

DELETE FROM MY_TAB
WHERE …

 

 

Table Alias

 

Join문에서 Table Alias를 부여할 때 일반적으로 A, B, C 순으로 작성하는 경우가 많다. 이것보다는 테이블을 파악하기가 용이한 의미있는 약어를 사용한다. 단, 약어는 3자를 넘기지 않는다. 1글자로 구분이 가능한 경우에는 한 글자로 사용한다.

예)
DEPT => D
MODEL_CATEGORY_INF => M OR MC
HISTORY => H

Table Alias

SELECT COLS
 FROM EMPLOYEES E 
     ,COMPANIES C
     ,PROFILES P
     ,SALES S
 WHERE C.COM_ID = E.EMP_COM_ID
   AND P.PRO_COM_ID = C.COM_ID 
  AND S.SAL_COM_ID(+) = P.PRO_COM_ID

SELECT COLS
 FROM EMPLOYEES EMP
     ,COMPANIES COM
     ,PROFILES PRO
     ,SALES SAL
 WHERE COM.COM_ID = EMP.EMP_COM_ID
   AND PRO.PRO_COM_ID = COM.COM_ID
  AND SAL.SAL_COM_ID(+) = PRO.PRO_COM_ID

SELECT COLS
  FROM EMPLOYEES A 
      ,COMPANIES B
      ,PROFILES C
      ,SALES D
 WHERE B.COM_ID = A.EMP_COM_ID
   AND C.PRO_COM_ID = B.COM_ID
  AND D.SAL_COM_ID(+) = C.PRO_COM_ID

 

Toad Formatting

 

Use Formatting Tool

모든 개발자들이 공통적으로 위에서 정의한 SQL Style을 적용하기 위해서 Toad의 Formatting Tool을 사용한다. 다른 Tool들도 Formatting 기능을 제공하기는 하나, Toad가 포맷팅 기능은 가장 강력하다. 그러므로 개발자들이 다른 툴을 주로 사용하더라도 최종 SQL문에 대해서는 Toad의 포맷팅 기능을 사용하여 SQL 스타일을 맞추면 된다.

 

Formatting Setup

본 문서와 함께 제공되는 FmtPlus.opt 파일을 PC의 동일파일의 경로에 덮어쓴다.
예) C:\Users\Administrator\AppData\Roaming\Quest Software\Toad for Oracle\10.5\User Files\FmtPlus.opt에 존재함. 개인 개발자들의 정확한 위치는 Toad > View > Formatting Options 메뉴를 실행하면 열린 Formatter Window의 타이틀에 전체 경로가 나타난다. 그 부분을 참고하면 된다.

 

프로젝트 수행시 프로젝트에 맞는Formatting 옵션을 설정하고자 한다면, Toad Formatter에서 프로젝트에 적합하도록 수정한 후 해당 파일을 개발자에게 공유해서 동일한 포맷팅을 사용하도록 하면 된다.

 

그림 1 Toad Formatter 실행 화면

Toad에서 Formatting하기

아래 그림과 같이 Formatting을 하고자 하는 블록을 선택한 후 툴바를 클릭하면 SQL이 포맷팅 된다.
Edit > Format Code 를 선택해도 동일하다. 단축키는 Shift + Ctrl + F 이다.

 

그림 2 Formatting 이전 SQL

 

그림 3 Formatting 실행 이후

Exceptions

Toad로 대부분 필요한 수준의 Formatting이 되어지긴 하나, 일부 SQL에 대해서는 Formatting 한 결과가 오히려 한눈에 파악하기가 어려운 경우도 있으며, Toad v9.x에서는 MERGE 문 같은 경우는 제대로 처리조차 못하고 있다. 이런 경우에는 일반적인 관습을 따라서 개발자가 한눈에 파악하기 좋게 SQL을 작성하도록 한다.

 

Connect By 구문 작성시

CONNECT BY 구문 작성시 키워드의 글자 길이가 길어서 Formatting 툴을 사용하면 키워드를 기준으로 우측정렬 하는 현재 스타일에서 오히려 보기에 안 좋을 수도 있다. 이 경우에는 예외적으로 CONNECT BY의 Full Keyword를 기준으로 정렬을 해도 되고, CONNECT 키워드만을 기준으로 정렬을 해도 무방하다.

Connect By 등 Keyword의 글자 길이가 긴 경우의 예외처리

before

SELECT PRD_IA_CD
FROM CATEGORY
WHERE PRD_IA_TYP_CD = '02'
START WITH SITE_CD = :SITE AND PRD_IA_CD = :IA_CDODE
CONNECT BY PRIOR SITE_CD = SITE_CD
AND PRIOR UPPER_PRD_IA_CD = PRD_IA_CD;

(포맷팅후)

    SELECT PRD_IA_CD
      FROM CATEGORY
     WHERE PRD_IA_TYP_CD = '02'
START WITH SITE_CD = :SITE
       AND PRD_IA_CD = :IA_CDODE
CONNECT BY PRIOR SITE_CD = SITE_CD
       AND PRIOR UPPER_PRD_IA_CD = PRD_IA_CD;

(예외허용)

SELECT PRD_IA_CD
  FROM CATEGORY 
 WHERE PRD_IA_TYP_CD = '02'
 START WITH SITE_CD = :SITE
        AND PRD_IA_CD = :IA_CDODE
 CONNECT BY PRIOR SITE_CD = SITE_CD
        AND PRIOR UPPER_PRD_IA_CD = PRD_IA_CD;

 

MERGE 문 등의 예외 처리

Merge문 작성시 Toad v.9.x버전에서는 Formatting 툴을 이용하면 WHEN MATCHED THEN 구문 이후 UPDATE 문에 대해 기본적인 UPDATE 문에서 정한 Style이 적용되지 않는다. WHN NOT MATCHED THEN 이후의 INSERT 문도 마찬가지다. Toad v.10.x 에서는 제대로 포맷팅 된다.

이처럼 오라클의 버전업에 따른 신규 기능의 경우, 제대로 포맷팅이 안될 경우에는 Formatting 툴을 이용하지 않고 보기 좋게 스타일 가이드에 맞게 작성한다.

'데이터베이스 > SQL' 카테고리의 다른 글

SQL & PL/SQL Naming Convention  (3) 2010.08.06
SQL Style Guide  (1) 2010.08.06
Trackback 1 Comment 1
  1. KimSean 2011.02.15 16:04 신고 address edit & del reply

    좋은 자료네요^^;