2012/01/04 18:38
저작자 표시 비영리 동일 조건 변경 허락

'IT > DB' 카테고리의 다른 글

MSSQL inet_ntoa, inet_aton  (0) 2012/02/14
오라클 트리거  (0) 2012/01/04
TOAD 단축키  (0) 2011/04/14
mysql 날짜지정 자동업데이트 컬럼  (0) 2010/12/24
mysql "Incorrect information in file: './database/table.frm'"  (0) 2010/12/23
mysql talbe stauts 정보  (0) 2010/12/17
Posted by 푸른_바람
2011/04/14 09:49
침고 : Toad Oracle 설명

테이블 정보 상세보기
F4 : Table, View, Proc, Funct, Package를 DESC(테이블명 위에 커서를 두고 F4키)
 
자동완성
Ctrl+. : Table Completion (매칭되는 테이블목록 출력)
Ctrl+T : Columns Dropdown (해당테이블의 컬럼목록 표시)
 
SQL문 실행
F5 : SQL Editor내의 모든 SQL문 실행
Ctrl+Enter : 현재 커서의 SQL문 실행
F9 : SQL문 실행 후 Grid에 출력
 
히스토리(과거 수행SQL문 조회)
F8 : 과거에 실행한SQL문 HISTORY 목록
Alt+Up : History UP
Alt+Down : History DOWN
 
텍스트 대/소문자 변환
CTRL+L : 텍스트를 소문자로
CTRL+U : 텍스트를 대문자로
 
주석처리
Ctrl+B : 주석처리
Ctrl+Shift+B : 주석해제
 
편집 창 전환(이동)
F6 : SQL Editor와 결과창간의 이동
F2 : SQL Editor창 전체화면 전환
Shift+F2 : Grid Output창 전체화면 전환
 
기타 단축키
F7 : 화면을 모두 CLEAR
Ctrl+Shift+F : 쿼리문을 보기좋게 정렬
Ctrl+F9 : SQL문 Validate (SQL문을 수행하지 않음)

'IT > DB' 카테고리의 다른 글

MSSQL inet_ntoa, inet_aton  (0) 2012/02/14
오라클 트리거  (0) 2012/01/04
TOAD 단축키  (0) 2011/04/14
mysql 날짜지정 자동업데이트 컬럼  (0) 2010/12/24
mysql "Incorrect information in file: './database/table.frm'"  (0) 2010/12/23
mysql talbe stauts 정보  (0) 2010/12/17
Posted by 푸른_바람
TAG 오라클
[code bash]
deb http://oss.oracle.com/debian unstable main non-free
wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add -
sudo apt-get update
sudo apt-get install oracle-xe-universal

sudo /etc/init.d/oracle-xe configure
[/code]

'IT > DB' 카테고리의 다른 글

mysql max_connect  (0) 2010/08/21
mysql unauthenticated user 프로세스 문제  (0) 2010/08/20
우분투에서 오라클 XE 설치  (0) 2010/05/25
mysql log  (0) 2010/01/27
ms-sql 일반정보 질의 query  (0) 2008/12/29
DBMS에 따른 날짜포맷 변환  (0) 2008/11/10
Posted by 푸른_바람
2008/09/09 20:48
오라클의 함수에는 단일행 함수복수행 함수(그룹함수)가 있다.

* 숫자 함수(number function)

ABS ACOS ASIN ATAN
ATAN2 BITAND CEIL COS
COSH EXP FLOOR LN
LOG MOD POWER ROUND(number)
SIGN SIN SINH SQRT
TAN TANH TRUNC(number) WIDTH_BUCKET

문자 함수(character function)
CHR CONCAT INITCAP LOWER
LPAD LTRIM NLS_INITCAP NLS_LOWER
NLSSORT NLS_UPPER REPLACE RPAD
RTRIM SOUNDEX SUBSTR TRANSLATE
TREAT TRIM UPPER ASCII
INSTR LENGTH, LENGTHB, LENGTHC, LENGTH2, LENGTH4

날짜와 날짜 처리함수(date, datetime function)
ADD_MONTHS CURRENT_DATE CURRENT_TIMESTAMP DBTIMEZONE
EXTRACT(datetime) FROM_TZ LAST_DAY LOCALTIMESTAMP
MONTHS_BETWEEN NEW_TIME NEXT_DAY NUMTODSINTERVAL
NUMTOYMINTERVAL ROUND(date) SESSIONTIMEZONE SYS_EXTRACT_UTC
SYSDATE SYSTIMESTAMP TO_DSINTERVAL TO_TIMESTAMP
TO_TIMESTAMP_TZ TO_YMINTERVAL TRUNC(date) TZ_OFFSET

데이터 형변환 함수(conversion function)
ASCIISTR BIN_TO_NUM CAST CHARTOROWID
COMPOSE CONVERT DECOMPOSE HEXTORAW
NUMTODSINTERVAL NUMTOYMINTERVAL RAWTOHEX RAWTONHEX
ROWIDTOCHAR ROWIDTONCHAR TO_CHAR(character) TO_CHAR(datetime)
TO_CHAR(number) TO_CLOB TO_DATE TO_DSINTERVAL
TO_LOB TO_MULTI_BYTE TO_NCHAR(character) TO_NCHAR(datetime)
TO_NCHAR(number) TO_NCLOB TO_NUMBER TO_SINGLE_BYTE
TO_YMINTERVAL TRANSLATE ... USING UNISTR
참조로 형변환 관계표를 참조하면 편리하다.

기타함수(miscellaneous single row function)
BFILENAME COALESCE DECODE DEPTH
DUMP EMPTY_BLOBEMPTY_CLOB EXISTSNODE EXTRACT(XML)
EXTRACTVALUE GREATEST LEAST NLS_CHARSET_DECL_LEN
NLS_CHARSET_ID NLS_CHARSET_NAME NULLIF NVL
NVL2 PATH SYS_CONNECT_BY_PATH SYS_CONTEXT
SYS_DBURIGEN SYS_EXTRACT_UTC SYS_GUID SYS_TYPEID
SYS_XMLAGG SYS_XMLGEN UID UPDATEXML
USER USERENV VSIZE XMLAGG
XMLCOLATTVAL XMLCONCAT XMLFOREST XMLSEQUENCE
XMLTRANSFORM XMLELEMENT CASE

* 그룹함수

집계(Aggregate) 함수
AVG CORR COUNT COVAR_POP
COVAR_SAMP CUME_DIST DENSE_RANK FIRST
GROUP_ID GROUPING GROUPING_ID LAST
MAX MIN PERCENTILE_CONT PERCENTILE_DISC
PERCENT_RANK RANK REGR function STDDEV
STDDEV_POP STDDEV_SAMP SUM VAR_POP
VAR_SAMP VARIANCE GROUPING SETS

분석(Analytic) 함수
AVG CORR COUNT COVAR_POP
COVAR_SAMP CUME_DIST DENSE_RANK FIRST
FIRST_VALUE LAG LAST LAST_VALUE
LEAD MAX MIN NTILE
PERCENT_RANK PERCENTILE_CONT PERCENTILE_DISC RANK
RATIO_TO_REPORT REGR_(linear regression) function ROW_NUMBER STDDEV
STDDEV_POP STDDEV_SAMP SUM VAR_POP
VAR_SAMP VARIANCE TOP_N 분석
윈도우(windowing) 분석 함수
윈도우 분석함수 부분 합을 계속 더해 나감, sum은 전체 합계를 구함

객체 참조 함수
DEREF MAKE_REF REF REFTOHEX VALUE

PseudoColumn을 의미하는 것
ROWID Each row in the database has an address
ROWNUM 테이블에서 select 되어진 행의 순서번호
LEVEL 테이블에서 행(row)의 계층관계를 가리키는 일련번호 순서
* 출처: http://radiocom.kunsan.ac.kr 의 오라클 강좌에 링크 되었습니다.

'IT > DB' 카테고리의 다른 글

[MSSQL] Identity 자동 증가함수  (0) 2008/10/16
Oracle Sequence  (0) 2008/09/24
오라클 내장함수  (0) 2008/09/09
오라클 테이블 컬럼 추가, 변경, 삭제 (alter table)  (0) 2008/09/09
오라클 숫자, 문자, 날짜 형식 및 변환  (0) 2008/09/09
php oracle 관련함수  (0) 2008/09/02
Posted by 푸른_바람
* 테이블 생성
[code sql]
create table test (
  idx number not null;
);
[/code]

* 테이블 명 변경
[code sql]
rename after_table to before_table;
[/code]

* 테이블 정보
[code sql]
desc test;
[/code]

* 테이블에 addField 컬럼 추가
[code sql]
alter table test add(addField number(10));
[/code]
(추가될 COLUMN 의 위치는 지정할 수 없다. 새로운 COLUMN 은 마지막 위치에 생성된다.)* 테이블 addField 컬럼명을 modifyField 컬럼명으로 변경
[code sql]
alter table test rename column addField to modifyField;
[/code]
COLUMN 의 크기를 확장할 수 있다.
데이타가 들어있지 않으면 COLUMN 의 크기를 줄일 수 있다.
데이타가 들어있지 않다면 COLUMN 의 타입을 수정할 수 있다.
COLUMN 에 NULL 값이 없다면 NOT NULL CONSTRAINT 를 지정할 수 있다.
DEFAULT VALUE 를 변경할 수 있다.
이미 생성되어 있는 COLUMN 을 변경한다

* Constraint 추가
이미 생성되어 있는 TABLE 에 CONSTRAINT 를 추가한다.
[code sql]
ALTER TABLE table_name
ADD (table_constraint);
ALTER TABLE S_EMP ADD (CONSTRAINT S_EMP_MANAGER_ID_FK FOREIGN KEY(MANAGER_ID)
REFERENCES S_EMP(ID));
[/code]

* Constraint 삭제
이미 생성되어 있는 TABLE 의 CONSTRAINT 를 삭제한다.
[code sql]
ALTER TABLE table_nameDROP PRIMARY KEY |
UNIQUE(column_name) |
CONSTRAINT constraint_name [CASCADE];
ALTER TABLE S_EMP
DROP CONSTRAINT S_EMP_MANAGER_ID_FK;
[/code]

* 테이블 modifyField의 컬럼 데이터 타입 변경
[code sql]
alter table test modify(modifyField varchar(10));
[/code]

* 테이블 modifyField 컬럼 삭제
[code sql]
alter table test drop(modifyField);
[/code]

참고 : http://blog.naver.com/neptuneosy

'IT > DB' 카테고리의 다른 글

Oracle Sequence  (0) 2008/09/24
오라클 내장함수  (0) 2008/09/09
오라클 테이블 컬럼 추가, 변경, 삭제 (alter table)  (0) 2008/09/09
오라클 숫자, 문자, 날짜 형식 및 변환  (0) 2008/09/09
php oracle 관련함수  (0) 2008/09/02
mysql 기본명령어  (0) 2007/04/20
Posted by 푸른_바람
* 변환형식
  • number => to_char() => char
  • date => to_char() => char
  • char => to_number() => number
  • char => to_date() => date
* format 날짜형식
  • YYYY : 년도를 숫자로 표시
  • YEAR : 년도를 영문으로 표시
  • MM : 월을 숫자로 표시
  • MONTH : 월을 영문으로 표시
  • MON : 월을 영문3자리 축약표시
  • DY : 요일을 영문3자리 축약표시, 한글에서는 한글 1자 표시
  • DAY : 요일을 영문으로 표시 한글에서는 한글 3자 표시
  • DD : 일을 숫자로 표시
* format 시간형식
  • AM & PM : 오전또는 오후 표시
  • A.M. & P.M. : 오전또는 오후 표시
  • HH & HH12 & HH24 : 시간 또는 12시간 혹은 24시간으로 표시
  • MI : 분(0~59)
  • SS : 초(0~59)
  • SSSSS : 자정이후 초(0~86399)
* format 기타형식
  • / . , : 구분자 표시
  • "of the" : 결과에 추가할 문자열
  • TH : 서수 표시 (예: DDTH => 4TH)
  • SP : 영문 기수 표시 (예: DDSP => FOUR)
  • SPTH & THSP : 영문 기수 표시 (예: DDSPTH => FOURTH)
* format 숫자형식
  • 9 : 숫자로 표시
  • 0 : 숫자 앞부분에 0으로 표시
  • $ : 달러 표시
  • L : 지역 화폐단위 표시
  • . : 소숫점 표시
  • , : 1000단위 구분자 표시
select to_char(REGDATE, 'yyyymmdd HH24MISS') as thisdime from member;

TO_CHAR(date, date_fmt) - date를 date_fmt 타입으로 변환한 값을 반환
ex) 사원테이블에서 입사일을 0을 제외한 일, 문자형 달, 네자리 년으로 변환한 값까지 검색하라.

select empno, ename, hiredate, to_char(hiredate, 'fmdd month yyyy') from emp;

ex) 사원들의 급여를 \xx,xxx.00 단위로 변환하라.

select empno, ename, sal, to_char(sal, 'l99,999.00')급여 from emp;

* 숫자형 함수
  • ABS(n) - 절대값 출력
  • SIGN(n) - 음수,양수 판별. n이 0보다 크면 1, 아니면 -1
  • ROUND(n,i) - i번째까지 반올림
  • TRUNC(n1,n2) - n1를 n2자리에서 잘라냄
  • CEIL(n) - n과 같거나 큰 가장 작은 정수
  • FLOOR(n) - CEIL과 반대로 작거나 가장 큰 정수 반환
  • MOD(n2,n1) - n2를 n2으로 나눈 나머지 값을 반환. n1가 0이면 n2 그대로 반환
* Null 관련 함수
  • NVL(expr1, expr2) - expr1 값이 null이면 expr2를 반환.
  • NVL2(expr1, expr2, expr3) - expr1 값이 null이면 expr3을, null이 아니면 expr2 값을 반환.
  • NULLIF(expr1, expr2) - expr1과 expr2가 같으면 null을, 같지 않으면 expr1을 반환.
  • COALESCE(expr1, expr2, ...) - expr1, expr2, ... 등의 파라미터 리스트 중에서 첫 번째로 null이 아닌 파라미터를 반환.
  • LNNVL(condition) - condition을 체크하여 조건결과 값이 FALSE나 UNKNOWN일 경우 TRUE를,
  • CASE x WHEN y THEN z - x가 y일 경우 z를 반환. (WHEN y, THEN z 부분은 복수개 사용가능)
    ex) case job when 'analyst' then sal*1.1
    when 'clerk' then sal*1.2
    when 'salesman' then sal*1.3
