pl/sql 은 무엇인가 ?

17
Ch8 1 PL/SQL PL/SQL 은 은은은은 은 은은은은 ? ? PL/SQL(Procedural Language/SQL) PL/SQL(Procedural Language/SQL) 은은은 은은은은 은은은은 은은은 DB 은은은은은 은은 SQL 은 은은 은은은은 은은은 Block 은은 Application Logic 은은 은은 은은 은은 은은 은은 은은은 은은은은은은 은은은 은 은은은은 은은은은 은은은은 은은 은은 은은은 Logic 은 은은은은은은 , 은은은 은은 은은은 은은은은은 은은은 은은 은은 은은은 은은은 은은 은은 PL/SQL PL/SQL 은은 은은 은은은 은은은 은은 SQL 은 은은 · 은은 은은은 , 은은은 , 은은은 , 은은은 , NULL 은 PL/SQL PL/SQL 은 은은은 은 은은 은 은 은은은 은 은은 은 SQL*Plus 은은은은 은은은은 , 은은 , 은은은 은은은

Upload: astra-briggs

Post on 04-Jan-2016

35 views

Category:

Documents


4 download

DESCRIPTION

PL/SQL 은 무엇인가 ?. PL/SQL(Procedural Language/SQL) 오라클 환경에서 실행되는 절차적 DB 프로그래밍 언어 SQL 의 확장 프로그램 단위인 Block 으로 Application Logic 작성 사용 이유 모든 오라클 프로그래밍의 기초가 됨 서버에서 수행되는 프로세스 작성 지원 복잡한 Logic 을 캡슐화 모듈화 , 추상화 가능 트리거 작성복잡한 무결성 제약 가능 독립적 플랫폼 수준 제공 PL/SQL 제공 명령문 모든 SQL 문 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: PL/SQL 은 무엇인가 ?

Ch81

PL/SQLPL/SQL 은 무엇인가은 무엇인가 ?? PL/SQL(Procedural Language/SQL)PL/SQL(Procedural Language/SQL)

오라클 환경에서 실행되는 절차적 DB 프로그래밍 언어 SQL 의 확장 프로그램 단위인 Block 으로 Application Logic 작성

사용 이유사용 이유 모든 오라클 프로그래밍의 기초가 됨 서버에서 수행되는 프로세스 작성 지원 복잡한 Logic 을 캡슐화모듈화 , 추상화 가능 트리거 작성복잡한 무결성 제약 가능 독립적 플랫폼 수준 제공

PL/SQL PL/SQL 제공제공 명령문명령문 모든 SQL 문 변수 · 상수 선언문 , 대입문 , 제어문 , 호출문 , NULL 문

PL/SQLPL/SQL 로 작성할 수 있는 것로 작성할 수 있는 것 SQL*Plus 스크립트 프로시저 , 함수 , 트리거 패키지

Page 2: PL/SQL 은 무엇인가 ?

Ch82

PL/SQLPL/SQL 의 기본 블록 구조의 기본 블록 구조 기본 구조 기본 구조 : Block: Block

Error Error 발생 시발생 시 실행을 중단하고 EXCEPTION 절로 이동 , 정상종료 EXCEPTION 절이 없으면 Error 메시지 출력 후 강제 종료

[DECLARE 선언문 ] -- 변수 , 상수 , 커서 , 프로시저 , 함수 등 선언BEGIN 실행문[EXCEPTION 예외처리문 ]END;/ -- 실행

Page 3: PL/SQL 은 무엇인가 ?

Ch83

PL/SQLPL/SQL 의 블록 작성 및 실행의 블록 작성 및 실행 Block Block 작성 순서 작성 순서 : p284, Reading : p284, Reading ‘‘SET SERVEROUTPUT ON’SET SERVEROUTPUT ON’

DBMS_OUTPUT 패키지의 PUT_LINE() 프로시저의 화면 출력을 가능하게 하는 SQL*Plus 명령어

