PL/SQL (Procedual Language SQL)
단순 스크립트에서 실행되는 블록(이름이 없음)
저장 불가(검증용으로 사용됨)
pl/sql의 기본 구조
(사용형식)
DECLARE
선언부: --변수, 상수, 커서 선언
BEGIN
실행부: --문제해결을 위한 비지니스로직 처리 SQL문
[EXCEPTION
예외처리부;]
END;
사용예) 키보드로 부서번호를 입력 받아 해당부서의 주소, 인원수, 평균급여를 출력하는 익명블록을 작성하시오
ACCEPT P_DEPT_NO PROMPT '부서코드 입력(10-110) : ' --입력받은 것을 P_DEPT_NO에 저장
DECLARE
V_DEPT_NO HR.DEPT.DEPARTMENT_ID%TYPE := TO_NUMBER('&P_DEPT_NO');--'&'는 변수에 있는 값을 참조할때 사용하는 기호(''안에 써야하며 이는 문자열)
--무슨 타입으로 선언됐는지는 모르지만 컬럼명을 알때 변수를 선언한 것 HR.DEPT.DEPARTMENT_ID%에 같은 TYPE으로 있는 V_DEPT_NO을 선언해주세요(참조타입)
V_CNT NUMBER:=0;
V_ASAL NUMBER:=0;
V_ADDR VARCHAR2(200);
--지역변수라 초기화 했다고 생각(NUMBER는 더욱 초기화 해줘야함) / 초기화하지 않으면 NULL이 자동으로 들어가고 결과값은 나오지 않음
BEGIN --BEGIN안에서만 SELECT, FROM, INTO가 쓰임
SELECT A.STREET_ADDRESS||' '||A.CITY||' '||A.STATE_PROVINCE
INTO V_ADDR --V_ADDR에 자동으로 할당
FROM HR.LOCATIONS A, HR.DEPT B
WHERE A.LOCATION_ID=B.LOCATION_ID
AND B.DEPARTMENT_ID=V_DEPT_NO;
SELECT COUNT(EMPLOYEE_ID),--1
ROUND(AVG(SALARY))--2
INTO V_CNT, V_ASAL--1,2할당
FROM HR.EMP
WHERE DEPARTMENT_ID = V_DEPT_NO;
DBMS_OUTPUT.PUT_LINE('부서번호 : '||V_DEPT_NO); --LINE: 줄바꿈
DBMS_OUTPUT.PUT_LINE('주소 : '||V_ADDR);
DBMS_OUTPUT.PUT_LINE('인원수 : '||V_CNT);
DBMS_OUTPUT.PUT_LINE('평균급여 : '||V_ASAL);
END;
1) 변수와 상수
IF V_CNT = 0 THEN -- V_CNT값이 0이면
V_CART_NO:='2005072900001'; -- 카트 번호 만들기
ELSE--그렇지 않다면(값이 이미 존재한다)
SELECT CART_NO INTO V_CART_NO --구매 이력이 있는지 없는지 확인(있으면 UPDATE 없으면 INSERT작성)
FROM CART
WHERE CART_MEMBER = 'h001'
AND SUBSTR(CART_NO,1,8)= '20050729'
AND CART_PROD = 'P202000012';
END IF;--V_CART가 널과 널이 아닌경우 V_CNT값이 NULL 이거나 아닌경우
IF V_CART_NO IS NULL THEN --V_CART_NO값이 NULL인 경우(날짜와 제품을 사지 않았을 경우)
INSERT INTO CART
SELECT 'h001', MAX(CART_NO)+1,'P202000012',2
FROM CART
WHERE CART_NO LIKE '20050729%'
--왜 조건을 부여했을까.. 20050729이 날에 CART번호가 증가해야됨 그러려면 20050729로 시작되어지는 CART번호 중에 가장 큰것 부여
ELSIF V_CNT !=0 THEN --NULL이 아닌경우 , 1이 아닌 경우
UPDATE CART
SET CART_QTY:=CART_QTY+2--원래 삿던거에 2더해줌
WHERE CART_MEMBER = 'h001'
AND SUBSTR(CART_NO,1,8)= '20050729'
AND CART_PROD = 'P202000012';
ELSIF V_CNT =0 THEN --1이면 신규 등록
INSERT INTO CART
VALUES('h001',V_CART_NO,'P202000012',2)
END IF;
END;
SELECT *