* 날짜형 함수
  • SYSDATE - 운영체제의 현재시간을 반환
    ex1. 사원테이블에서 사원들의 입사일 후 몇 주가 경과되었는지를 검색하라.
    select empno, ename, (sysdate - hiredate)/7 as week from emp;
    ex.2 사원테이블에서 사원들의 입사일 후 몇 월이 경과되었는지를 검색하라.
    select empno, ename, months_between(sysdate, hiredate) from emp;
  • ADD_MONTHS - 임의의 날짜에 개월 수를 더한 뒤 그 결과를 반환.
    ex) 사원테이블에서 사원번호가 7839번인 사원이 입사 6개월 후의 날짜를 검색하라.
    select empno, ename, hiredate, add_months(hiredate, 6) from emp where empno = 7839;
  • NEXT_DAY(date,char) - date 이후의 날짜 중에서 주중에 char로 명시된 첫 번째 일자를 반환
    ex) 사원테이블에서 사원들의 입사일 후 첫번째 수요일이 며칠인지 검색하라.
    select empno, ename, hiredate, next_day(hiredate, '수') from emp;
  • LAST_DAY(date) - date와 같은 달의 마지막 날짜를 반환.
  • ROUND(date, fmt) - date 날짜를 포맷모델 fmt에 의해 명시된 단위로 반올림한 결과를 반환.
    ex) 입사일을 월단위로 반올림
    select empno, ename, hiredate, round(hiredate, 'month') from emp;
  • Posted by 푸른_바람
    phpOracleAdmin 0.1.3 - 상당부분 한글화 에러수정

    관공서 프로젝트(2006년 11월 완료)를 하면서 오라클에 접근에 대한요구가 많은데 외부에서 오라클 접속은 막혀 있고, 결국 웹으로 접근만 가능한 상태에서 찾아보니phpOracleAdmin이 있었다.
    근데 이 프로그램이 미흡한데가 있어서 수정을 가하다보니 영문으로 되어있는 부분을 한글화까지 손질을 해버렸다.
    아마도 국내 여러사이트에서는 0.1.2버전까지 올라온걸로 알고 있다.

    이곳까지 흘러들어와서 이것을 보는 여러분들 잘 사용하기를...
    뭐 내가 만든건 아니지만

    ** 테터를 업그레이드 하면서 기존 자료를 모두 날려버렸습니다.
    필요하신분은 메일을 보내주시면 제가 보네드리도록 하겠습니다. ^^;;
    그리고 까만하늘님... 답이 늦었는데 아직도(2007.04.13) 필요하시면 메일로 보내드리겠습니다.

    PS. 한글화라고 해도 별다리 크게 개선된건 없습니다. 기본적으로 자잘하게 필요에 의해서 영문으로 되어있는 코멘트나 설명을 한글로 바꾸었을 뿐이었으니깐요... 그리고 텍스트박스크기정도...?

    PS. 이것저것 수정을 했지만 소스개발자에게 따로 허락을 구한건 아닙니다. 그냥 수정한거죠

    20101102
    많인 시간이 지난 포스팅인데 이 포스팅을 보시고 관련 자료를 요구하시는분이 있습니다.
    일단 관련 자료 원본은 http://www.tucows.com/preview/154925 에서 다운로드 가능합니다.

    그리고 한글화한 소스는 몇년동안 사용하지 않아서 어디에 있는지조차 모르는 상태로 결국은 제게는 없다는 것입니다. ㅎㅎㅎ ^^;;

    'IT > DB' 카테고리의 다른 글

    php oracle 관련함수  (0) 2008/09/02
    mysql 기본명령어  (0) 2007/04/20
    phpOracleAdmin 0.1.3 - 상당부분 한글화 에러수정  (0) 2007/01/06
    ORACLE OCI8함수  (0) 2006/11/20
    Oracle Wait Event 모니터링  (0) 2006/11/17
    오라클/PHP 환경의 확장  (0) 2006/11/16
    Posted by 푸른_바람
    2006/10/19 14:36
    DBMS의 SQL 비교

    1. Data type

    비고 : oracle

    Datatype설 명
    VARCHAR2(size)size 만큼 2000개까지 문자열 데이터 저장. 가변형.
    CHAR(size)size 만큼 255개 문자까지 문자열 데이터 저장. 고정형.
    NUMBER실수형 데이터 저장 NUMBER(p,s)
    NUMBER(p,s)숫자데이터를 저장. p는 최대자리수, s는 소수점 이하 자리수
    DATEBC 4712년 1월 1일부터 AD 4712년 12월 31일까지의 날짜를저장
    * 기본 날짜 형식은 'DD-MON-YY' 임
    LONG2GB의 문자까지 문자열 데이터를 저장.
    비고사항* CHAR과 VARCHAR2의 사용
    - 데이터의 update가 잦은 칼럼은 char형은 씀.
    - 한 칼럼에서 고정된 길이의 데이터를 입력할 경우는 char형,
    가변형길이의 데이터를 입력할 경우는 varchar를 사용.
    비고 : MS-SQL
    Datatype설 명
    VARCHAR2(size)가변길이 문자열. 자신의 실제길이로 저장됨.
    CHAR(size)고정 문자열, 최대값은 8000
    NCHAR(n)고정길이 유니코드 문자셋 저장. CHAR는 1바이트를 사용함에비해,
    NCHAR는 2바이트를 사용. 최대 4000.
    NVARCHAR(n)가변길이 유니코드 문자셋.
    TEXT(n)최대 2GB까지의 고정길이 문자열 저장
    NTEXT(n)큰 가변 길이 문자 데이터 저장. TEXT는 1바이트, NTEXT는 2바이트사용.
    INT정수값 표현. 4바이트.
    SMALLINT정수값 표현. 2바이트(-32768~32767
    TINYINT음이 아닌 정수값 표현. 1바이트(0~255)
    DECIMAL(p,[s])고정 소수점 값.
    NUMBER(p,[s])DECIMAL과 동의어.
    REAL부동소수점 값
    FLOAT[(p)]부동소수점 값
    MONEY화폐값을 표현 하는 데 사용. 8바이트
    SMALLMONEYMONEY와 같지만, 4바이트 사용.
    DATETIME4바이트의 정수값으로 저장되는 DATE와 TIME을 저장.
    SMALLDATETIME2바이트의 정수값으로 저장되는 DATE와 TIME을 저장

    비고 : Informix
    Datatype설 명
    VARCHAR(a,b)가변길이 문자열. 자신의 실제길이로 저장됨. Max 255
    CHAR(size)고정 문자열, 최대값은 32767 byte
    TEXT최대 2GB까지의 고정길이 문자열 저장 blobspace공간을 만들어저장하는 것이 IO향상됨
    Byte최대 2Gb까지의 바이너리 데이터 저장blobspace공간을 만들어별도로 저장
    INT정수값 표현. 4바이트.
    SMALLINT정수값 표현. 2바이트(-32768~32767
    SERIAL서버에 의해 자동적으로 1씩 증가 내부적 int와 동일
    DECIMAL(p,[s])고정 소수점 값. ? 숫자형은 모두 decimal로 하는 것이 좋다.엔진에서 decimal로 처리
    REAL부동소수점 값
    FLOAT16자리 부동소수점 값
    SMALLFLOTE8자리 부동 소수점
    MONEY화폐값을 표현 하는 데 사용. Decimal 형태로 저장되며 $와 소수점뒤에 두자리 표시 DBMONY=’\’;export DBMONEY
    DATETIME INTERVAL4바이트의 정수값으로 저장되는 DATE와 TIME을 저장.
    DATE2바이트의 정수값으로 저장되는 DATE만 저장 DBDATE=y4md/;exportDBDATE

    SQL3 type : Informix 9.x, oracle 8.x이상 버젼에서 비정형 데이더를저장, 검색하기 위한 확장형 타입과 ORDBMS의 특징인 object type을지원한다.
    • clob : 문자열 데이터를 저장
    • blob : 바이너리 데이터를 저장
    • list, multiset, set : 한 컬럼에 여러 데이터 저장
    • named row type, unnamed row type : type을 상속받아 테이블을생성할 수 있음
    • user define function 및 user define type을 생성
    • cast 함수를 이용하여 type의 확장지원
    • Informix : lvarchar,int8,Serial8 type 새롭게 지원


    2. 데이터 저장 공간

    비고 : oracle
    - 데이터베이스(oracle instance당 한 개가 존재) >테이블스페이스(system, nonsystem tablespace로 나누어 장치간 적절히스토리지를 분배해야 함, 물리적인 공간) > 세그먼트 ( 테이블세그먼트, 인텍스 세그먼트, 임시세그먼트, 롤백세그먼트 :tablespace에 있는 여러 datafile에 걸처서 생성할 수 있음)>datafile(물리적 공간) > 익스텐트( 연속된 블록의 집합 ) >데이터 블록 (가장 작은단위의 저장공간)
    비고 : MS-SQL
    - 데이터 베이스 ( system database : master,tempdb,msdb,model userdatabase로 나누며 user database는 여러 개 생성할 수 있음 ) > 주데이터 파일( .mdf ), 보조 데이터 파일( .ndf), 로그 데이터 파일 (.ldf ) > 익스텐트 > 블럭
    비고 : Informix
    - dbspace ( system, nonsystem dbspace로 구별하여 생성해야 함 ) >chunk (물리적인 데이터 공간) > database ( 한 dbspace에 여러 개의데이터베이스 생성 가능 ) >chunk(물리적은 공간 cook device, rawdevice로 구성할 수 있음) > tablespace ( extent들의 연속된 공간 )> extent > page

    3. 테이블 정보 보기 및 sql query tool

    비고 : oracle-sqlplus를 이용해서 server에 connection

    • SELECT * FROM tab;
    • DESC table_name
    비고 : MS-SQL
    - Enterprise Manager를 이용해서 비주얼 볼 수 있음
    비고 : Informix-dbaccess를 이용해서 볼 수 있음.
    • Dbaccess -> 메뉴에서 table -> database선택 ->table선택.
    • Dbshcema 툴을 이용
    dbschema -ㅇ >>filename 하여 filename을 vi로 열어본다.
    옵션을 보려면 dbschema - -


    4. SQL 문 이용 가이드

    4.1 NULL

    비고 : oracle,Informix 동일
    * 이용할 수도 없고, 값이 할당되어 있지도 않고, 알려져 있지않은
    또는 적용불가능한 값을 의미.
    * 0이나 공백(space)와 같은 것이 아님.
    * NULL 값을 포함한 산술 표현식 결과는 NULL임.
    NVL 함수 이용.
    * NULL 값은 NVL함수를 이용하여 다른 값으로 대치할 수 있음.
    * 사용가능한 datatype은 날짜, 문자 및 숫자형.
    * 구문 : NVL(expr1, expr2)
    expr1 : 널값을 포함할 수 있는 값이거나 표현식
    expr2 : 널값을 전환하여 사용할 값
    예 : NVL(hiredate, '01-JAN-95')
    NVL(job, 'FRESH MAN')
    NVL(comm, 1000)
    권장 사항 : nvl함수를 자주 쓰는 것은 성능에 걸림돌이 될 수 있음.따라서 컬럼에 공백이 들어가지 않도록 하는 것이 성능향상에좋다.table을 생성할 때 default값을 주어 nvl 함수대신 default값을가지고 구분할 수 있도록 한다.

    4.2 합성문자.

    비고 : oracle,Informix 동일
    * 칼럼과 문자 또는 칼럼과 다른 칼럼을 연결
    * 두 개의 수직바(||)에 의해 이루어짐.
    * 문자 표현식의 결과에 의해 새로운 칼럼이 생성됨.
    SELECT ename||ename
    FROM emp;
    * Literal 이란 SELECT 리스트에 포함된 문자, 표현식 또는숫자임.
    * 날짜 및 문자값은 단일 인용부호로 둘러쌈.
    SELECT job||' is job of '||ename FROM emp;

    4.3 조건절 사용

    비고 : oracle
    * 비교 연산자 : =, >, >=, <, <=
    * SQL 연산자
    - between .....and... : 두 값사이의 값
    - in(list) : 리스트 중 하나와 같은 값을 가지는 값
    - like : 문자 패턴과 일치하는 값
    - is null : 널값인 것
    * 논리 연산자 : and, or, not ( 우선순위 and -> or )
    * 부정 연산자
    - 비교 연산자 : !=(VAX,UNIX, PC), ^=(IBM), <>(all OS)
    - SQL 연산자 : not between....and...., not in(list), not like, isnot null
    비고 : Informix
    • 부정 비교 연산자는 <>를 쓴다.
    • Like는 %만을 이용하여 검색 가능하며, matches는 *만을이용한다.

    4.4 함수

    비고 : oracle
    구문
    * function_name(column|expr, [arg1, arg2,....])
    - function_name : 함수의 이름
    - column : 데이터베이스에 존재하는 칼럼명
    - expr : 어떤 문자열 또는 계산된 표현식
    - arg1, arg1,... : 함수에 의해 사용될 인수
    * 함수는 데이터 값을 조작함.
    * 인수를 받아들여 한 개의 값을 return
    * 각각의 행에 적용됨.
    * 행당 하나의 결과를 돌려줌
    * datatype을 바꾸어 줌.
    * 중첩하여 사용하는 것이 가능함.
    문자함수
    * LOWER(column/expr) : 알파벳 문자를 소문자로 바꾸어 줌.
    * UPPER(column/expr) : 알파벳 문자를 대준자로 바꾸어 줌.
    * SUBSTR(column/expr,m[, n]) : 문자값 중에서 m위치에서 n 문자길이에해당하는 문자를 돌려줌. Informix 에서는 substr을 써야만 index를탄다.
    * LENGTH(column/expr) : 문자개수를 값으로 돌려줌.
    * NVL(expr1, expt2) : 첫번째 값이 널이면 두번째 값으로 바꾸어줌.
    예)SELECT ename, job, deptno FROM emp WHERE lower(job) ='clerk';
    * LTRIM(‘ lee’); 공백을 왼쪽으로 밀어준다.
    *RTRIM(‘Lee ‘);
    숫자함수
    * ROUND(column/expr, n) : column/expr의 값을 소수점 n자리까지반올림. n이 없으면 소수점은 없어지고, 음수라면 소수점의왼쪽자리만큼 반올림됨.
    * TRUNC(column/expr, n) : column/expr의 값을 소수점 n자리까지 버림n이 없으면 소수점은 없어지고, 음수라면 소수점의 왼쪽자리만큼버림.
    * MOD(m, n) : m값을 n으로 나누고 남은 나머지를 return

    날짜함수
    * date + number : 날수를 날짜에 더함. 결과는 date.
    * date - number : 날짜에서 날수를 뺌. 결과는 date.
    * date - date : 날짜에서 날짜를 뺌. 결과는 날수.
    * date + date/24 : 시간을 날짜에 더함. 결과는 date
    * MONTHS_BETWEEN(date1, date2) : 두 날짜 사이의 달수를찾아줌.
    * ADD_MONTHS(date, n) : 날짜에 n달을 추가
    * NEXT_DAY(date, 'char') : date 다음의 첫번째 해당요일('char')일자.
    * LAST_DAY(date) : date를 포함하고 있는 달의 마지막날
    예)select ename,(sysdate-hiredate)/7 weeks from emp where deptno =20
    oder by week;
    전환함수
    * 숫자 또는 날짜값을 fmt 모델을 사용하여 varchar2 문자열로바꿈.
    * TO_CHAR(date, 'fmt')
    - fmt 형식모델은 단일 인용부호로 에워싸야 하고, 대소문자 구별이있음.
    - 형식 모델은 어떠한 날짜 형식 요소도 포함할 수 있고,
    날짜값은 콤마에 의해 구분됨.
    - 결과에 일, 월의 이름은 자동적으로 공백으로 덧붙여 짐.
    - 공백 및 선행제로를 없애기 위해서는 'fm'을 사용
    * TO_CHAR(number, 'fmt') - 대소문자 구별
    - 9 : 숫자위치(9의 수는 폭을 결정)
    - 0 : 0을 나타냄
    - $ : 달러기호 예) to_char(sal,’fm$9,999,999’)
    - . : 위치에 소수점(999.999 -- > 123.2)
    - , : 위치에 콤마 (999,999,999 -- > 1,234)
    예) select ename, to_char(hiredate, ‘fmDD “of” Month YYYY’)start_date from emp
    where hiredate like ‘%87’;
    soctt 19 of April 1987 ß 결과값
    * TO_NUMBER 함수
    to_number(char) 예) to_number(to_char(empno))
    * TO_DATE 함수
    to_date(char[, ‘fmt’]) 예)to_date(‘1981/05/10’,’yyyy/mm/dd’);
    그룹함수
    * 그룹당 하나의 결과를 return
    * 그룹함수들은 SELECT 절 및 HAVING 절에 쓸 수 있음.
    * SELECT 문장에서 GROUP BY 절은 행들을 작은 그룹으로 나눔.
    * HAVING 절은 그룹을 제한함.
    그룹함수의 종류
    * AVG() : 널값을 제외한 행의 평균값
    * COUNT() : 행의 개수. expr은 널값이 아닌 것을, '*'를 玲淪玖?중복및 널값을 갖는 것도 포함.
    * MAX() : 최대값 : 어떤 데이터 type도 쓴다.
    * MIN() : 최소값: “
    * STDDEV() : 널값을 제외한 표준편차
    * SUM() : 널값을 제외한 합계
    * VARIANCE() : 널값을 제외한 분산
    비고 : Informix
    함수명설명Ver.
    날자함수DATEDATE(char1)비날자형 값을 날자로 변환ALL
    DAYDAY(d1)날자형값중 일을 구함ALL
    MONTHMONTH(d1)날자형값중 월을 구함ALL
    WEEKDAYWEEKDAY(d1)날자형값중 요일을 구함ALL
    YEARYEAR(d1)날자형값중 년을 구함ALL
    EXTENDEXTEND(d1날자형값을 지정한 길이로 조정함ALL
    MDY비날자형 값을 날자로 변환ALL
    산술함수ABSABS(n)n의 절대값 구함ALL
    MODMOD(m,n)m을 n으로 나눈 나머지 구함ALL
    POWPOW(m)값의 n제곱 구함ALL
    ROOTROOT(m)제곱근 구함ALL
    ROUNDROUND(m,n)m의 값을 n자리수 위치 기준으로 반올림ALL
    SQRTALL
    TRUNCTRUNC(m,n)m의 값을 n자리수 위치 기준으로 반올림ALL
    로그함수EXPALL
    LOGNALL
    LOG10ALL
    삼각함수SINSIN 함수ALL
    COSCOS 함수ALL
    TANTAN 함수ALL
    ASINALL
    ACOSALL
    ATANALL
    ATAN2ALL
    String 함수LENGTHLENGTH(char1)Charter 길이 구하기ALL
    TRIMTRIM(char1)공백 자르기ALL
    집계함수COUNTCOUNT(*)건수 구하기ALL
    AVGAVG(m)평균 구하기ALL
    MINMIN(n)최소값 구하기ALL
    MAXMAX(m)최대값 구하기ALL
    SUMSUM(n)합 구하기ALL
    RANGERANGE(m)최대값과 최소값 차 구하기ALL
    STDEVSTDEV(n)표준편차 구하기ALL
    VARIANCEVARIANCE(m)분산 구하기ALL
    기타함수DBINFODBINFO(KEYWORD)ALL
    TODAY오늘날자ALL
    CURRENT현재 날자+ 시분초ALL
    USER사용자 이름ALL
    SITENAMEHOST명 구하기ALL
    DBSERVER
    NAME
    INFORMIXSERVER 명 구하기ALL
    NVLNVL(m,n)m값을 검사 NULL 이면 n값을 Return7.3Y
    DECODEDECODE(c1,a1,A1,b1,
    B1,c1,C1,D1)
    Multi-Case 문7.3Y
    CASESELECT 문에서 CASE 비교7.3Y
    INITCAPINITCAP(char1)첫글자 대문자7.3Y
    UPPERUPPER(char1)대문자로ALL
    LOWERLOWER(char1)소문자로ALL
    REPLACEREPLACE(char1,search_string[,replacement_string])search_string 의 각 문자를 대응하는 replacement_string 으로치환 . replacement_string이 미지정이면
    serach_string 을 제거
    7.3Y
    SUBSTRSUNSTR(char,m[n]char의 m번째 문자부터 n개의 문자를 취한다 .7.3Y
    LPADLPAD(char1,n,[char2])Char1의 왼쪽에 Char2를 덧붇여 전체가 n문자로 되도록한다 .Char2가 미지정이면 blank 적용7.3Y
    RPADRPAD(char1,n,[char2])Char1의 오른쪽에 Char2를 덧붇여 전체가 n문자로 되도록한다 .Char2가 미지정이면 blank 적용7.3Y
    SPL로 제공되는 함수CEILn 보다 크거나 같은 최소 정수
    NEXT_DAY

    4.5 Having절의 사용

    Having 절에 조건을 줌으로서 그룹을 제한할 수 있다.
    예) job이 vp로 시작하지 않는 사람들을 job별로 급여의 합계를구한다음 급여합계가 5000이상인 job과 그 합계를 구하라.
    Select job,sum(sal) payroll from emp
    Where job not like ‘VP%’ Group by job having sum(sal) >5000;

    4.6 JOIN

    Join을 쓰는 목적은 Cartesian product를 막고 정규화 된 테이블 간데이터를 가져올 때.
    비고 : 오라클
    1. equi join
    join시 table alias를 주어서 쓰는 것이속도 향상에 좋음.
    1. non-equijoin
    2. self join
    같은 테이블에 대해 두개의 가명을줌.
    1. outer join : 정상적으로 조인 조건을 만족하지 못하는 행들을 보기위해
    outer join의 연산자는 (+)를 붙임..모자라는 곳에 붙임..in 명령어 사용 못함.
    SQL은 inner,outer join이라고명령을 써준다.

    4.7 SubQuery

    * subquery는 다른 SQL 문장안에 존재하는 SELECT 구문을 말함.
    * 주 질의가 실행되기 전에 일단 한번 먼저 실행되어 그 결과는 주질의의 조건으로 사용됨.
    * subquery에는 ORDER BY 절을 사용할 수 없음.
    SELECT select_list
    FROM tables
    WHERE expr operator (SELECT select_list FROM table);
    오라클은 where 조건절 및 from절에도 subquery ( inline View )를실행할 수 있지만 informix는 inline view가 지원되지 않는다.

    4.8 HINT 사용

    비고 : Informix
    * SQL을 어떠한 방법으로 실행할 것인가를 결정을 optimizer에게 지시
    • index, join 방법을 지정할 수 있다.
    • INDEX, AVOID_INDEX, FULL, AVOID_FULL
    • ORDERED : join의 대상 테이블에 대한 join순서를 테이블 순서대로하도록 한다.
    • USE_NL,AVOID_NL,USE_HASH, AVIOD_HASH : NL은 nested loop join을말함.
    • FIRST_ROWS, ALL_ROWS (default)
    • FIRST N 질의 결과 중 n개의 row를 가져옴.
    예) 1. select --+ index(esalary_index) name,salary from emp e
    where e.dno=1 and e.salary >50000;
    2. select {+ avoid_full(e), index(esalary_indx) } name, salary
    where e.dno = 1 and e.salary >50000;
    3. select --+ ORDEREDname,title,dept
    from dept,job,emp where title = 'aaa'and emp.dno = dept.dno;
    1. select --+ first_rows name,age from employee e,department
    where e.dept_no = d.dept_no;

    4.9 ROWID

    * 각 행의 주소를 반환하며, 반환되는 데이터는 ROWID 데이터타입을가짐.
    * ROWID는 행에 접근하는 가장 빠른 방법임.
    * 어떻게 테이블의 데이터 행들이 저장되었는 지 보여주고, 한 테이블의각 행에 유일성을 줌.
    Select rowid,ename from emp;

    4.10 ROWNUM

    비고 : 오라클
    * 검색될 테이블의 칼럼 데이터 행의순서를 반환하는 pseudocolumn이며, 첫번째 행은 1로 시작.
    * ROWNUM을 이용하여 반환되는 행의 수를 제한할 수 있음
    예) 사원중 급여를 적게 받는 사람 순서대로 다섯명을 나타내라.
    select ename,sal from ( select ename, sal from emp group bysal,ename)
    where rownum <= 5;
    subquery에서는 order by를 쓸 수없으므로 같은 역할을 하는 group by를 이용
    비고 : Informix
    자체적인 함수가 제공되지 않는다.하지만 Informix ius 9.x버전부터 지원되는 UDF (user definefunction)을 만들어 활용할 수 있음.
    비고 : SQL
    top n [percent]구문
    * 순위별로 체크하여 반환되는 행의수를 제한할 수 있음.
    * 행의 개수를 쓰거나 percent 구문을 이용
    with ties : 마지막 등수가 여러명일 때
    예) select top 4 with ties employeeID, LastName, HireDate
    fromEmployees order by hiredatedesc

    4.11 테이블 생성

    ansi 표준으로 만드는 것이 좋음.
    비고 : Oracle: subquery를 이용한 테이블 생성방법
    * As subquery를 이용하여 테이블 생성
    * subquery에서의 컬럼수와 생성하는 컬럼이 일치해야 함.
    * 컬럼명과 default 값, 무결성 제약조건만이 subquery를 이용해생성됨
    * NOT NULL 만이 복사됨
    예) create table emp_20 AS select empno,emame,hiredate,job
    from emp where deptno = 20; -- 데이터 까지 복제..
    비고 :Informix :
    테이블을 DataBase가 저장된 space외에 다른 space에 생성할 수 있을뿐만 아니라 컬럼까지도 다른 space에 저장할 수 있다.
    예) create table aaa ( a int, b char(10) in space2);
    성능 향상 법 : 모든 DBMS에서 테이블을 생성시 테이블 저장량을예측하여, extend size 및 저장할 곳을 적절히 분산하여 생성해야 한다.또한 index 저장 할 곳도 각 DBMS성격에 맞게 구축해야 한다.
    테이블이 대용량일 경우는 분할 하여 저장하는 것이 좋다.
    -분할 방법 :
    • 가급적 remainder를 쓰지 않는다.
    • 여러 디스크에 분산하여 설계한다.
    • Expressino의 조건은 가급적 숫자형 type( date포함 )하는 것이좋다.
    • 테이블 전체에 거처 조회가 된다면 round robin방법을 쓰는 것이좋다.
    • 인텍스는 fragment하지 않고 별도의 dbspace 한곳에 저장한다.
    • 100만 건 이상의 테이블을 고려 대상으로 한다.
    1. round robin방법 : 컬럼이 insert시 dbs1,dbs2,dbs3에 순차적으로저장
    예)create table rtable ( col_1 int,cal_2 char(20) )
    fragment by round robin indbs1,dbs2,dbs3
    extent size 10000 next size3000;
    1. expression 방법 : 조건을 주어 조건에 맞는 space에 저장
    예) create table rtable ( col_1 int,cal_2 char(20) )
    fragment by expression
    col_1 <=100 and col_1 >=1 indbs1
    col_1 <=200 and col_1 > 100 indbs2
    remainder in dbs3 ;
    1. hash 방법 : DBMS의 function을 이용해 space에 저장
    예) create table rtable ( col_1 int,cal_2 char(20) )
    fragment by expression
    mod(col_1,3) = 0 in dbs1
    mod(col_1,3) = 1 in dbs2
    mod(col_1,3) = 2 in dbs3 ;

    4.12 인덱스 생성 조건

    * 컬럼이 WHERE 절이나 join 조건에 자주 사용되어야 함
    * 컬럼이 넓은 범위의 값을 가지고 있어야 함
    * 컬럼이 null value를 많이 가지고 있어야 함
    * 두 개나 그 이상의 컬럼이 같이 WHERE절이나 join조건에 자주사용되어야 함
    * 테이블이 매우 크고, 대부분의 질의결과가 행들중 10~15%만을가져오는 것이 좋음
    * 많은 인덱스는 항상 질의속도를 높이지는 않음
    * 테이블이 만약 다음과 같은 조건이라면 인덱스를 생성하는 것이 좋지않음
    - 테이블이 너무 작음
    - 컬럼이 질의에서 조건절에 자주 사용되지 않음
    - 대부분의 질의결과가 10~15% 이상의 행들을 결과로 가져옴
    - 테이블의 변경이 자주 일어나는 경우

    4.13 시스템 권한

    비고 : Oracle
    권한부여
    * 80개 이상의 권한이 있음
    * DBA(Database Administrator)는 상위 레벨의 시스템 권한을가짐
    - 새로운 사용자 생성 : CREATE USER(다른 사람에게 유저를 생성할 수있는 권한을
    줄 수도 있음)
    - 사용자 삭제 : DROP USER
    - 테이블 삭제 : DROP ANY TABLE(어떤 사람의 테이블도 삭제할 수있음)
    - 테이블 백업 : BACKUP ANY TABLE(export utility를 이용하여 어떤사람의 테이블도
    백업할 수 있음)
    * DBA는 CREATE USER 명령을 통해 사용자를 생성함
    예) CREATE USER user_name IDENTIFIED BY password;
    ALTER USER user_name IDENTIFIED BY password;
    * 사용자를 생성하면 DBA는 GRANT 명령을 실행하여 사용자에게 권한을부여할 수 있음
    * 사용자는 다음의 시스템 권한을 가짐
    - CREATE SESSION : 시스템에 접속할 수 있도록 함.
    - CREATE TABLE : 테이블을 생성할 수 있도록 함
    - CREATE SEQUENCE : 시퀀스를 생성할 수 있도록 함
    - CREATE VIEW : 뷰를 생성할 수 있도록 함
    - CREATE PROCEDURE : 프로시져를 생성할 수 있도록 함
    * 구문
    GRANT privilege [,privilege,....] TO user_name [, user....];
    Role
    * Role이란 사용자에게 줄 수 있는 연관있는 권한들을 모아둔 그룹을말함
    * role을 사용함으로써 사용자에게 권한을 주고 다시 회수하는 것을쉽게 다룰 수 있음
    예) CREATE ROLE role_name; a grantcreate table,create view to man; a grant man to kim
    권한 회수
    * revoke 명령어를 사용
    비고 : Informix
    * 별도의 DB유저를 생성하지 않고system 유저를 이용. 따라서 system에 유저를 생성하고 로긴 스크립트(.cshrc , .profile, NT의 글로벌 변수)에 인포믹스 유저의 스크립트를copy하는 것으로 작업 종결.
    * DBA는 informix로 login 했을때 부여 되며, 각 유저의 권한을 설정할수 있음.
    DBA,RESOURCE,CONNECT 의 권한을 부여할수 있으며, DB level, table level의 DML 작업 권한을 부여 할 수있음.
    * 뒤에 자세히 설명
    비고 : SQL
    * user 관리는 두가지 방법을 제공함
    Database에 생성 방법과 system유저를 이용하는 방법
    처음 설치 시 user생성 방법을 물어보며, default admin은 sapasswd는없음.

    4.14 load, unload

    - UNLOAD
    UNLOAD TO 파일명 SELECT 문
    예)unload to ‘new_cust’ select *from customer where customer_num > 120;
    - LOAD
    LOAD FROM 파일명 INSERT문
    예)load from ‘new_cust’ insert intocustomer;
    121|a|b|c|d|
    122|aa|bb|cc|dd|


    5. 인포믹스의 무결성 기능

    5.1. 자료의 무결성 (ISOLATION)


    - ISOLATION의 개요
    INFORMIX-ONLINE은 shared lock를사용하여 자료를 읽을 때4가지 수준의 격리수준을 제공한다.sharedlock는 다른 프로세스에서 자료를 읽을 수 있으나자료를 갱신할 수는없다.
    - ISOLATION의 종류
    1) DIRTY READS
    2) COMMITED READ
    3) CURSOR STABILITY
    4) REPEATABLE READ
    DB별 default level 이 있음.
    NO logging mode DB : DirtyRead,
    Logging DB : Committed Read
    ANSI DB : Repeatable Read
    1) DIRTY READS
    프로세스들은 자료를 읽기 전에 lock의존재 여부를 확인하지 않으면 검색시, 사용자는 DIRTY DATA라 불리우는아직 변경이 완료되지 않은 행을 볼 수도 있다. 다음과 같은 경우유용하다
    - 테이블이 정적일 경우
    - 자료의 정확성보다는 자유로운 자료접근이 중요한 경우
    - lock가 해제되기를 기다릴 수 없는경우
    2) COMMITTED READS
    실제로 행들을 lock하는 것이 아니라lock할 수 있는지 만을 조사한다.
    적어도 프로세스가 읽고 있는시점에서는 그 행에 대한 트랜잭션이 완료되었음을 알 수있다.
    3) CURSOR STABILITY
    커서를 이용하여 읽어 들이는 각 행을shared lock한다. 다음 행을 검색하기 전까지 shared lock는 해제되지않는다.
    이 격리 수준에서는 트랜잭션이 완료된행만을 보게 되며현재행을 검색하고 있는 동안에는 다른 프로세스가 그행을 수정할 수 없다.
    * 격리 수준을CURSORSTABILITY로설정하고, 커서를 사용하지 않는다면 CURSOR STABILITY 는 COMMITEDREAD와 같이 작동된다.
    4) REPEATABLE READS
    이 격리 수준은 DB서버에 의해 검색되는모든 행을 shared lock한다. 이 모든 행들은 트랜잭션이 완료되기전까지 해제되지 않는다.
    다른 프로세스들은 트랜잭션이 COMMIT되기 전까지 행을 갱신할 수없다.
    집계함수를 쓰는 경우에 이 level을사용하게 되며, index가 없는 경우에는 사용하지 않는 것이 좋다.
    - 격리 수준의 설정
    프로세스 격리 수준을 설정하기 위해데이터베이스는 반드시 로깅을 지정해야 하며 격리 수준을 설정하기위하여 SET ISOLATION구문을 사용한다.
    SETISAOLATION TODIRTY READ;
    SETISAOLATION TOCOMMITED READ;
    SETISAOLATION TOCURSORSTABILITY;
    SETISAOLATION TOREPEATABLEREAD;

    5.2 Locking

    다수의 사용자가 사용하는 시스템에서두개 이상의 프로그램이 동시에 수행될 수 있으며, 이러한 병행 처리시에 locking을 사용하여 다른 사용자들간의 충돌을 방지 할 수있다.
    - 데이터베이스 수준의 Locking
    DATABASE 데이타베이스명 EXCLUSIVE;
    예) database stores_demoexclusive;
    여러 테이블에 갱신이 일어날 때데이터베이스 수준의 lock를 사용한다.
    데이터베이스의 구조를 변경할 때데이터베이스 수준의 lock를 사용한다.
    데이터베이스를 백업받을 때데이터베이스 수준의 lock를 사용한다.
    배타적(exclusive)lock를 해제하려면데이터베이스를 close하고 다시 open한다.
    - 테이블 수준의 Locking
    LOCK TABLE 테이블명 IN { SHARE |EXCLUSIVE } MODE ;
    UNLOCK TABLE 테이블명;
    SET LOCK MODE TO [ NOT ] WAIT [대기시간 ] ;
    예) lock table customer in exclusivemode;
    unlock table customer;
    set lock mode to wait 20;
    Share mode : 다른 사용자들로부터lock된 테이블에 자료를 select만 허용.
    Exclusive mode : 다른 사용자들로부터lock된 테이블에 접근을 방지한다.
    테이블 내의 대부분의 행에 영향을 주는일괄 처리 작업을 한다면 다른 사용자들과의 충돌을 막기 위해 테이블수준의 lock를 사용한다. 테이블의 구조를 변경하거나 색인을 생성할 때테이블 수준의 lock를 사용한다.
    - 페이지,행 수준의 Locking
    테이블을 생성할 때테이블의 행들을접근 시 사용하는 lock 모드를 설정한다. Page level lock는 페이지상의 하나의 행이 lock되는 경우에도 페이지 전체를 lock한다.
    Row level lock는 요청된 행만lock한다.
    테이블 생성시 기본값은 page levellock이다.
    * 페이지 수준의 lock는 row level 의lock보다 병행성을 감소시키지만, 보다 적은 자원(시스템에서 허용하는lock 수)을 사용한다.
    * 운영 시 lock이 자주 걸린다면table을 row level 로 변경하고 sql에서는 set lock mode to wait을주어 ap가 데이터에 접근할 때 lock 걸려 있으면 waiting하고 있다가lock 풀리면 접근 할 수 있도록 프로그램 하는 것이 좋다. 또한 lock이가급적 빨리 풀릴 수 있도록 sql튜닝을 하는 것이 좋다.
    실습(3) - 보완성,무결성

    1. items 테이블을 unload한다.
    items 테이블의 모든 행을 삭제한다.
    items 테이블을 load한다.
    각각의 경우 items 테이블을 검색해 보고 생성된 자료 파일도 확인해본다.

    2. 두 명의 사용자가 나누어 실습한다.
    데이터베이스를 생성한 사용자(DBA)가 다음 각각의 SQL문을 실행할때
    다른 사용자는 데이터베이스를 connect해 본다.
    SQL 1 > revoke dba from public
    revoke resource from public
    revoke connect from public

    3. DBA가 데이터베이스에 connect권한을 부여한 후
    다른 사용자는 다음 SQL문을 실행시켜 본다.
    SQL 2 > create index idx_cname on customer(담당자명);
    lock table orders in exclusive mode;
    unlock table orders;

    4. DBA가 데이터베이스에 resource 권한을 부여한 후
    다른 사용자는 다음 SQL문을 실행시켜 본다.
    SQL 3 > create index idx_cname on customer(담당자명);
    lock table orders in exclusive mode;
    unlock table orders;

    5. 다음 SQL을 실행한 상태에서 다른 사용자가 데이터베이스를 선택해본다.
    SQL 4> database user## exclusive;

    6. 데이터베이스를 새로 connect하고 다음과 같은 SQL을 실행해본다.

    user 1user 2
    drop database user## ;
    create database user## with log;
    grant connect to public;
    begin work;
    create table test (a date);
    insert into test values (today);
    lock table test in exclusive mode;





    rollback work;
    select * from test;






    database user##;
    select * from test;
    set lock mode to wait 10;
    select * from test;
    set isolation to dirty read;
    select * from test;


    6.Informix DBMS SQL 성능 향상 기법

    서론

    1. Set Explain 의 출력을 해석하는 방법
    2. Informix Optimizer의 역할
    3. 성능향상을 위한 방법

    • Root Dbspace 에는 최소한의 시스템 정보만 포함할 것
    • UNIX File system 공간을 큰 정렬 파일로 채우면 UNIX 프로세스에서오류가능성
    • 논리LOG를 LONG TRANSACTION으로 채우지 말것 : LOG TRX주의

    6.1. OPTIMIZER

    • 주어진 질의를 실행하기 전 가장 좋은 최선의 경로를 찾는 INFORMIX엔진의 한 부분
    • SET EXPLAIN ON : OPTIMIZER가 데이타에 접근하는데 선택한 경로를나타냄
    • SYSTEM CATALOG의 정보를 바탕으로 결정
    1. 질의에 사용되는 테이블의 행수 :systables.nrows
    1. 데이타에 사용되는 페이지수와 색인에 사용되는 페이지수 :systables.npused
    2. Column값의 uniqueness : sysconstraints
    3. 색인존재여부 :sysindexes
    4. 데이타가 색인과 같은 순서 즉, cluster index인지 여부:sysindexes.clust
    5. root node에서 leafnode 까지 색인의 레벨수
    6. 각 column에서 두번째로 큰 값과 두번째로 작은 값. optimizer는 이정보로 값의 범위를 대략적으로 알아낼 수 있슴 : syscolumns.colmin,colmax
    위의 정보를 바탕으로 옵티마이저는가능한 모든 경로를 검색하고 각각 비용(디스크 접근, 필요한 CPU자원,네트워크 접근 등)을 추정하여 평가함.
    • 테이블 조인 순서 결정
    • Sequential scan의 수행 여부
    • 임시 테이블의 작성 여부
    • 색인 사용 여부 결정
    where절에 필터 조건이 많아지고테이블이 많이 포함되면 결정과정이 더욱 복잡해지고 정확한 통계의중요성도 커짐
    • 통계의 정확도
    . 시스템 카달로그 정보는 UPDATESTATISTICS가 실행될 때에만 갱신됨
    . 동적인 테이블에 대해서는 자주실행시킬 것
    . UPDATE STATISTICS는 데이타베이스전체나 개별 테이블, 테이블의 칼럼,
    내장 프로시저에 대하여 실행 할 수있음.
    • 엔진이 최적화를 수행하는 시기
    .표준 SQL로 사용될 때마다 질의가최적화됨.
    .SQL문이 반복 사용될 경우 PREPARE를사용하여 한번만 최적화 시킴
    .STORED PROCEDURE의 경우 PROCEDURE 가만들어지거나
    내장 PROCEDURE에 대하여 UPDATESTATISTICS가 실행될 때 SQL이
    최적화 됨
    • 질의가 갑자기 느려질 때
    프로그램이 SET EXPLAIN ON을 사용하여문제 파악

    6.2. 개발 시 고려사항

    • 개발하는 동안 잘 실행되는질의가 실제적용에 들어가면옵티마이저가 완전히 다른 경로를 선택할 수 있슴--> 실제환경의데이타베이스와 비슷한 크기의 시험데이타베이스에서 같은 데이타로질의를 실행
    • 단순 명료한 시스템 설계에 충분한 시간을 갖는다.
    • Optimizer는 항상 최적의 query plan을 세우는 것은 아니다. 따라서optimizer가 좋은 역할을 하도록 factor - hint 기능 사용 ( index,full scan method)를 부여한다.
    • ESQL/C 코딩시 onconfig 파라메터의 FET_BUF_SIZE를 32767로 늘려놓아 커서 fetch 사이즈를 늘려 놓는다.
    • 코딩 시 prepare 구문을 사용하여 SQL을 이용한다.
    • prepare 시점에 SQL문장에 대하여 미리 parsing되고 query plan이생성된다.
    • Execute 시점에는 처리해야 할 값만 넘겨주면 즉시 실행된다.
    예) Exec sql prepare ins_p from “insert into customer
    ( customer_num,fname,lname,company)values(0,?,?,?)”;
    Exec SQL execute ins_p using:fname,:lname,:company

    6.3. 옵티마이저 제어

    • SET OPTIMIZATION HIGH : 엔진이 모든 엑세스 경로를 검사
    • SET OPTIMIZATION LOW : 초기 단계에서 가능성이 적은 옵션을제거하여 최적화 시간을 줄임.그러나 최적의 경로가 될 수 있는엑세스경로가 초반에 제거되어 버릴 수 있슴
    • Onconfig 환경 파일의 OPTCOMPIND 파라메터 고려
    OPTCOMPIND=2 (Default) : INDEX SCAN과 FULL SCAN 비용을 비교하여가장 효율적인 경로를 선택하도록 함
    OPTCOMPIND=0 : INDEX사용
    OPTCOMPIND=1 : OPTIMIZER가 2로 설정되었을 때처럼 작동.
    단REPEATABLE READ가 선택되면 OPTCOMPIND가 0으로 설정되었을 때
    처럼 작동
    행을 모두 SCAN하면서 읽는 동안 전체테이블을 효과적으로 공유할 수 있슴

    6.4. 옵티마이저를 위한 데이타분산

    칼럼에서 데이타표본을 채취하여테이블 영역에 관한 정보를 다양한BIN에 저장하는 것으로 이루어짐 : 대형 테이블을 다룰 경우 유용한정보가 됨. 또한 UPDATE STATISTICS명령으로 각 칼럼 분포 정보를 생성할 수 있슴
    • UPDATE STATISTICS HIGH FOR :테이블의 모든 행 평가. 느린 대신정확함
    • UPDATE STATISTICS MEDIUM FOR :데이타 표본만 추출하여 실행
    • UPDATE STATISTICS LOW FOR : 데이타 분포 정보를 얻지 않음

    6.5. UPDATE STATISTICS 실행 계획

    1. UPDATE STATISTICS문을 모든 테이블에 실행
    2. 복합 색인의 첫번째 칼럼이나 질의의 한 부분으로 사용된 모든칼럼에는 UPDATE STATISTICS HIGH문을 실행하거나 테이블이 클 경우에는update statistics medium resolution 0.0598;을 실행한다.
    3. 복합 색인의 첫번째 칼럼이 아닌 모든 칼럼에 대해서 UPDATESTATISTICS LOW를 실행
    4. UPDATE STATISTICS단계를 완료하면 DBSCHEMA UTILITY의 다음OPTION을 사용하여 데이타분포정보를 확인 할 수 있슴
    예) dbschema -d databasename-hdtablename
    1. 위의 내용은 fragmentation 전략에 유용하게 사용할 수 있슴
    2. 대형 정적 테이블에 대해서는 UPDATE STATISTICS를 재실행할 필요가없슴

    6.6. SQL 질의 품질보증과 최적화

    1. 큰 테이블에서는 순차적 검색을 하지 않는 것이 좋음
    2. 임시 정렬FILE이 크게 생성되도록 하는 질의는 사용하지 말 것
    3. Correlated Subquery를 사용
    4. 서로 다른 칼럼에서 사용된 OR문은 옵티마이저의 색인 사용을방해하므로 색인이 있고 질의 계획에서 옵티마이저가 순차스캔을선택하면 UNION문의 사용을 고려할 것
    5. 질의 초기에 가능하면 많은 행을 제거할 것
    UPDATE STATISTICS HIGH 를 사용하면 옵티마이저에 데이타분포에 대한정보
    가 추가로 제공되므로 알맞은 테이블이 먼저 제거됨. INDEX SCAN이항상최선
    의 방법은 아님
    1. 자료형을 변환하고 문자 칼럼을 비교하는 것. 가능하면 칼럼의자료형을 숫자형으로 바꿀 것. 조인 칼럼이 문자형이면 매 행마다 한바이트씩 비교함.
    2. OR, LIKE, MATCH, 함수(MONTH, DAY, LENGTH등), 부정표현(!=’NOUN’), 첫 문자를 제외한 하위 열 검색(POSTCODE[4,5] >10)등은 INDEX를 사용하지 못함
    3. LOGGING된 데이타베이스에서 LONG TRANSACTION을 실행하지 말것,LONG TRANSACTION은 논리로그를 채워 데이타베이스를 손상시킬 위험이있슴
    LOCK을 지나치게 많이 사용하는 것을막으려면 테이블을 EXCLUSIVE MODE로 LOCK할 것. LOCK을 지나치게사용하면 성능이 저하되고 또한 LOCK의 최대수에 도달하면 명령문이실행되지 않음
    1. 필요한 칼럼만 선택할 것. FRONT END와 BACK END간의 통신이 줄고I/O도 줄어듬. 가능한 한 “SELECT *” 은 사용하지 말 것.
    2. 데이타의 일정부분 집합이 WHERE 술어로 다시 선택되면 임시테이블을 사용할 것. 검색하고자 하는 테이블이 매우 클 경우 모든테이블을 임시 테이블로 선택하고 임시 테이블에서 재검색을 할것.
    3. 옵티마이저가 가장 좋은 경로를 선택하도록 임시 테이블을 사용함.큰 테이블에서 임시 테이블로 행을 선택하고 임시 테이블을 나머지테이블에 조인하면 됨
    4. 임시 테이블에 색인 사용
    5. 임시 테이블에 UPDATE STATISTICS사용
    6. 임시 테이블을 만들 경우 WITH NO LOG를 사용. 논리 로그에 쓰는오버헤드가 없어지므로 성능이 향상됨. 임시 테이블에 LONGTRANSACTION을 만들 가능성이 없어짐


      출처 : http://blog.naver.com/semigifn?Redirect=Log&logNo=10009668352
    Posted by 푸른_바람
    2006/10/16 16:49
    원본 출처 : http://www.cyberlab.pe.kr/dev_tip_board/read.neo?id=2&cn=2&tn=4&ln=2&pn=20&lv=0&topic=oracle

    SQL

    SQL문

    SELECT

    DML(데이터 조작어)

    INSERT, UPDATE, DELETE

    DDL(데이터 정의어) IMPLICIT COMMIT

    CREATE, ALTER, DROP, RENAME, TRUNCATE

    TCL(트랜잭션 제어)

    COMMIT, ROLLBACK, SAVEPOINT

    DCL(데이터 제어어)IMPLICIT COMMIT

    GRANT, REVOKE



    [1] Writing Basic SQL Statements

    1. SELECT 기본 문장( 선택, 프로잭션, 조인)

    SELECT [DISTINCT] { *, column [alias], ... }

    FROM table ;



    2. SELECT 예제

    SELECT * FROM dept ;

    SELECT deptno, loc FROM dept ;

    SELECT ename, sal, 12 * (sal + 100) FROM emp ;

    * Null 값과 연산을 하면 Null이 나온다.



    3. Column Alias 예제

    SELECT ename AS nme, sal salary

    FROM emp ;

    SELECT ename "Name", sal*12 "Annual Salary"

    FROM emp ;

    * 대소문자를 구분하고 공백있는 컬럼 Alias를 만들고 싶을땐 " "로 막는다.

    * AS는 안 써도 된다.

    * WHERE, GROUP BY절에는 안된다. ORDER BY 절에는 사용 가능.

    4. Concatenation 연산자 (|| : pipeline 2개)

    SELECT ename||job "Employees" FROM emp ;

    --> ename 데이터와 job 데이터가 붙어서 출력된다.



    5. 문자열을 데이터로 출력할때

    SELECT ename||' '||'is a'||' '||job "Employee Details"

    FROM emp ;

    * 문자열은 ' '로 막고, 컬럼 Alias는 " "로 막는다.



    6. DISTINCT keyword : 중복된 Row를 하나로 만들어 준다. 자동 SORTING[ASC]

    SELECT DISTINCT deptno

    FROM emp ;

    * DISTINCT 대신 UNIQUE를 써도 된다.



    7. SQL*Plus Log On 방법

    * UserName, PassWord, HostString에 일일이 입력해도 되지만,

    UserName에 username/password@HostString이라고 입력하면 된다.

    * UNIX상에서 command로 들어 갈 때는 sqlplus username/password 만 입력하면된다.

    8. 테이블 구조보는 SQL Command (DESC)

    SQL> DESC dept : Column Name, Null?, Data Type display



    9. SQL*Plus Editing Commands( 다음 행까지 계속하려면 -(하이픈)으로 연결한다.)

    ① A[PPEND] text : 현재 line의 마지막 문장 뒤에 text를 붙인다.

    ② C[HANGE]/old/new : 현재 line의 old text를 new text로 바꾼다.

    ③ C[HANGE]/text/ : 현재 line을 text를 삭제한다.

    ④ CL[EAR] BUFF[ER] : buffer의 내용을 모두 지운다.

    ⑤ DEL : 현재 line을 지운다.

    ⑥ DEL n : n번째 line을 지운다.

    ⑦ DEL m n : m ~ n번째 line을 지운다.

    ⑧ I[NPUT] : 현재 line 다음에 line이 제한없이 추가된다.

    ⑨ I[NPUT] text : 현재 line 다음에 line이 추가되면서 text가 들어간다.

    ⑩ L[IST] : buffer전체를 보여준다.

    ⑪ L[IST] n : n번째 line을 보여준다.

    ⑫ R[UN] or / : SQL, PL/SQL문장을 실행하라!

    ⑬ n : n번째 line을 display하면서 Editing 상태로 해준다.

    ⑭ n text : n번째 line이 text로 바뀐다.

    ⑮ 0 text : 1번째 line이 추가되면서 text가 1번째 line으로 들어간다.

    * Bald로 표시된 명령어는 line번호를 먼저 수행한 후 실행해야 한다.

    10. SQL*Plus File Commands

    ① SAV[E] filename [REP[LACE]|APP[END]] : buffer의 내용을 filename.sql로 저장한다.

    ② GET filename : filename.sql을 buffer로 불러온다.

    ③ START filename : filename.sql을 실행하라.

    ④ @filename : START filename과 같다.

    ⑤ ED[IT] : buffer의 내용을 edit program으로 실행한다.

    ⑥ ED[IT] filename : filename.sql을 edit program으로 실행한다.

    ⑦ SPO[OL] filename : retrieve data를 filename.lst로 저장한다.

    ⑧ SPOOL OFF : SPOOL을 끝내라.

    ⑨ SPOOL OUT : retrieve data를 system printer로 출력하라.

    ⑩ EXIT : SQL*Plus를 종료한다.

    * SPOOL 사용법

    SQL> spool filename

    SQL> select ...

    SQL> spool off



    11. Special Tip

    * 잠시 host상태로 나가고 싶을 때.

    SQL> ! ( $)

    -- host 상에서 다시 SQL로 들어가려면 exit(lo)

    -- unix 상에서 env를 치면 오라클 환경을 볼 수 있다.



    * SQL> define -editor

    --> Editor가 vi인지..다른 edit프로그램인지를 보여준다.



    * line size 바꾸기

    SQL> SET PAGESIZE 20 -- 한 page를 20line으로 보여준다.

    -- log off하면 사라진다.



    * NLS값 보기

    SQL> select * from V$NLS_PARAMETERS



    * NLS값 바꾸기

    SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'

    -- SESSION : 현 session동안만 YYYY-MM-DD 포맷으로 사용한다는 뜻.

    sqlplus가 종료되면 원상태로 복구된다.



    [2]Restricting and Sorting Data

    1. 비교연산자

    = : Equal to

    > : Grater than

    >= : Greater than or equal to

    < : Less than

    <= : Less than or equal to

    <> : Not equal to

    예) SELECT ename, sal, comm

    FROM emp

    WHERE sal <= comm ;



    2. 비교연산자 2

    BETWEEN A AND B , IN(list), LIKE, IS NULL



    3. BETWEEN 연산자( NOT BETWEEN )

    SELECT ename, sal

    FROM emp

    WHERE sal BETWEEN 1000 AND 1500 ; --> sal >= 1000 and sal <= 1500



    4. IN 연산자( NOT IN )

    SELECT emp, ename, sal, mgr

    FROM emp

    WHERE mgr IN (7902, 7566, 7788) ; --> mgr = 7902 or mgr = 7566 or mgr = 7788



    5. LIKE 연산자( NOT LIKE )

    예1) SELECT ename

    FROM emp

    WHERE ename LIKE 'S%' ; --> ename이 S로 시작하는 모든 데이터를 찾는다.

    예2) SELECT ename

    FROM emp

    WHERE ename LIKE '_A%' ; --> 두 번째 글자가 A인 모든 데이터를 찾는다.

    예3) SELECT ename

    FROM emp

    WHERE ename LIKE '%A/_%B' ESCAPE '/' ;

    --> '/'는 Escape문자로 정의되었기 때문에 '_'도 문자로 인식한다.

    즉, ename이 A_로 포함하는 모든 데이터를 찾는다.

    * ESCAPE는 모든 문자가 가능하다.



    6. IS NULL 연산자

    SELECT ename, mgr

    FROM emp

    WHERE mgr IS NULL ; --> mgr이 null인 데이터를 찾는다.



    7. Logical 연산자

    AND : 두 개의 조건이 모두 만족해야 OK

    OR : 한 개의 조건만 만족하면 OK

    NOT



    8. AND 연산자

    SELECT empno, ename, job, sal

    FROM emp

    WHERE sal >= 1100

    AND job = 'CLERK' ;



    9. OR 연산자

    SELECT empno, ename, job, sal

    FROM emp

    WHERE (sal >= 1100 OR job = 'CLERK') ;



    10. NOT 연산자

    SELECT ename, job

    FROM emp

    WHERE job NOT IN ('CLERK', 'MANAGER') ;

    --> NOT (job = 'CLERK OR job = 'MANAGER')



    11. 연산자 우선순위( 산술 > 문자 > 비교 > 논리 )

    1 : 모든 비교 연산자

    2 : NOT

    3 : AND --> False > Null > True

    4 : OR --> True > Null > False

    예) A AND B에서...

    - A가 False이고 B가 Null이면... False 이다.

    - A가 True이고 B가 Null이면.... Null이다.



    12. SORT (ORDER BY)

    * ASC는 default값이다.(작은 값부터..)

    * 값이 Null일 때 가장 큰 값이 된다. (ASC일 때...맨 뒤에 붙는다.)

    * column alias도 sorting이 된다.

    예1) SELECT ename, job, deptno, hiredate "Date"

    FROM emp

    ORDER BY hiredate["Date" or 4 ] ;



    예2) SELECT ename, job, deptno, hiredate

    FROM emp

    ORDER BY hiredate DESC ;



    예3) SELECT empno, ename, sal*12 annsal

    FROM emp

    ORDER BY empno, annsal ; * select 절에 없는 열을 기준으로 정렬 가능.

    예4) SELECT ename, deptno, sal

    FROM emp

    ORDER BY deptno, sal DESC



    [3] Single-Row Functions

    1. Character Functions

    ①LOWER( column|expression )

    LOWER('String') --> string : 소문자로 변환

    ②UPPER( column|expression )

    UPPER('String') --> STRING : 대문자로 변환

    ③INITCAP( column|expression )

    INITCAP('string') --> String : 첫글자만 대문자이고 나머지글자는 소문자로 변환

    ④CONCAT( column1|expression1 ,column2|expression2 )

    CONCAT('Good','String') --> GoodString : ||와 같은 역할을 한다.

    ⑤SUBSTR(column|expression, m [,n]) : m값이 음수면 문자값의 끝부터..)

    SUBSTR('String',1,3) --> Str : 1번째부터 3개의 문자를 리턴한다.

    ⑥LENGTH( column|expression )

    LENGTH('String') --> 6 : 문자열의 길이를 리턴한다.

    ⑦INSTR( column|expression, )

    INSTR('String','r') --> 3 : 문자열에 'r'이 몇번째 위치하고 있나를 리턴한다.

    ⑧LPAD( column|expression,n,'string' ) : n 은 전체 길이

    LPAD('String',10,'*') --> ****String

    : 10자리수중에 모자란 자리수를 '*'로 왼쪽에 채운다.(문자,숫자 가능!!!)

    ⑨ RPAD('String',10,'*') --> String****

    : 10자리수중에 모자란 자리수를 '*'로 오른쪽에 채운다.(문자,숫자 가능!!!)

    ⑩ LTRIM(' String') --> 'String' : 문자열의 왼쪽 공백을 버린다.

    ⑪ RTRIM('String ') --> 'String' : 문자령의 오른쪽 공백을 버린다.

    * TRIM(leading/tailing/both, trim_character FROM trim_source )

    TRIM( 'S' FROM 'SSMITH') --> MITH

    2. Number Functions

    ① ROUND(45.926, 2) --> 45.93 : 소수점 두자리수까지 보여주면서 반올림한다.

    ② TRUNC(45.926, 2) --> 45.92 : 소수점 두자리까지만 보여주고 나머지는 버린다.

    ③ MOD(1600,300) --> 100 : 1600을 300으로 나누고 나머지를 리턴한다.

    * ROUND예제(WHOLE NUMBER:정수)

    SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) FROM DUAL

    ==> 45.92 46 50

    * TRUNC예제

    SELECT TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-1) FROM DUAL

    ==> 45.92 45(n이 생략된면 일의 자리까지 남기고 버린다.) 40

    * SYSTEM 날짜를 갖고 오는 방법.

    SELECT sysdate FROM dual



    3. Date 계산( 날짜를 숫자로 저장)

    date + number : date에 number만큼 후의 날자를 보여준다.

    date - number : date에 number만큼 전의 날자를 보여준다.

    date1 - date2 : date1에서 date2 까지의 총 일수를 보여준다.( date1+date2는 X )

    date1 + 숫자/24 : date1에서 시간을 더해 날짜를 보여준다.

    4. Date Functions

    MONTHS_BETWEEN('01-SEP-95','11-JAN-94') --> 19.6774194

    ; 두날짜 사이의 달수를 보여준다.

    ADD_MONTHS('11-JAN-94', 6) --> 11-JUL-94

    ; 날짜에 6개월을 더한 날자를 보여준다.

    NEXT_DAY('01-SEP-95','FRIDAY') --> '08-SEP-95'

    ; 해당일 다음에 오는 FRIDAY의 일자를 보여준다.

    ('SUNDAY'는 1, 'MONDAY'는 2...이런식으로 숫자를 써줘도 된다.)

    LAST_DAY('01-SEP-95') --> '30-SEP-95'

    ; 해당월의 마지막날자를 보여준다.

    ROUND('25-JUL-95','MONTH')--> 01-AUG-95 ROUND('25-JUL-95','YEAR')--> 01-JAN-96

    TRUNC('25-JUL-95','MONTH') --> 01-JUL-95 TRUNC('25-JUL-95','YEAR') --> 01-JAN-95



    5. Conversion Functions

    nlsparams : 십진수, 그룹구분자, 지역 통화 기호, 국제 통화 기호

    TO_CHAR(date,['format'],[nlsparams]) : date를 format에 맞게 문자열로 변환한다.

    - Date Format Elements

    YYYY --> 1999 (년출력) , YEAR --> nineteen ninety-nine (년출력)

    MM --> 12 (월출력) , MONTH --> DECEMBER (월출력), MON --> DEC

    D --> 요일을 숫자로 리턴한다.(일요일은 1, 월요일은 2...)

    DD --> 07 (달의 일출력)

    DDD --> 200 (연의 일출력)그 해의 총 몇 일째인가를 리턴한다.

    DAY --> MONDAY (요일출력) DY-->MON

    CC --> 20 (몇 세기인지를 보여준다.)

    WW --> 그 해의 몇 번째 주인가를 리턴한다.

    W --> 그 달의 몇 번째 주인가를 리턴한다.



    * Element들을 소문자로 쓰면 소문자로 나오고 대문자로 쓰면 대문자로 출력된다.

    HH or HH12 or HH24 / MI(0-59분) / SS(0-59초)



    * 문자열은 " " 묶어 추가한다 DD " of " MONTH --> 12 of DECEMBER

    *숫자 접미어는 숫자를 문자로 표기. TH(4->4TH)/ SP(4->FOUR)/ SPTH or THSP(4->FOURTH)

    ddspth : 14-> fothteenth

    * / . , : 구두점은 결과에 그대로 출력한다. * 공백, 선행제로를 제거하는 fm요소가 있다.

    TO_CHAR(number,'format',[nlsparams]) : number를 format에 맞게 문자열로 변환한다.

    - Number Format Elements

    9 : 999,999 --> 1,234 $: 부동 달러 기호 $99999 -> $1234

    0 : 099999 --> 001234 99.999EEEE -> 1.234E+03 B: 0값을 공백으로

    L : L99,999 --> FF1,234 (NLS_CURRENCY에 설정되어있는 값이 L로 보여진다.)



    TO_NUMBER(char,['format'],[nlsparams]) : 숫자형태의 문자열을 숫자로 변한한다.

    TO_DATE(char,['format'],[nlsparams]):날자형태의 문자열을 format에 맞게 날자형식으로 변환 한다.



    6. NVL Funcion : 값이 null일 때 설정값을 보여준다.

    NVL(number_column, 0) : null일 때 0을 보여준다.

    NVL(date_column, '01-JAN-95') : null일 때 '01-JAN-95'를 보여준다.

    NVL(character_column, 'Empty') : null일 때 'Empty'를 보여준다.

    * column Type과 표현식의 type이 반드시 일치해야 한다.

    7. DECODE Function : CASE or IF-THEN-ELSE 형식과 비슷하다.

    *DECODE(col/expression, search1, result1 [,search2,result2,…] [,default])

    F1 (F2 (F3 (col,arg1),arg2),arg3)



    [4] Displaying Data from Multiple Tables (JOIN)

    1. EquiJoin : column1과 column2는 Primary Key와 Foreign Key관계인 경우

    SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc

    FROM emp, dept

    WHERE emp.deptno = dept.deptno



    2. Non-EquiJoin : Join하는 Table 사이에 서로 대응하는 Key가 없는 경우

    where절의 Join조건에 '='을 제외한 비교연산자를 사용한다.

    SELECT e.ename, e.sal, s.grade

    FROM emp e, salgrade s

    WHERE e.sal BETWEEN s.losal AND s.hisal



    3. Outer Join : 서로 = 되지 않는 row 까지도 모두 보여준다.

    정보가 없는쪽 컬럼 뒤에 (+)를 붙인다.( =, and 만 사용가능)

    SELECT e.ename, d.deptno, d.dname

    FROM emp e, dept d

    WHERE e.deptno (+) = d.deptno

    ORDER BY e.deptno



    4. Self Join : 같은 Table을 그것이 마치 2개의 Table인 것처럼 Join해서 사용한다.

    SELECT worker.ename, manager.ename

    FROM emp worker, emp manager

    WHERE worker.mgr = manager.empno



    5. SET OPERATORS

    UNION : 중복된 row는 제외하고 보여준다. UNION ALL : 중복된 row까지 모두 보여준다. INTERSECT : A,B의 중복된 row만 보여준다.MINUS : A,B의 중복된 row를 제외한 A row를 보여준다.



    [5] Aggregating Data Using Group Functions(그룹함수를 사용한 데이터집계)

    1. Group Function : 행집합에 적용하여 그룹당 하나의 결과를 생성한다.

    AVG([DISTINCT|ALL] n) : 평균값

    COUNT({*|[DISTINCT|ALL] expr}) : row수

    MAX([DISTINCT|ALL] expr) : 최대값

    MIN([DISTINCT|ALL] expr) : 최소값

    SUM([DISTINCT|ALL] n) : 합

    STDDEV([DISTINCT|ALL] x) : 표준편차

    VARIANCE([DISTINCT|ALL] x) : 분산

    * count(*)를 제외한 모든 Group Function은 Null을 배제하고 수행한다.

    Null을 포함하고 싶다면 NVL함수를 사용한다.

    * DISTINCT나 ALL을 쓰지 않으면 Default가 ALL이다.

    * AVG,SUM, STDDEV, VARIANCE는 반드시 숫자형이다.



    2. 어떤 컬럼에 해당하는 데이터별 그룹함수를 사용할 때

    SELECT [deptno,] COUNT(ename)

    FROM emp --> 이문장은 성립되지 않는다. GROUP BY가 없다.

    <추가>

    GROUP BY deptno

    *일반칼럼과 그룹함수를 같이 쓰면 group by절에 일반칼럼 명시(열 별칭 사용못함)

    *GROUP BY 열을 SELECT 절에 포함시키지 않아도 된다



    3. 그룹함수는 WHERE절에 올수가 없다.

    SELECT deptno, AVG(sal)

    FROM emp

    WHERE AVG(sal) > 2000

    GROUP BY deptno

    --> 이문장은 성립되지 않는다. WHERE절에 그룹함수가 올 수 없다.



    SELECT deptno, AVG(sal)

    FROM emp

    GROUP BY deptno

    HAVING AVG(sal) > 2000



    4. HAVING : 그룹함수를 조건절에 적용시키기 위해서 사용한다.

    SELECT job, SUM(sal)

    FROM emp

    WHERE job NOT LIKE 'SALES%'

    GROUP BY job

    HAVING SUM(sal) > 5000

    ORDER BY SUM(sal)

    *절 평가 순서 : ① WHERE -> ② GROUP BY절 -> ③ HAVING절

    *그룹함수는 두번까지 중첩될수 있습니다. MAX( AVG(SAL))



    [6] Subqueries( WHERE 절, HAVING 절, FROM 절 )

    1. Subquery 규칙

    - 반드시 ()로 묶어야 한다.

    - 반드시 비교연산자 오른쪽에 위치해야 한다.

    - ORDER BY 절에는 사용할 수 없다.

    - 서브쿼리 결과가 한개일때는 Single-Row 비교연산자를 사용해야 한다.

    ( =, >, >=, <, <=, <> )

    - 서브쿼리 결과가 여러개일때는 Multi-Row 연산자를 사용해햐 한다.



    2. Subquery 사용예1

    * 반드시 비교연산자 오른쪽에 써야한다.

    SELECT ename FROM emp

    WHERE sal > (SELECT sal FROM emp

    WHERE empno = 7566)



    3. Subquery 사용예2

    SELECT ename, job

    FROM emp

    WHERE job = (SELECT job

    FROM emp

    WHERE empno = 7369)

    AND

    sal > (SELECT sal

    FROM emp

    WHERE empno = 7876)



    4. Subquery 사용예3

    SELECT job, AVG(sal)

    FROM emp

    GROUP BY job

    HAVING AVG(sal) > (SELECT MIN(AVG(sal))

    FROM emp

    GROUP BY job)



    5. Subquery 사용예4 (Subquery 결과가 여러개가 나올때 비교연산자 사용법)

    SELECT empno, ename

    FROM emp

    WHERE sal IN (SELECT MIN(sal) ( =ANY 와 같음 )

    FROM emp

    GROUP BY deptno)



    6. ANY(동의어:SOME)연산자를 사용한 Subquery : 조건중에 한개만 만족하면 OK

    SELECT empno, ename, job

    FROM emp

    WHERE sal < ANY (SELECT sal --> OR

    FROM emp

    WHERE job = 'CLERK')

    AND job <> 'CLERK'



    7. ALL연산자를 사용한 Subquery : 모든 조건을 만족해야 OK

    SELECT empno, ename, job

    FROM emp

    WHERE sal > ALL (SELECT avg(sal) --> AND

    FROM emp

    GROUP BY deptno



    [7] Multiple-Column Subqueries

    1. Multiple-Column Subquery (Pairwise Subquery)

    : 서브쿼리의 결과가 두개 이상의 컬럼형식으로 나올 때 비교하는 컬럼도 서브쿼리 컬럼

    갯수와 형식이 같아야한다.

    SELECT ename, deptno, sal, comm

    FROM emp

    WHERE (sal, NVL(comm,-1)) IN

    (SELECT sal, NVL(comm,-1)

    FROM emp

    WHERE deptno = 30)



    2. NonPairwise Subquery

    SELECT ename, deptno, sal, comm

    FROM emp

    WHERE sal IN (SELECT sal FROM emp

    WHERE deptno = 30)

    AND

    NVL(comm,-1) IN (SELECT NVL(comm,-1) FROM emp

    WHERE deptno = 30)



    3. Subquery 안에 Null값이 있을 때...

    * 매니저가 아닌 사원을 보여주기?

    SELECT e.ename

    FROM emp e

    WHERE e.empno NOT IN

    (SELECT m.mgr FROM emp m)

    IN은 Null value가 나와도 한개의 조건만 만족하면 OK이지만,

    NOT IN은 !=ALL과 같아서 모든조건이 TRUE여만 TRUE인 것이다.

    * NOT IN 을 !=ANY 로 바꿔주는게 정답에 가깝다.



    4. FROM절에 사용되는 Subquery

    SELECT a.ename, a.sal, a.deptno, b.salavg

    FROM emp a,

    (SELECT deptno, avg(sal) salavg

    FROM emp

    GROUP BY deptno) b

    WHERE a.deptno = b.deptno

    AND a.sal > b.salavg



    5. EXISTS : EXISTS 뒤에 나오는 서브쿼리의 결과가 한건이 row라도 있다면 O.K

    SELECT dname, deptno

    FROM dept

    WHERE EXISTS (SELECT * FROM emp

    WHERE dept.deptno = emp.deptno)

    : 행의 존재유무만 확인



    [8] Producing Readable Output with SQL*Plus

    1. Substitution Variable (치환변수)

    & : 변수가 한 번 사용되고 메모리에서 사라진다.

    && : 한 번 입력한 변수는 CLEAR하기 전까지 계속 메모리에 남아있다.

    DEFINE variable=value : CHAR 데이터 유형의 사용자 변수를 생성하여 값을 변수에 할당한다.

    DEFINE : 현재 DEFINE 된 모든 것들을 보여준다.

    DEFINE 변수명 : 지정한 변수명의 DEFINE 사항을 보여준다.

    UNDEFINE 변수명 : 지정한 변수명의 DEFINE 상태를 CLEAR한다.

    ACCEPT : 변수를 입력하라고 물어보는 Prompt의 Text를 변경할수 있다. USER가

    입력하는 값을 HIDE시킬수가 있다. DataType의 Format을 변경할수가 있다.

    * SET VERIFY 는 SQL*PLUS 가 치환변수를 값으로 바꾸기 전후의 명령 텍스트 표시를 토글한다.

    2. & 치환변수 사용예

    SELECT empno, ename, sal, deptno

    FROM emp

    WHERE empno = &employee_num



    3. && 치환변수 사용 예 --> 한번만 물어보게 된다.

    SELECT empno, ename, job, &&column_name

    FROM emp

    ORDER BY &column_name

    4. 변수 값이 character or date value일때 꼭 single quotation mark로 묶어 줘야 한다.

    SELECT ename, deptno, sal*12

    FROM emp

    WHERE job = '&job_title'



    5. 종합적인 예제(실행중에 열이름, 표현식, 텍스트를 지정)

    --> 어떤 절에나 사용해도 된다.

    SELECT empno, ename, job, &column_name

    FROM emp

    WHERE &condition

    ORDER BY &order_column



    6. ACCEPT 사용예 (file로 만들어서 START시켜야 한다.)

    *ACCEPT variable [datatype] [FORMAT format] [PROMPT text] [HIDE]

    ACCEPT dept PROMPT 'Provide the department name: '

    SELECT *

    FROM dept

    WHERE dname = UPPER('&dept')

    /

    Provide the department name: Sales

    처리된 결과값...



    7. 파일로 만들어서 치환변수를 여러개 처리할때 예제

    test.sql

    SELECT &1 FROM &2

    SQL> @test empno emp

    ==> &1에 empno, &2에 emp가 들어간다.(define)



    SELECT &2 FROM &4

    SQL> @test e empno b emp

    ==> &1에 e, &2에 empno,&3에 b, &4에 emp가 들어간다.(define)



    8. SET command 변수

    ① ARRAY[SIZE] {20 | n} : 데이터 fatch size

    ② COLSEP {_ | text} : column seperator

    ③ FEED[BACK] {6 | n | OFF | ON} : n 개이상의 레코드 반환시 레코드 수를 표시

    ④ HEA[DING] {OFF | ON} : column heading 출력

    ⑤ LIN[ESIZE] {80 | n} : 가로 80 으로 출력

    ⑥ PAGES[IZE] {50 | n} : 세로 50 으로 출력

    ⑦ LONG {80 | n} : long date type의 데이터를 출력할때 80byte까지만 보여주겠다.

    ⑧ PAU[SE] {OFF | ON | text} : text에 문자열을 넣으면 pause될 때마다 메시지를 보여준다.

    ⑨ TERM[OUT] {OFF | ON} : 결과를 화면에 보여주겠는가?

    ⑩ VERIFY {OFF | ON} : 치환변수의 old값과 new값을 보여주면서 결과가 처리된다.

    * SHOW {SET command 명} : SET command명의 현재 상태를 보여준다. SQL> SHOW ECHO)

    * SHOW ALL : 모든 SET command의 현재 상태를 보여준다.

    * SET 상태를 바꿔 주려면... SQL> SET PAUSE ON <-- 이런식으로 하면 된다.

    * DEFINE command나 SET command는 자신의 환경파일(login.sql)에 일괄적으로 처리 할수 있다.

    * login.sql은 oracle superuser용 환경파일이다.

    * SQL Plus command가 다음 줄로 이어질 때는 (-)으로 연결한다.

    9. REPORT 출력 예

    ① SET PAGESIZE 37 --> 세로 37로 출력

    ② SET LINESIZE 60 --> 가로 60으로 출력

    ③ SET FEEDBACK OFF

    ④ TTITLE 'Employee|Report' --> Top Title을 Employee 다음 줄에 Report를 쓰겠다.

    ⑤ BTITLE 'Confidential' --> Bottom Title을 Confidential로 쓰겠다.

    ⑥ COLUMN job HEADING 'Job|Category' FORMAT A15 : | 은 text를 두줄로 찍는다.

    --> job column Heading을 Job 다음줄에 Category로쓰고 15byte의 자리수로

    만들겠다.

    형식 : COL[UMN] [{column | alias } [option]]

    COL[UMN] [column], COL[UMN] column CLE[AR], CLE[AR] COL[UMN]



    옵션 : CLE[AR], FOR[MAT] format, HEA[DING] text, JUS[TIFY] {align}, NUL[L] text,

    NOPRI[NT]:열을 숨김니다 <> PRI[NT],

    TRU[NCATED] : 첫 행 끝에 표시되는 문자열을 잘라버린다.

    WRA[PPED] : 문자열의 끝을 다음 행으로 줄바꿈합니다.

    ⑦ REM ** Insert SELECT statement --> 주석문

    *BREAKE 명령?



    [9] Multipulating Data (DML)

    *트랜젝션 : 논리 작업 단위를 형성하는 DML 문 모음으로 구성된다., DDL문(한개),DCL문(한개)

    1. INSERT 예제1

    : 모든 컬럼에 INSERT할 때는 컬럼명을 쓰지 않아도 되지만 테이블 CREATE시

    만들어진 순서대로 입력해야한다.

    INSERT INTO dept

    VALUES (50,'AAA','BBB')

    * NULL 값을 갖는 행 삽입시 열목록에서 열을 생략(암시적)하는 방법과

    NULL 키워드를 지정(명시적)하는 방법이 있다.

    2. INSERT 예제2

    INSERT INTO emp ( empno, ename, job, mgr, hiredate, sal, comm, deptno )

    VALUES ( 7196, 'GREEN', 'SALESMAN', 7782, SYSDATE, 2000, NULL, 10 )



    3. sql 파일로 만들어서 Argument를 받으면서 INSERT 실행하기.

    * test.sql 파일

    ACCEPT department_id PROMPT 'Please enter the department number: '

    ACCEPT department_name PROMPT 'Please enter the department name: '

    ACCEPT location PROMPT 'Please enter the location: '

    INSERT INTO dept ( deptno, dname, loc )

    VALUES (&department_id, '&department_name', '&location' )



    SQL> @test = START test

    Please enter the department number: 90

    Please enter the department name: PAYROLL

    Please enter the location: HOUSTON



    1 row created

    4. 다른 테이블의 row를 Copy하기(VALUES 절을 사용하지 않는다.)

    INSERT INTO managers (id, name, salary, hiredate)

    SELECT empno, ename, sal, hiredate

    FROM emp

    WHERE job = 'MANAGER'



    5. UPDATE 예제1

    UPDATE emp

    SET deptno = 20,

    sal = 2500,

    comm = null

    WHERE empno = 7782



    6. UPDATE 예제2 (Multiple-Column Subquery를 사용한 예)

    UPDATE emp

    SET (job, deptno) = (SELECT job, deptno

    FROM emp

    WHERE empno = 7499)

    WHERE empno = 7689



    7. UPDATE 예제3 (다른 테이블에 있는 데이터를 SELECT해서 UPDATE하기)

    UPDATE employee

    SET deptno = (SELECT deptno FROM emp WHERE empno = 7788)

    WHERE job = (SELECT job FROM emp WHERE empno = 7788)



    8. DELETE 예제1 (조건에 맞는 데이터 지우기)

    DELETE FROM dapartment

    WHERE dname = 'DEVELOPMENT'



    9. DELETE 예제2 (한 테이블의 전체 데이터 삭제)

    DELETE FROM department



    10. DELETE 규칙

    * FROM은 옵션이므로 사용하지 않아도 된다.(예: DELETE department)

    * Primary Key, Forien Key 관계가 설정되어 있는 데이터를 DELETE할때는 문제가 발생 할 수 있다.



    11. COMMIT

    * 변경된 데이터를 Fix시킨다.

    * 이전상태의 데이터는 모두 잃게 된다.

    * 모든 User가 결과를 볼수 있다.

    * LOCK이 풀린다.

    * 모든 SavePoint들이 clear된다.

    * 자동 커밋 : DDL, DCL, 정상 종료시

    12. ROLLBACK

    * 변경된 데이터를 undo 시킨다.

    * Transaction 전단계의 데이터로 돌아간다.

    * Lock이 풀린다.

    * 자동 롤백 : 비정상 종료, 시스템 장애

    13. SAVEPOINT 예제

    * SAVEPOINT : Transaction이 일어난 곳에 Marking을 할 수가 있다.

    * 오라클은 자동적으로 눈에 안보이는 savepoint를 찍어 놓는다.

    SQL> UPDATE.....

    SQL> SAVEPOINT update_done ;

    Savepoint created.

    SQL> INSERT.....

    SQL> ROLLBACK TO update_done ;

    Rollback complete.



    14. TABLE LOCK 예제 (DBA가 임으로 TABLE에 LOCK을 걸 수가 있다.)


    <
    [10] Creating and Managing Tables (DDL)

    1. Database Objects

    TABLE, VIEW, SEQUENCE, INDEX, SYNONYM



    2. Object Naming Rule

    - 반드시 첫글자는 문자이어야 한다.

    - 길이는 1 ~ 30 글자 이다.

    - A-Z, a-z, 0-9, _, $, # 만을 사용할수 있다.

    - 동일한 Object명이 존재해서는 안된다.(다른 user가 소유한 table과는 중복가능)

    - 오라클 서버의 예약어는 사용할 수 없다.



    3. CREATING TABLES( create 권한, 저장영역이 필요 )

    CREATE [GLOBAL TEMPORARY] TABLE [schema.]table

    ( column datatype [DEFAULT expr] [,...] );

    *GLOBAL TEMPORARY : 임시 table로 지정, 정의는 모든 세션에서 볼 수 있지만,

    데이터는 데이터를 삽입하는 세션에서만 볼 수 있다.

    * DEFAULT 값: 다른 열의 이름이나, 의사열은 잘못된 값이다.

    * CREATE TABLE dept

    ( deptno NUMBER(2), dname VARCHAR2(14), loc VARCHAR2(13),

    dymd DATE DEFAULT SYSDATE )



    4. Data Dictionary

    USER_ : 사용자가 소유하는 객체에 대한 정보

    ALL_ : 사용자가 ACCESS 할 수 있는 모든 TABLE 에 대한 정보

    DBA_ : DBA 롤을 할당 받은 사용자만 ACCESS 할 수 있다.

    V$_ : 동적 성능(Performance) 뷰, DB SERVER 성능 및 잠금에 관한 정보.



    * DICT 테이블 안에 모든 data dictionary 정보가 있다.

    >> 유저가 소유한 개별 객체 유형을 봄.

    SELECT * FROM USER_TABLES

    >> 유저가 소유한 TABLE, VIEW, 동의어, 시퀀스를 봄.

    SELECT DISTINCT object_type

    FROM USER_OBJECTS ( USER가 ACCESS 할 수 있는 ALL_OBJECTS )

    >> User가 소유한 TABLE을 설명.

    SELECT * FROM USER_CATALOG

    --> SELECT * FROM cat 이라고 써도 된다.

    >> 모든 테이블 이름보기 SELECT * FROM TAB

    >> 컬럼 정보 보기 USER_TAB_COLUMNS



    5. Data Types

    VARCHAR2(size) : Variable-length character data (1 ~ 4000 bytes)

    CHAR(size) : Fixed-length character data (1 ~ 2000 bytes)

    NUMBER(p,s) : p - precision, s - scale

    DATE : B.C.4712-01-01 ~ A.D.9999.12.31

    LONG : Variable-length character data (2GB)

    - 한 table 당 하나 - constraints 사용 못함

    - order by, group by에서 사용못함 - 서브쿼리에서 사용할 때 not copy

    LONG RAW : Raw binary data of variable length up to 2 gigabytes

    RAW(size) : 2000 byte

    CLOB : Single-byte character data up to 4 gigabytes

    BLOB : Binary data up to 4 gigabytes

    BFILE : binary data stored in an external file; up to 4 gigabytes



    6. Subquery를 사용해서 테이블 복사하기(새로운 table 의 datatype 정의는 필요없다)

    CREATE TABLE dept30

    AS

    SELECT empno, ename, sal*12 ANNSAL, hiredate

    FROM emp

    WHERE deptno = 30



    * computed field일때 반드시 컬럼 alias를 줘야 한다. (ANNSAL)

    * computed 컬럼으로 만들어진 컬럼 타입 NUMBER일 때 기존의 자릿수는 사라지고

    최대자리수로 잡힌다.

    * column, type, data 모든것이 복사된다.(NOT NULL constraints 만 상속된다.)

    * key constraint는 정의되지 않는다.

    * WHERE조건을 false가 되게 만들면 데이터는 복사되지 않는다.

    7. 테이블에 컬럼 추가 하기

    ALTER TABLE dept30

    ADD ( job VARCHAR2(9) )

    -> 열을 추가할 때 모든 행은 초기에 null 값을 가진다.( not null 제약조건 X )

    8. 테이블에 있는 기존 컬럼 수정하기

    ALTER TABLE dept30

    MODIFY ( ename VARCHAR2(15) )



    * 제약사항.

    - 숫자타입에서 자릿수를 늘리는건 가능하다.

    - 숫자타입에서 자릿수를 줄일때는 모든 data가 null이거나 데이터가 한건도 없을 때만 가능하다.

    - char <--> varchar2 로 바꿀때는 모든 data가 null이거나 데이터가 한건도 없을 때만 가능하다.

    - default값도 바꿀 수 있다.(기존 default값은 유지된다.)

    - column name 은 modify 가 안된다.

    => 열을 추가(ADD), 수정(MODIFY)할 수 있지만 table에서 삭제할 수 없다.



    1.> ALTER TABLE table SET UNUSED (column);

    OR

    ALTER TABLE table SET UNUSED COLUMN column;

    2.>ALTER TABLE table DROP UNUSED COLUMNS;



    9. DROP TABLE

    DROP TABLE dept30



    10. OBJECT 이름 바꾸기

    RENAME dept TO department



    11. TRUNCATE TABLE

    TRUNCATE TABLE department

    * ROLLBACK을 절대로 할 수 없다.

    * 로그없이 테이블의 전체 데이터가 삭제되고 COMMIT이 된다.

    * 저장공간을 해제( DELETE 문은 해제할 수 없다.)

    12. 테이블에 주석문 추가하기

    COMMENT ON TABLE emp

    IS 'Employee Information'



    13. 컬럼에 주석문 추가하기

    COMMENT ON TABLE emp COLUMN emp.ename

    IS 'Employee Name'



    14. 주석문 삭제하기

    COMMENT ON TABLE emp IS ' '



    15. 주석문을 볼수있는 data dictionary

    * Column

    ALL_COL_COMMENTS

    USER_COL_COMMENTS

    * Table

    ALL_TAB_COMMENTS

    USER_TAB_COMMENTS





    [11] Including Constraints

    1. 오라클의 Constraint Type

    NOT NULL : null value를 허용하지 않음.

    UNIQUE : 유일한 값을 가지면서 null도 허용한다.

    PRIMARY KEY : NOT NULL, UNIQUE, TABLE당 1개 설정, 참조 당함

    FOREIGN KEY : Primary에 연결되어 있어서 Primary에 있는 값들만 갖고 있다.(PK,UK 참조)

    CHECK : 정해진 값 이외의 것이 들어오면 Error



    2. Constraint 규칙

    - Constraint을 생성할 때 이름을 주지 않으면 오라클서버는 SYS_Cn 이라고 이름을 자동 생성한다.

    - Column level 과 Table level로 Constraint를 정의한다.

    - constraint를 볼 수 있는 Data Dictionary는

    USER_CONSTRAINTS,USER_CONS_COLUMNS 이다.



    3. Constraint 정의

    * Column Level

    column [CONSTRAINT constraint_name] constraint_type,

    * Table Level

    column,...

    [CONSTRAINT constraint_name] constraint_type (column, ...),

    (column, ...),

    * not null은 반드시 column level로 정의를 내려야 한다.



    4. NOT NULL Constraint : column level



    5. UNIQUE Constraint : index 자동 생성

    CREATE TABLE dept (

    deptno NUMBER(2),

    dname VARCHAR2(14),

    loc VARCHAR2(13),

    CONSTRAINT dept_dname_uk UNIQUE (dname) )



    6. PRIMARY KEY Constraint

    CREATE TABLE dept (

    deptno NUMBER(2),

    dname VARCHAR2(14),

    loc VARCHAR2(13),

    CONSTRAINT dept_dname_uk UNIQUE (dname) ,

    CONSTRAINT dept_deptno_pk PRIMARY KEY (deptno) )



    7. FOREIGN KEY Constraint

    CREATE TABLE emp (

    empno NUMBER(4),

    ename VARCHAR2(10) [CONSTRAINT epm_ename_nn] NOT NULL,

    job VARCHAR2(9),

    mgr NUMBER(4),

    hiredate DATE,

    sal NUMBER(7,2),

    comm NUMBER(7,2),

    deptno NUMBER(7,2) NOT NULL,

    CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno)

    REFERENCES dept (deptno) )

    --> dept.deptno를 emp.deptno가 Foreign key로 사용하겠다는 뜻.

    * column level로 정의할 때는...(FOREIGN KEY 키워드는 생략)

    deptno NUMBER(7,2) NOT NULL

    CONSTRAINT emp_deptno_fk REFERENCES dept (deptno),

    * ON DELETE CASCADE

    Foreign key로 연결된 parent data가 삭제될 때 child data도 모두 삭제 되게 만든다.



    8. CHECK Constraint

    ..., deptno NUMBER(2),

    CONSTRAINT emp_deptno_ck

    CHECK (deptno BETWEEN 10 AND 99), ...

    --> deptno의 값은 10에서 99 사이에 있는 값들만 입력이 가능하다는 뜻.

    * CURRVAL, NEXTVAL, LEVEL, ROWNUM등 Pseudocolumn엔 허용되지 않는다.

    * SYSDATE, UID, USER, USERENV 함수들을 호출할수 없다.



    * 제약조건을 추가(ADD), 삭제(DROP)할 수 있지만 수정할 수는 없다.

    * 제약조건을 설정(ENABLE) 또는 해제(DISABLE)합니다.

    * MODIFT 절을 사용하여 NOT NULL 제약조건을 추가합니다.



    9. ADD Constraint

    *ALTER TABLE table_name

    ADD [CONSTRAINT constraint] type (column),

    ALTER TABLE emp

    ADD CONSTRAINT emp_mgr_fk

    FOREIGN KEY(mgr) REFERENCES emp(empno)

    * Constraint 수정은 할 수 없다.

    * not null constraint일 경우 ADD로 하지 않고 MODIFY로 한다.

    (기존 행에 null data 값이 없어야 한다.)



    10. DROP Constraint

    *ALTER TABLE table_name

    DROP (PRIMARY KEY| UNIQUE (column) |

    CONSTRAINT constraint) [CASCADE];

    ALTER TABLE emp

    DROP CONSTRAINT emp_mgr_fk

    * Primary를 삭제할 때 Foreign Key관계(종속된 제약조건)의 Constraint까지 DROP 하고 싶으면...

    ALTER TABLE dept

    DROP PRIMARY KEY CASCADE

    * CASCADE CONSTRAINTS 절은 DROP COLUMN 절과 함께 사용됩니다.

    ALTER TABLE test1 DROP (pk) CASCADE CONSTRAINTS;

    11. DISABLE CONSTRAINT(CREATE TABLE, ALTER TABLE 문에서 사용)

    : ENABLE CONSTRAINT 하기 전까지 실행을 멈춘다.

    ALTER TABLE emp

    DISABLE CONSTRAINT emp_empno_pk CASCADE



    12. ENABLE CONSTRAINT(CREATE TABLE, ALTER TABLE 문에서 사용)

    ALTER TABLE emp

    ENABLE CONSTRAINT emp_empno_pk

    * ENABLE 할 때는... 모든 data를 체크하기 때문에 시간이 오래 걸린다.



    *

    13. USER_CONSTRAINTS Data Dictionary

    SELECT constraint_name, constraint_type, search_condition

    FROM user_constraints

    WHERE table_name = 'EMP'



    --------------------------------------------------------

    CONSTRAINT_NAME C SEARCH_CONDITION

    ------------------------- - --------------------------

    SYS_C00674 C EMPNO IS NOT NULL

    SYS_C00675 C DEPTNO IS NOT NULL

    EMP_EMPNO_PK P

    --------------------------------------------------------



    14. USER_CONS_COLUMNS Data Dictionary

    SELECT constraint_name, column_name

    FROM user_cons_columns

    WHERE table_name = 'EMP'

    --------------------------------------------------------

    CONSTRAINT_NAME COLUMN_NAME

    EMP_DEPTNO_FK DEPTNO

    EMP_EMPNO_PK EMPNO

    EMP_MGR_FK MGR

    SYS_C00674 EMPNO

    SYS_C00675 DEPTNO

    --------------------------------------------------------





    [12] Creating Views

    * Oracle8부터는 View에도 Data를 갖고 있을 수 있다.

    * View를 사용하는 이유?

    - 데이터베이스 access를 제한한다.

    - 복잡한 쿼리를 쉽게 만든다.

    - 데이터의 독립을 허용하기 위해

    - 동일한 데이터로부터 다양한 결과를 얻기 위해

    * view를 만들 때 ORDER BY절을 사용할 수 없다.

    * Simple View에는 DML 문장을 수행 할 수 있지만, 함수 또는 데이터 그룹을 포함하지 못한다.

    (복합뷰 는 함수 또는 데이터 그룹을 포함할 수 있다.)

    * GROUP함수, GROUP BY절, DISTINCT keyword등을 사용한 view에는 행을 delete 할 수 없다.

    * 뷰를 사용한 데이터 엑세스

    - USER_VIEWS에서 뷰 정의를 검색한다.(select 문의 텍스트는 LONG 열에 저장된다.)

    - 뷰의 기본 테이블에 대한 액세스 권한을 확인한다.

    - 데이터를 기본 테이블에서 검색 또는 갱신한다.

    1. CREATE VIEW 문장

    CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view

    [ (alias[, alias]...) ]

    AS subquery

    [WITH CHECK OPTION [CONSTRAINT constraint]]

    [WITH READ ONLY]



    OR REPLACE : 만들려고 하는 view가 이미 존재할 때 recreate한다.

    FORCE : base table이 존재하지 않아도 view를 강제로 만든다.

    NOFORCE : base table이 반드시 존재해야만 view를 만들 수 있다.

    WITH CHECK OPTION : view를 만들 때 where조건에 있는 value를

    View를 통해서 DML 문장으로 수정하는 것을 막는다.

    WITH READ ONLY : view를 통해서 DML문장을 수행하는 것을 막는다.



    2. Creating View 예제1

    CREATE VIEW empvu10

    AS SELECT empno, ename, job

    FROM emp

    WHERE deptno = 10 ;

    --> 이렇게 만들어진 view의 column이름은 empno, ename, job이 된다.

    3. Creating View 예제2

    CREATE VIEW salvu30

    AS SELECT empno employee_number, ename name, sal salary

    FROM emp

    WHERE deptno = 30 ;

    --> column alias를 준 employee_number, name, salary가 view의 column이름이 된다.

    4. VIEW 수정하기 (OR REPLACE)

    CREATE OR REPLACE VIEW empvu10

    (employee_number, employee_name, job_title)

    AS SELECT empno, ename, job

    FROM emp

    WHERE deptno = 10 ;



    5. Complex VIEW

    CREATE VIEW detp_sum_vu

    (naem, minsal, maxsa, avgsal)

    AS SELECT d.dname, MIN(e.sal), MAX(e.sal), AVG(e.sal)

    FROM emp e, dept d

    WHERE e.deptno = d.deptno

    GROUP BY d.dname ;



    6. WITH CHECK OPTION 사용예

    CREATE OR REPLACE VIEW empvu20

    AS SELECT *

    FROM emp

    WHERE deptno = 20

    WITH CHECK OPTION CONSTRAINT empvu20_ck ;(deptno 가 20만 작업 가능)

    ( constraint name을 주지 않으면 SYS_Cn으로 만들어 진다. )

    * 예를들어 다음과 같은 update문장을 수행하면 error가 난다.

    UPDATE empvu20

    SET deptno = 10

    WHERE empno = 7788 ;

    --> ORA-01402: view WITH CHECK OPTION where-clause violation



    7. WITH READ ONLY 사용예

    CREATE OR REPLACE VIEW empvu10

    (employee_number, employee_name, job_title)

    AS SELECT empno, ename, job

    FROM emp

    WHERE deptno = 10

    WITH READ ONLY ;

    * 예를들어 다음과 같은 DELETE문장을 수행하면 error가 난다.

    DELETE FROM empvu10

    WHERE employee_number = 7782 ;

    --> ORA-01752: Cannot delete from view without exactly one key-preserved table



    8. View 없애기

    DROP VIEW empvu10 ;



    9. 만들어진 View를 볼때

    SELECT * FROM salvu30 ;

    * 인라인 view : FROM 절에 사용, 객체가 아님.

    10. View를 통한 DML 작업 수행에 관한 규칙

    *뷰가 다음을 포함한 경우 행을 제거할 수 없슴.

    - 그룹함수 - GROUP BY절 - DISTINCT 키워드 - 의사열 ROWNUM 키워드

    *뷰가 다음을 포함한 경우 데이터를 수정할 수 없슴.

    - 위에서 언급된 모든 조건(제거할 수 없슴)

    - ROWNUM 의사 열 : 하위 질의에서 반환되는 가 행에 1에서 시작하는 순차값을 할당.

    *뷰가 다음과 같은 경우 데이터를 추가할 수 없슴.

    - 뷰가 위에서 언급한 포함하는 경우.(제거, 수정)

    - 기본 테이블에서 뷰에 의해 선택되지 않은 열에 NOT NULL 제약 조건이 있는 경우.



    11. "TOP-N" 분석 수행

    SELECT [column_list], ROWNUM

    FROM (SELECT [column_list] FROM table

    ORDER BY TOP-N_column)

    WHERE ROWNUM <= N ( where 절은 < 또는 <= )



    [13] Other Database Objects (Sequence, Index, Synonym)

    1. Sequence?

    - unique한 숫자를 자동으로 부여한다.

    - 공유 가능하다.

    - primary key 성격을 갖는다.

    - cache 설정을 할 수 있기 때문에 빠른 속도를 낼 수 있다.



    2. CREATE SEQUENCE 문장

    CREATE SEQUENCE sequence

    [INCREMENT BY n] : default 1

    [START WITH n] : default 1

    [{MAXVALUE n | NOMAXVALUE}]

    [{MINVALUE n | NOMINVALEU}]

    [{CYCLE | NOCYCLE}]

    [{CACHE n | NOCACHE{] ; : default 20개의 cache



    INCREMENT BY n : n만큼 증가 한다.

    START WITH n : 처음 시작하는 숫자는 n이다.

    MAXVALUE n : MAX값은 n이다.

    NOMAXVALUE : MAX값은 무한대다. (10^27 OR -1) --> default

    MINVALUE n : MIN값은 n이다.

    NOMINVALUE : MIN값은 무한대다. (-(10^26) OR 1 ) --> default

    CYCLE | NOCYCLE : MAX나 MIN값으로 갔을때 다시 처음부터 새로

    시작할 건지를 설정한다. default는 NOCYCLE

    CACHE n | NOCACHE : n만큼의 CACHE를 줄 것인지를 설정한다.

    --> default는 cache 20으로 잡는다.

    3. CREATE SEQUENCE 예제

    CREATE SEQUENCE dept_deptno

    INCREMENT BY 1

    START WITH 91

    MAXVALUE 100

    NOCACHE

    NOCYCLE ;



    4. USER_SEQUENCES data dictionary

    SELECT sequence_name, min_value, max_value, increment_by, last_number

    FROM USER_SEQUENCES ;

    * last_number는 다음에 sequence 가능 한 숫자를 보여준다.



    5. NEXTVAL 과 CURRVAL

    NEXTVAL : Sequence가 1개 증가된다.

    CURRVAL : 현재 sequence 값을 보여준다.



    * 사용가능

    - SELECT문장에서 SELECT list

    - INSERT문장에서 SELECT list, values절 list

    - UPDATE문장에서 SET절



    * 사용불가

    - View의 SELECT list

    - SELECT문장에서 DISTINCT keyword

    - SELECT문장에서 GROUP BY, HAVING, ORDER BY절

    - SELECT, DELETE, UPDATE문장 안에 있는 subquery

    - CREATE TABLE, ALTER TABLE문장에서 DEFAULT expression



    * CACHE가 20으로 정의 했을 때...

    ① INSERT INTO dept

    VALUES (dept_deptno.NEXTVAL, ...) --> 1

    ② SELECT last_number FROM user_squences --> 21

    ③ SELECT dept_deptno.CURRVAL FROM dual --> 1

    ④ SELECT dept_deptno.NEXTVAL FROM dual --> 2

    6. SEQUENCE 사용예

    INSERT INTO dept( deptno, dname, loc )

    VALUES (dept_deptno.NEXTVAL, 'MARKETING', 'SAN DIEGO')

    --> 증가된 sequence값이 deptno에 저장된다.



    * 현재의 sequence값을 보려면...

    SELECT dept_deptno.CURRVAL FROM dual ;

    * SELECT에서 sequence값 증가시키기

    SELECT dept_deptno.NEXTVAL FROM dual ;



    7. SEQUENCE 수정하기

    ALTER SEQUENCE dept_deptno

    INCREMENT BY 1

    MAXVALUE 999999

    NOCACHE

    NOCYCLE ;

    * sequence에 대한 ALTER privilege를 갖고 있어야 한다.

    * maxvalue가 current value보다 적을 땐 반드시 drop하고 re-create해야 한다.

    * START WITH 문을 변경할 수 없습니다.( 삭제 후 다시 생성 )

    8. SEQUENCE 제거하기

    DROP SEQUENCE dept_deptno ;

    9. INDEX ?

    - Retrieve를 빨리 하기 위해서

    - DISK I/O를 줄일수 있다.

    - 테이블과는 독립적이다.

    * PRIMARY KEY or UNIQUE constraint 생성시 오라클 서버에서 자동으로 생성되는것과, CREATE INDEX를 사용해서 만들어지는 index가 있다.

    * INDEX는 많이 만든다고 좋은게 아니다.

    * INDEX는 이렇때 만드는게 좋다.

    - WHERE절이나 JOIN조건에 자주나오는 column

    - column의 범위가 클때

    - null value를 많이 갖고 있는 column

    - 전체 row에서 2~4% 정도의 row를 찾을때



    10. CREATE INDEX

    CREATE INDEX index

    ON table (column[, column]...) ;

    CREATE INDEX emp_ename_idx

    ON emp (ename) ;



    11. USER_INDEXES and USER_IND_COLUMNS data dictionary

    SELECT ic.index_name, ic.column_name, ic.column_position, ix.uniqueness

    FROM user_indexes ix, user_ind_columns ic

    WHERE ic.index_name = ix.index_name

    AND ic.table_name = 'EMP' ;

    12. INDEX 제거하기

    DROP INDEX emp_ename_idx ;



    13. SYNONYM ?

    user가 synonym을 사용하면 스키마를 별도로 명시할 필요가 없어진다.



    14. CREATE SYNONYM

    CREATE [PUBLIC] SYNONYM synonym

    FOR object ;

    * PUBLIC은 모든 user에게 synonym권한을 주는 것이고, DBA권한이 있는 사람만

    사용이 가능하다.

    * PUBLIC을 안쓰면 만든 사람만 사용한다.



    CREATE SYNONYM d_sum

    FOR dept_sum_vu ;

    --> dept_sum_vu라는 view테이블을 d_sum으로 사용 하겠다.



    15. PUBLIC SYNONYM

    CREATE PUBLIC SYNONYM dept

    FOR alice.dept

    --> alice가 만든 dept테이블을 dept로 모든 유저에게 명시 하겠다.



    16. SYNONYM 제거

    DROP SYNONYM d_sum ;

    * public으로 정의된 SYNONYM은 DBA만 제거가 가능하다.





    [14] Controlling User Access (GRANT, REVOKE)

    * 시스템 권한(System Privilege): 데이터 베이스를 액세스할 수 있다.

    * 객체 권한(Object Privilege) : 데이터 베이스 객체 내용을 조작할 수 있다.

    1. System Privilege? --> DBA권한

    - Create new users ( CREATE USER )

    - Remove users ( DROP USER )

    - Remove tables ( DROP ANY TABLE )

    - Backup tables ( BACKUP ANY TABLE )



    2. Creating User

    CREATE USER scott

    IDENTIFIED BY tiger ;



    3. system privilege에서의 GRANT

    GRANT privilege [, privilege...]

    TO user [, user...]

    [WITH ADMIN OPTION] ;

    * WITH ADMIN OPTION : dba가 권한을 주는 user에게도 admin 권한을 줄 수 있다.

    * user system privilege(DBA 가 USER에게 할당 할 수 있는 권한)

    CREATE SESSION : 테이터베이스에 connect하는 권한

    CREATE TABLE : 테이블 만드는 권한

    CREATE SEQUENCE : sequence 만드는 권한

    CREATE VIEW : view 만드는 권한

    CREATE PROCEDURE : stored prcedure, function 만드는 권한

    GRANT create table, create sequence, create view

    TO scott

    --> scott에게 table, sequence, view만드는 권한을 준다.



    4. ROLE : 사용자에게 부여할 수 있는 관련 권한을 하나로 묶어 명명한 그룹

    Grant를 줄 role user를 만든후 그 role user에 grant를 주고,

    role user의 권한을 각각의 user에게 넘겨준다.

    ① SQL> CREATE ROLE manager ;

    Role created.

    ② SQL> GRANT create table, create view TO manager ;

    Grant succeeded.

    ③ SQL> GRANT mananger TO brake, clock ;

    Grant succeeded.



    5. User Password 변경하기

    ALTER USER user IDENITIFIED BY password ;

    예) ALTER USER scott IDENTIFIED BY lion ;



    6. Object Privileges?

    * 객체마다 다르다.

    * 소유자는 객체에 대한 모든 권한을 갖는다.

    * 소유자는 자신의 객체에 대한 특정 권한을 부여할 수 있다.



    5. User Password 변경하기

    ALTER USER user IDENITIFIED BY password ;

    예) ALTER USER scott IDENTIFIED BY lion ;



    6. Object Privileges?

    * 객체마다 다르다.

    * 소유자는 객체에 대한 모든 권한을 갖는다.

    * 소유자는 자신의 객체에 대한 특정 권한을 부여할 수 있다.

    7. Object Privilege에서의 GRANT

    GRANT object_priv [(columns)| ALL]

    ON object

    TO {user|role|PUBLIC}

    [WITH GRANT OPTION] ;

    * sue, rich 라는 user에게 emp 테이블을 select 권한을 준다.

    GRANT select

    ON emp

    TO sue, rich ;

    * scott, manager라는 user에게 dept 테이블의 dname,loc 컬럼을 update할 수 있게 권한을 준다.

    GRANT update (dname, loc)

    ON dept

    TO scott, manager ;



    * WITH GRANT OPTION

    GRANT select, insert

    ON dept

    TO scott

    WITH GRANT OPTION ;

    --> scott에게 dept 테이블의 select, insert권한을 주면서 scott가 다른 유저에게도

    이 권한을 줄 수 있게 한다.



    * PUBLIC : 모든 유저에게 권한을 부여한다.

    GRANT select

    ON alice.dept

    TO PUBLIC ;

    --> 모든유저에게 alice가 만든 dept 테이블의 select권한을 준다.



    * 모든 유저에게 모든 object권한을 주기

    GRANT ALL

    ON emp

    TO PUBLIC ;



    8. 권한 없애기 (REVOKE)

    REVOKE {privilege [, privilege...] | ALL}

    ON object

    FROM {user[, user...]|role|PUBLIC}

    [CASCADE CONSTRAINTS]



    REVOKE select, insert

    ON dept

    FROM scott ; --> scott에게서 dept테이블의 select, insert권한을 없앤다.

    * CASCADE CONSTRAINTS : 이 옵션을 않쓰면 revoke할 때 forien key

    관계의 table을 revoke할 수 없다.



    9. Privilege Grant를 볼 수 있는 Data Dictionary

    ROLE_SYS_PRIVS : System privilege 권한에 대한 정보

    ROLE_TAB_PRIVS : table(object) privilege 권한에 대한 정보

    USER_ROLE_PRIVS : role정보

    USER_TAB_PRIVS_MADE : 내가 다른 사람에게 준 TABLE 권한에 대한 정보

    USER_TAB_PRIVS_RECD : 내가 다른 사람에게 받은 TABLE 권한에 대한 정보

    USER_COL_PRIVS_MADE : 내가 다른 사람에게 준 COLUMN 권한에 대한 정보

    USER_COL_PRIVS_RECD : 내가 다른 사람에게 준 COLUMN 권한에 대한 정보

    출처 : 원본출처외 http://database.sarang.net/?inc=read&aid=11942&criteria=oracle&subcrit=&id=&limit=20&keyword=%BF%B9%BE%E0%BE%EE+%C1%A4%B8%AE&page=1

    'IT > DB' 카테고리의 다른 글

    오라클/PHP 환경의 확장  (0) 2006/11/16
    DBMS의 SQL 비교  (0) 2006/10/19
    PL/SQL 자료 정리  (0) 2006/10/16
    table 생성시 예약어로 인해 OCIError: 904 ORA-00904: invalid column name  (0) 2006/10/16
    ORACLE 연관배열로 필드값을 가져올경우  (0) 2006/10/12
    OraCle  (0) 2006/09/22
    Posted by 푸른_바람
    table 생성시 예약어로 인해 OCIError: 904 ORA-00904: invalid column name 오류

    오라클에서 도대체 어떤게 예약어 인지 한참(2시간?)을 헤메고 있었다.

    id, name, password 등은 사용이 가능한데
    comment 이게 예약어라니.. ㅡ.ㅡ

    정확하게 예약어의 기준이 먼지 한번 더 찾아봐야겠다.

    more..

    'IT > DB' 카테고리의 다른 글

    DBMS의 SQL 비교  (0) 2006/10/19
    PL/SQL 자료 정리  (0) 2006/10/16
    table 생성시 예약어로 인해 OCIError: 904 ORA-00904: invalid column name  (0) 2006/10/16
    ORACLE 연관배열로 필드값을 가져올경우  (0) 2006/10/12
    OraCle  (0) 2006/09/22
    mysql의 최대 성능 향상 방법  (0) 2006/09/22
    Posted by 푸른_바람
    이전버튼 1 이전버튼