(( 실습실습 ) ) 예제 예제 8-1 : ‘C9901’8-1 : ‘C9901’ 학생의 평균점수 출력학생의 평균점수 출력DECLARE v_avg NUMBER(3) := 0; v_student_ID VARCHAR2(5) := 'C9901';BEGIN SELECT AVG(SCORE) INTO v_avg FROM SG_Scores WHERE Student_ID = v_student_ID GROUP BY Student_ID; DBMS_OUTPUT.PUT_LINE (v_student_ID || ' 의 평균점수는 ['

|| v_avg || '] 점 입니다 .');END;/

BlockBlock 의 실행방법의 실행방법 *.sql 로 스크립트 저장후 SQL*Plus 에서 호출 실행 : “start *.sql” Editor 로 작성 후 copy 하여 실행 : “run”, “/” 그림 8-6 : p288, Developer 에서 실행

Page 4: PL/SQL 은 무엇인가 ?

Ch84

선언절에선언절에 변수변수 , , 상수 선언상수 선언 PL/SQLPL/SQL 의 의 Data TypeData Type

오라클 SQL 의 모든 Data Type PL/SQL 의 추가 Data Type

추가 추가 Data TypeData Type Boolean : True, False, Unknown Binary_Interger : 부호가 있는 정수 , -2147483647~ 2147483647 Natural : 0~ 2147483647 Positive : 1~ 2147483647 %Type : 기존 Table 의 한 컬럼의 Data Type %RowType : 기존 Table 의 모든 컬럼의 Data Type

선언 선언 SyntaxSyntax 변수명 데이터타입 [:= 초기값 ];

P_count NUMBER(3) :=0; 상수명 CONSTANT 데이터타입 := 상수값 ;

K CONSTANT POSITIVE :=100;

Page 5: PL/SQL 은 무엇인가 ?

Ch85

%Type%Type 변수명 테이블명 . 컬럼명 %TYPE;

v_age SG_Scores.Score%TYPE :=0; %RowType%RowType

변수명 테이블명 %TYPE;v_rec SG_Scores%ROWTYPE;…V.Grade :=‘A’;

( 실습 ) 예제 8-4 : 예제 8-1 의 확장DECLARE v SG_Scores%ROWTYPE; v_cnt NUMBER(2) := 0;BEGIN v.Student_ID := 'C9901'; SELECT Count(*), AVG(SCORE) INTO v_cnt, v.Score FROM SG_Scores WHERE Student_ID = v.Student_ID GROUP BY Student_ID; IF v.score >= 90 THEN v.grade := 'A'; ELSIF v.Score >= 80 THEN v.grade := 'B'; ELSIF v.Score >= 70 THEN v.grade := 'C'; ELSIF v.Score >= 60 THEN v.grade := 'D'; ELSE v.grade := 'F'; END IF; DBMS_OUTPUT.PUT_LINE (v.student_ID || ' 의 과목수는 [' ||v_cnt || '] 이고 평균점수는 [' || v.Score

||'] 점 [' || v.grade || '] 등급입니다 .');END;/

Page 6: PL/SQL 은 무엇인가 ?

Ch86

(Try) %ROWTYPE (Try) %ROWTYPE 이용하여 이용하여 'C9901' 'C9901' 학생 레코드 출력학생 레코드 출력DECLARE

v_std Student%ROWTYPE;

BEGIN

END; 출력 결과 : C9901, 한영삼 , 컴정

Page 7: PL/SQL 은 무엇인가 ?

Ch87

PL/SQL PL/SQL 테이블과 사용자 정의 레코드테이블과 사용자 정의 레코드 복수개의 변수를 선언하는 방법

PL/SQL PL/SQL 테이블테이블 한 type 의 변수를 동적으로 복수개 저장하기위한 자료구조 Syntax

TYPE 테이블타입명 IS TABLE OF 데이터타입INDEX BY BINARY_INTEGER;

테이블변수명 테이블타입명 ;

TYPE 학번 _table IS TABLE OF Student.std_id%TypeINDEX BY BINARY_INTEGER;array_ 학번 학번 _table;…FOR … LOOP SELECT std_id INTO v_ 학번 FROM Student WHERE …; array_ 학번 (i) := v_ 학번 ; i := i+1;END LOOP

Page 8: PL/SQL 은 무엇인가 ?

Ch88

