글
SQL문 기본
데이타베이스에서 데이타를 질의한다.(Select)데이타를 입력(Insert), 수정(Update), 삭제(Delete)한다.데이타 구조를 생성(Create), 수정(Alter), 삭제(Drop)한다데이타 액세스를 조절한다(Grant)
- 1. SQL문의 종류
- DDL(Data Definition Language테이블/데이타의 구조를 조작하는 명령)DML(Data Manupulation Language : 데이타를 조작하는 명령)Session Control(세션을 제어하는 명령)System Control(시스템을 제어하는 명령)Transaction Control(트랜잭션을 제어하는 명령)
Data Definition | Data Manupulation | System Control |
ALTERANALYZEAUDITCOMMENTCREATEDROPGRANTNOAUDITRENAMEREVOKETRUNCATE | DELETEEXPLAIN PLANINSERTLOCK TABLESELECTUPDATE | ALTER SYSTEM |
Transaction Control | ||
COMMITROLLBACKSAVEPOINTSET TRANSACTION | ||
Session Control | ||
ALTER SESSIONSET ROLE |
Table 2-1. SQL문 종류
ALTER : 데이타베이스를 변경할 때 사용ANALYZE : 데이타베이스의 통계자료를 생성시에 사용AUDIT: SQL문을 auditing하기 위해 지정하는 명령.COMMENT : table, view, snapshot 또는 column에 관한 comment를 데이터 딕셔너리에 입력할 때 사용CREATE : table, index, view, snapshot, cluster, database, database link 등과 같은 database object를 생성시에 사용DROP : database object삭제하는 명령.RENAME : table, view, sequence, private synonym의 이름을 변경하는 명령.NOAUDIT :AUDIT에 의해 선택된 SQL문의 audit를 정지시키는 명령.REVOKE : object의 권한을 취소하는 명령.TRUNCATE : 테이블이나 cluster의 모든 row를 삭제하는 명령.DELETE : 테이블이나 view의 base테이블의 row를 삭제하는 명령EXPLAIN PLAN : SQL문의 실행계획을 결정하는 명령.INSERT : 테이블, VIEW의 BASE테이블에 ROW를 추가하는 명령.LOCK TABLE : 1개 또는 여러 개의 테이블을 LOCK하는 명령.SELECT : 테이블, VIEW, SNAPSHOT에서 ROW를 구해오는 명령.UPDATE : TABLE, VIEW의 BASE TABLE의 존재하는 ROW의 값을 변경하는 명령.ALTER SESSION : 유저가 권한이 있는 세션을 제어하는 명령.SET ROLE : 현재의 세션의 ROLE을 ENABLE/DISABEL시키는 명령.ALTER SYSTEM : 오라클 인스턴스를 변경하는 명령.COMMIT: 현재의 트랜잭션을 종료하고, 트랜잭션 도중 변경되어진 데이타를 확정하는 명령.ROLLBACK : 현재의 트랜잭션을 취소하고 변경되어진 데이타를 변경전의 데이타로 복구.SAVEPOINT : 트랜잭션에서 나중에 ROLLBACK할 위치를 지정하는 명령.SET TRANSACTION : 현재의 트랜잭션에서 트랜잭션을 READ-ONLY로 하거나 READ-WRITE로 설정, 트랜잭션에서 사용될 ROLLBACK SEGMENT를 지정한다. TIP> SQLPLUS에서 HELP를 보는 방법- SQL>HELP [명령어] 하면 된다.
- 2. 기본적인 SQL문
- DECLARE CURSOR를 선언한다.ALLOCATE CURSOR변수에 메모리를 할당한다.OPEN QUERY를 사용가능하게 수행하여 active set을 생성한다.FETCH active set에서 각 ROW를 가져온다.CLOSE CURSOR를 종료한다.
- INTO, FROM, WHERE , CONNECT BY, START WITH,GROUP BY,HAVING,ORDER BY,FOR UPDATE OF 등이 있다.
- EXEC SQL SELECT ename, job, sal + 2000 INTO :emp_name, :job_title, :salary FROM emp WHERE empno = :emp_number;
- EXEC SQL INSERT INTO emp (empno, ename, sal, deptno) VALUES ( :emp_number, :emp_name, :salary, :dept_number);
- subquery는 INSERT문장이나 CREATE TABLE문장 뒤에서, UPDATE문의 컬럼을 명시하는 것으로 사용가능하다.EXEC SQL INSERT INTO emp2 (empno, ename, sal, deptno) SELECT empno, ename, sal, deptno from emp WHERE job = :job_title;
- EXEC SQL UPDATE emp SET sal = :salary, comm = :commission WHERE empno = :emp_number;UPDATE문에서도 subquery를 사용할 수 가 있는데 SET절에서 컬럼 뒤에 사용한다.EXEC SQL UPDATE emp SET sal = (SELECT AVG(sal) *1.1 FROM emp WHERE deptno = 20) WHERE empno = :emp_number;
- EXEC SQL DELETE emp WHERE empno = :emp_number;INSERT를 제외한 SELECT, UPDATE, DELETE에서는 WHERE절을 사용가능한데, 이 WHERE절은 테이블의 특정한 ROW를 찾는 검색조건이다.
- 3. CURSOR의 사용
- EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT ename, empno, sal FROM emp WHERE deptno = :dept_number;
- EXEC SQL OPEN emp_cursor;
- EXEC SQL FETCH emp_cursor INTO :emp_name, :emp_number, :salary;
- while(1){ EXEC SQL FETCH emp_cursor INTO :emp_name, :emp_number, :salary; if(sqlca.sqlcode == 1403) { printf("No Data Found !\n"); break; } else if(sqlca.sqlcode != 0 ) { printf(" Oracle Error Detected!!: %d\n%s\n", sqlca.sqlcode,sqlca.sqlerrmc); break; } printf("%s:%s:%d\n",emp_name, emp_number, salary);}
- EXEC SQL CLOSE emp_cursor;
- EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT ename, job FROM emp WHERE empname = :emp_number;while(1) { scanf(emp_number,"%s"); if(strcmp(deptno,"0")==0) break; EXEC SQL OPEN emp_cursor while(1) { EXEC SQL FETCH emp-cursor INTO :emp_name, :job_title; if(sqlca.sqlcode == 1403) break; if(sqlca.sqlcode != 0) { printf("ORACLE Error !!1 %d",sqlca.sqlcode); break; } printf("%s%s\n",emp_name, job_title); }}EXEC SQL CLOSE emp_cursor;
- 4. 내부커서, 외부커서
- 오라클은 SQL문장에 대해서 무조건 내부 커서를 생성하며 이 커서는 보관 커서를 지정하지 않는 이상 DECLARE/OPEN/FETCH/CLOSE 작업을 매번 자동적으로 수행된다. 또한 한개의 ROW를 추출하는 문장이나 다중처리로 추출하는 경우도 마찬가지로 작동된다.
- 앞에서 살펴본 프로그래머가 커서를 선언하여 OPEN/FETCH/CLOSE를 하는 커서를 말한다.
출처 : http://blog.naver.com/nsjung74/110007853741
'Oracle' 카테고리의 다른 글
PROC 에서 외부 환경변수를 받아 들이는 방법 (0) | 2007.01.21 |
---|---|
Dynamic SQL의 사용 (0) | 2007.01.21 |
Pro*C에서 변수의 사용 (0) | 2007.01.21 |
proc 파헤치기 (0) | 2007.01.21 |
LINUX + ORACLE 10g 10.1 Install (0) | 2006.06.11 |
RECENT COMMENT