-- PLSQL
PL/SQL(Procedural Language extensions to SQL)은 프로그래밍언어의 특성을 가지는 SQL의 확장이며,
데이터 조작과 질의 문장은 PL/SQL의 절차적 코드 안에 포함된다. 또한 PL/SQL을 사용하면 SQL로 할 수 없는
절차적 작업이 가능하다. 여기에서 절차적이란 어떤 것이 어떻게 완료되는지 그 방법을 정확하게 코드에 기술
한다는 것을 의미한다.
-- SQL Developer 에서 PL/SQL의 쿼리의 결과를 확인할 수 있게 설정하기
* DBMS_OUTPUT.PUT_LINE()을 이용하여 결과를 출력하기 위해서는 먼저 SET SERVEROUTPUT ON 를 실행
* Developer에서 메뉴 : 보기 - DBMS 출력 선택후 DBMS 출력 창의 에서 + 버튼을 누름 - plus icon to enable DBMS_OUTPUT for a connection.
* DBMS_OUTPUT.PUT_LINE() 에 대한 결과가 한번은 잘 나오는데 두번째부터는 실행되지 않을 수 있다.
* 프로시져등을 만들때는 ORACLE SQL Developer가 편하지만 출력이 되지 않을 경우에는 sqlplus를 이용 한다.
-- DBMS_OUTPUT.PUT_LINE('값');
출력 후 라인 넘김
-- DBMS_OUTPUT.PUT('값');
출력 후 라인 넘기지 않음. DBMS_OUTPUT.NEW_LINE();을 만나야 화면에 표시 됨
-- DBMS_OUTPUT.NEW_LINE();
라인 넘김
-- 대입문
변수 := 값;
-- %TYPE
-- 테이블 컬럼 자료형을 참조하는 자료형
-- %ROWTYPE
-- 테이블 스키마와 같은 구조체변수
-- 사용자 정의 구조체 변수
TYPE 구조체명 IS RECORD
(
컬럼 타입
,컬럼 타입
);
-- IF 조건 THEN (값 혹은 실행문)
ELSIF 조건 THEN (값 혹은 실행문)
ELSE (값 혹은 실행문)
END IF 문
TRUE면 THEN과 ELSE사이의 문장을 수행하고 FALSE나 NULL이면 ELSE와 END IF사이의 문장을 수행한다.
-- WHILE 조건 LOOP ~ END LOOP
제어 조건이 TRUE인 동안만 일련의 문장을 반복하기 위해 WHILE LOOP문장을 사용한다.
--1부터100까지 합
DECLARE
n NUMBER :=0;
s NUMBER :=0;
BEGIN
WHILE n<100 LOOP --LOOP는 자바의 괄호를 나타내는것과 똑같다.
n:=n+1;
s:=s+n;
END LOOP; -- while문 끝
DBMS_OUTPUT.PUT_LINE('결과:'||s);
END;
/--sqlplus 에서 실행하라는 의미
--1부터 100까지합과 홀수합
DECLARE
n NUMBER :=0;
s1 NUMBER :=0;
s2 NUMBER :=0;
BEGIN
WHILE n<100 LOOP
n:=n+1;
IF MOD(n,2)=0 THEN
s1:=s1+n;
ELSIF MOD(n,2)=1 THEN
s2:=s2+n;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE('결과:'||s1);
DBMS_OUTPUT.PUT_LINE('결과:'||s2);
END;
/
--구구단
DECLARE
n NUMBER :=1;
m NUMBER :=0;
g NUMBER;
BEGIN
WHILE n<9 LOOP
n:=n+1;
DBMS_OUTPUT.PUT_LINE(n || '단');
m:=0;
WHILE m<9 LOOP
m:=m+1;
g:=n*m;
DBMS_OUTPUT.PUT_LINE(n || '*' || m || '=' || g);
END LOOP;
END LOOP;
END;
/
-- EXIT [WHEN condition];
EXIT 문을 이용하면 END LOOP 문 다음 문으로 제어를 보내기 때문에 루프를 종료할 수 있다.
-- LOOP ~ END LOOP
반복문으로 "EXIT WHEN 조건"이 실행문 앞과 뒤 어느 곳이나 위치할 수 있으며 "EXIT WHEN 조건"에서 조건을 만족하면 빠져 나간다.
-- LOOP 문(무한반복)
DECLARE
n NUMBER :=0;
s NUMBER :=0;
BEGIN
LOOP
n:=s+1;
s:=s+n;
EXIT WHEN n=100; -- n이 100이면 LOOP를 빠져나감
END LOOP;
DBMS_OUTPUT.PUT_LINE('결과:'||s);
END;
/
-- FOR ~ LOOP 문
FOR 변수 IN [REVERSE] 시작수 .. 끝낼수 LOOP
실행문;
END LOOP;
FOR 에서 사용되는 변수는 자동 선언되므로 따로 선언하지 않아도 됨
"시작수"에서 1씩 증가하여 "끝날 수"가 될 때까지 반복 수행하며, FOR문에 사용되는 변수는 자동 선언되므로 따로 선언할 필요가 없다.
REVERSE : "끝날수"에서 "시작수"까지 반복함으로써 인덱스가 1씩 감소되도록 한다.
--1부터 100까지합
DECLARE
s NUMBER :=0;
BEGIN
FOR n IN 1..100 LOOP
s:=s+n;
END LOOP;
DBMS_OUTPUT.PUT_LINE('결과:' || s);
END;
/
-- 10부터 1까지 순서대로 출력
DECLARE
BEGIN
FOR n IN REVERSE 1..10 LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(n));
END LOOP;
END;
/
-- FOR 를 이용한 SELECT 문
FOR 레코드이름 IN SELECT문 LOOP
실행문;
END LOOP;
-- insa 테이블에서 이름 부서 기본급여를 출력하라
DECLARE
BEGIN
FOR rec IN (SELECT * FROM insa) LOOP
DBMS_OUTPUT.PUT_LINE(rec.name || ' ' || rec.buseo || ' ' || rec.basicpay);
END LOOP;
END;
/
--SELECT 문의 결과를 한행씩 rec라는 레코드 변수에 전달하여 모든 결과를 확인 할 수 있다.
--FOR 문에 사용하는 SELECT 문은 INTO절을 갖지 않는다.
-- PL/SQL 에서 일반적인 SELECT 문형식
-- SELECT 컬럼, 컬럼 INT
'오라클' 카테고리의 다른 글
프로시져의 SYS_REFCURSOR 예제 (0) | 2013.06.05 |
---|---|
프로시져(Stored Procedure) (0) | 2013.06.04 |
트랜잭션 (0) | 2013.06.04 |
inline view (또는 subquery), WITH (0) | 2013.06.03 |
데이터 삭제 (0) | 2013.06.01 |