(Try) PL/SQL (Try) PL/SQL 테이블 이용하여 학생 정보 출력테이블 이용하여 학생 정보 출력DECLARE TYPE id_table IS TABLE OF student.student_id%TYPE INDEX BY

BINARY_INTEGER; TYPE name_table IS TABLE OF student.name%TYPE INDEX BY

BINARY_INTEGER; TYPE dept_table IS TABLE OF student.dept_id%TYPE INDEX BY

BINARY_INTEGER; vid_tab id_table ; vname_tab name_table ; vdept_tab dept_table; i BINARY_INTEGER := 0;BEGIN FOR std_list IN(SELECT student_id, name, dept_id FROM student) LOOP i := i + 1; vid_tab(i) := std_list.student_id; vname_tab(i) := std_list.name; vdept_tab(i) := std_list.dept_id; END LOOP; FOR j IN 1..i LOOP DBMS_OUTPUT.PUT_LINE( vid_tab(j)||', '||vname_tab(j)||', '||vdept_tab(j));END LOOP;END;

(Try) (Try) 위 프로그램을 위 프로그램을 Professor Professor 테이블의 테이블의 professor_id, name, position professor_id, name, position 출력하도록 출력하도록 수정수정

Page 9: PL/SQL 은 무엇인가 ?

Ch89

사용자 정의 레코드 선언사용자 정의 레코드 선언 타입과 크기가 다른 기억장소가 복수개 선언됨 Syntax

예 : 예제 8-6

TYPE 레코드타입명 IS RECORD ( 필드명 1 데이터타입 [NOT NULL] [ 초기값 ], … );

레코드명 레코드타입명 ;

Page 10: PL/SQL 은 무엇인가 ?

Ch810

(Try) (Try) 레코드 타입 이용하여 학생 정보 출력레코드 타입 이용하여 학생 정보 출력DECLARE TYPE std_record IS RECORD (std_id student.student_id%type, name student.name%type, dept_id student.dept_id%type); vstd std_record; i BINARY_INTEGER := 0;BEGIN FOR std_list IN(SELECT student_id, name, dept_id FROM student)

LOOP i := i + 1; vstd.std_id := std_list.student_id; vstd.name := std_list.name; vstd.dept_id := std_list.dept_id; DBMS_OUTPUT.PUT_LINE(vstd.std_id||', '||vstd.name||', '||

vstd.dept_id); END LOOP;END;

(Try) (Try) 위 프로그램을 위 프로그램을 Professor Professor 테이블의 테이블의 professor_id, name, position professor_id, name, position 출력하도록 수정출력하도록 수정

Page 11: PL/SQL 은 무엇인가 ?

Ch811

조건 판단문조건 판단문 SyntaxSyntax

예 : 예제 8-7

IF 조건 1 THEN 명령문 1; … 명령문 N; [ELSEIF 조건 2 THEN 명령문 1; … 명령문 N; … ] [ELSE 명령문 1; … 명령문 N; ]END IF;

Page 12: PL/SQL 은 무엇인가 ?

Ch812

반복문반복문 LOOP ~ END LOOPLOOP ~ END LOOP

무한 루프 탈출

EXIT; EXIT [ 레이블명 ] WHEN 조건 ;

( 실습 ) 예제 8-8CREATE TABLE Temp1 (col1 NUMBER(3),Col2 DATE );DECLAREMax_No CONSTANT POSITIVE := 10;I NATURAL := 0;BEGIN LOOP I := I + 1; EXIT WHEN I > Max_No; INSERT INTO Temp1 VALUES (I, SYSDATE); END LOOP;END;

Page 13: PL/SQL 은 무엇인가 ?

Ch813

WHILE LOOPWHILE LOOP ( 실습 ) 예제 8-9

CREATE TABLE Temp2 (col1 NUMBER(3),Col2 DATE );DECLAREMax_No CONSTANT POSITIVE := 10;I NATURAL := 0;BEGIN WHILE I < MAX_No LOOP I := I + 1; INSERT INTO TEMP2 VALUES (I, SYSDATE); END LOOP;END;

FOR LOOPFOR LOOP Syntax

( 실습 ) 예제 8-10CREATE TABLE Temp3 (col1 NUMBER(3),Col2 DATE );DECLAREMax_No CONSTANT POSITIVE := 10;I NATURAL := 0;BEGIN FOR I IN 1..MAX_No LOOP INSERT INTO TEMP3 VALUES (I, SYSDATE); END LOOP;END;

FOR 변수 IN [REVERSE] 초기값 .. 최종값 LOOP 명령문 1; … 명령문 N;END LOOF;

Page 14: PL/SQL 은 무엇인가 ?

Ch814

기타 명령문기타 명령문 NULLNULL 문문

어떤 처리도 하지 않음

대입문대입문 ':=' 사용

GOTOGOTO 문문 예 : p303, 예제 8-12

주석주석 '--' : 단일 줄 주석 /* … */ : 여러 줄 주석

Page 15: PL/SQL 은 무엇인가 ?

Ch815

실행절에 실행절에 SQLSQL 문 사용문 사용 PL/SQL BlockPL/SQL Block 에서의 에서의 SELECTSELECT 문문

비절차적 SQL 과 다름 : 한 행만 검색 가능 검색 결과를 INTO 절 변수에 저장 검색 결과가 0 행 (NO_DATA_FOUND) 이거나 복수행

(TOO_MANY_ROWS) 이면 Error 발생 ORDER BY 절 사용 못함 복수행 검색을 위해서는 커서 (Cursor) 사용해야 함

(( 실습실습 ) ) 예제 예제 8-13 : 'C9901'8-13 : 'C9901' 의 과목수의 과목수 , , 평균점수 계산평균점수 계산DECLARE

v_avg NUMBER(3) := 0; -- 평균점수 저장 v_cnt NUMBER(2) := 0; /* 과목수 저장 */

v_student_ID VARCHAR2(5) := 'C9901'; /* 검색할 학번 */

BEGIN

SELECT COUNT(Course_Id), AVG(Score)

INTO v_cnt, v_avg

FROM SG_Scores

WHERE Student_ID = v_student_ID

GROUP BY Student_ID;

DBMS_OUTPUT.PUT_LINE (v_student_ID || ' 의 [' || v_cnt || '] 과목에 대한 평균점수는 [' || v_avg || '] 점 입니다 .');

END;

(Try) 예제 8-13 에서 'C9901' 의 수강 과목번호와 각각의 점수 출력 : Error

Page 16: PL/SQL 은 무엇인가 ?

Ch816

(Try) (Try) 커서 사용한 복수행 검색커서 사용한 복수행 검색DECLARE

v_cid VARCHAR2(5);

v_score NUMBER(3);

v_student_ID VARCHAR2(7):='C9901';

cursor c_std is SELECT Course_Id, Score

FROM SG_Scores

WHERE Student_ID = v_student_ID;

BEGIN

END;

declare cursor cur_1 is select 이름 from 학생 ; v_name char(10); begin dbms_output.enable; open cur_1; fetch cur_1 into v_name; loop dbms_output.put_line(v_name); fetch cur_1 into v_name; exit when cur_1%notfound; end loop; close cur_1; end;/

Page 17: PL/SQL 은 무엇인가 ?

Ch817

PL/SQLPL/SQL 에서 화면에 출력하기에서 화면에 출력하기 DBMS_OUTPUT DBMS_OUTPUT 패키지 이용패키지 이용

SET SERVEROUTPUT ON : 세션 종료까지 유효 DBMS_OUTPUT.ENABLE : 패키지 활성화 DBMS_OUTPUT.DISABLE : 패키지 비활성화 DBMS_OUTPUT.PUT_LINE( ) : 문자열 화면 출력

(( 실습실습 ) ) 예제 예제 8-15 : 8-15 : 활성화활성화 // 비활성화 비활성화 TestTestBEGIN

SET SERVEROUTPUT ON

DBMS_OUTPUT.DISABLE;

DBMS_OUTPUT.PUT_LINE('1.HELLO WORLD.');

DBMS_OUTPUT.ENABLE;

DBMS_OUTPUT.PUT_LINE('2.HELLO WORLD.');

END;