728x90
반응형
PL/SQL (ORACLE'S PROCEDURAL LANGUAGE EXTENSION TO SQL) |
|
- 오라클 자체에 내장되어 있는 절차적 언어 (PROCEDURAL LANGUAGE)로서, SQL의 비절차적 언어의 단점을 보완, 확장한 언어 - SQL문장에서 변수 정의, 조건(IF), 반복(LOOP, WHILE, FOR) 처리 등을 지원 - 블록(BLOCK) : PL/SQL 프로그램의 기본 단위 - 데이터에 대한 조작을 SQL만으로 처리하는데 한계가 있는 경우, DB안에서 데이터 값에 대한 처리를 하고 싶은 경우 (함수-리턴값o, 프로시저-리턴값x, 트리거 등) 사용 |
|
1. 절차적 언어 - 개발자가 처리 절차(순서, 방법)을 처음부터 끝까지 정해야함 2. 비절차적 언어 - 개발자가 처리절차를 지정하지 않고 원하는 결과를 정의하여 요청 |
|
구성 - DECLARE(선언부) : 기술선택, 실행에 사용될 변수, 상수,커서 등을 선언 - BEGIN(실행부) ~ END : 기술필수, 조건문,반복문,SELECT, DML,함수 등을 정의 - EXCEPTION(예외 처리부) : 기술선택, PL/SQL 실행 도중 발생하는 오류 (예외상황)를 해결하는 문장 서술 |
|
PL/SQL 작성 주의사항 | |
1. PL/SQL 블록을 구성하는 DECLARE, BEGIN ~ [;] END, EXCEPTION 키워드에는 세미콜론(;)을 사용하지 않는다. (단, BEGIN문 안에 기술하는 SQL명령문에는 세미콜론을 사용해야 한다.) 2. PL/SQL블록의 각 부분에서 실행해야 하는 문장 끝에는 세미콜론 (;)을 사용. ex) DBMS_OUTPUT.PUT_LINE('HELLO.PL/SQL !' ) ; 3. SQL에서와 마찬가지로 PL/SQL내부에서도 주석 사용가능 - 한 줄 주석 : -- - 여러 줄 주석 : /* 주석내용 */ 4. PL/SQL문 작성을 마치고 실행하기 위해 마지막에 슬래시(/)를 사용(SQLDeveloper에서는 생략 가능) 5. 선언조건 (권장) - 변수 : 변수 앞에 v를 붙여 준다. variable 약자 - 상수 : 상수 앞에 c를 붙여 준다. constant 약자 - 매개변수 : 매개변수 앞에 p를 붙여 준다. parameter 약자 |
익명블록(ANNOYMOUS BLOCK) 형식 |
|
: 이름없이 선언된 PL/SQL문 | DECLARE VEMPNO NUMBER(4); --NULL VENAME VARCHAR2(10);--NULL BEGIN VEMPNO := 7788; VENAME := 'SCOTT'; DBMS_OUTPUT.PUT_LINE('사번 / 이름'); DBMS_OUTPUT.PUT_LINE('----------'); DBMS_OUTPUT.PUT_LINE(VEMPNO || '/' || VENAME); END; |
SYNTAX [ DECLARE -- 선언부(DECLARE SECTION) 변수나 상수를 선언 ] BEGIN -- 실행부(EXECUTABLE SECTION) SQL문 --- ; 제어문, 반복문, 출력문 커서 사용 [ EXCEPTION -- 예외 처리부(EXCEPTION SECTION) ] END; |
|
BEGIN DECLARE var VARCHAR2(15); BEGIN VAR := '안녕 PL/SQL' ; DBMS_OUTPUT.PUT(var); DBMS_OUTPUT.PUT_LINE('hello PL/SQL'); END; DBMS_OUTPUT.PUT_LINE('바깥 BEGIN문 종료'); END; --DECLARE 선언부를 BEGIN 실행부 이내에 기술 시 BEGIN절을 중첩하여 사용가능 |
DBMS_OUTPUT |
|
- java의 System.out 객체와 유사 | DECLARE var VARCHAR2(15); BEGIN DBMS_OUTPUT.PUT_LINE('Hello Oracle~'); VAR := '안녕 PL/SQL' ; DBMS_OUTPUT.PUT(var||' '); DBMS_OUTPUT.PUT_LINE('hello'); DBMS_OUTPUT.NEW_LINE; DBMS_OUTPUT.PUT_LINE('PL/SQL'); END; |
DBMS_OUTPUT패키지는 문자열 출력을 위해 3가지 프로시저를 지원함 - PUT_LINE : 문자열을 출력한 다음 라인으로 이동. - PUT : 문자열을 출력한 후 대기. 반드시 다음 줄로 넘어갈 수 있는 무언가가 지정되어있어야 한다. - NEW_LINE : 다음 라인으로 이동. 매개인자값 입력x --System.out.printl()과 다르게 값을 입력해야 한다. |
|
SET SERVEROUTPUT ON |
|
- DBMS_OUTPUT이 정상 작동하도록 설정을 ON하는 기능 - SET SERVEROUTPUT ON을 기술해주지 않으면 출력결과를 확인하기가 어렵다. 단, SQLDeveloper에서는 생략가능 |
연산자 |
|
제곱연산자 : ** | ex)2**3 => 2의3승 |
부호연산자 : +(양수), -(음수) 식별 연산자 | |
산술연산자 : + (덧셈), -(뺄셈), *(곱셈), /(나눗셈몫) | |
논리연산자 - NOT (부정을 의미) - AND : 교집합을 의미 (둘 다 참인 경우만 참, 참 없이 둘 중 하나라도 FALSE인 경우 FALSE, TRUE가 존재하고 둘 중 하나라도 NULL이면 NULL) - OR : 합집합을 의미 (둘 중 하나라도 TRUE인 경우엔 TRUE, TRUE없이 NULL NULL, NULL FALSE조합이면 NULL) |
|
비교연산자 | |
=, <, >, <=, >=, <>, !=, ~=, \^= | |
BETWEEN 값1 AND 값2 | |
IN | |
LIKE | |
IS NULL IS NOT NULL |
데이터 타입 |
|
- 스칼라타입 : 숫자(NUMBER), 문자(CHAR, VARCHAR2), 날짜(DATE, TIMESTAMP), BOOLEAN 등 - 스칼라변수 : SQL자료형과 비슷하게 선언하는 변수를 말함. - DBMS_OUTPUT 출력문을 통해 출력가능(BOOLEAN제외) --ORACLE에서의 BOOLEAN자료형 --값 : TRUE, FALSE, NULL값을 가질 수 있다. (대소문자 섞어 사용 가능) --DBMS_OUTPUT으로 바로 값을 출력할 수 없다.(오류) |
변수 VARIABLE |
|
- 테이블의 컬럼 정의와 구조가 동일하다. | |
SYNTAX 변수명 자료형(데이터타입) ; 변수명 자료형(데이터타입) :=초기값; 변수명 자료형(데이터타입) [NOT NULL] [ :=초기값 ]; * := PL/SQL에서의 대입연산자 - 변수를 초기화 하지 않고 정의만 한 경우는 해당 변수에 NULL값이 지정된다. - 변수 정의시 NOT NULL이나 CONSTANT로 정의하여 변수의 데이터에 일부제약(CONSTRAINT) 사항을 정의할 수도 있다. - 초기값 대입없이 선언만 한 경우, 자료형 상관 없이 모두 NULL을 가짐 |
|
상수 CONSTANT |
|
- 한 번 값을 할당 받으면 변하지 않는 수 | |
SYNTAX 상수명 CONSTANT 자료형(데이터타입) : =상수값; *꼭 CONSTATNT 키워드를 붙여야 한다. **꼭 선언과 동시에 초기화도 해주어야 한다. |
변수, 상수
DECLARE -- 변수 선언 va INTEGER := 2**2*3**2; vb POSITIVE := 5; --0미포함 양수, 1이상의 양수, NULL가능 vc SIGNTYPE ; -- -1, 0, 1, NULL만 가능 vd NATURALN := 0; -- 0포함 양수, NULL불가 ce constant VARCHAR2(20) := '상수 테스트' ; BEGIN /* 여러줄 주석 : 실행부 DBMS_OUTPUT을 이용한 변수 값 출력 */ --에러 --Ce : '상수값 변경'; DBMS_OUTPUT.PUT_LINE('va = '||va||', vb = '||vb||', vc = ' ||vc|| ', vd = '||vd); DBMS_OUTPUT.PUT_LINE('va = '|| TO_CHAR(va)); DBMS_OUTPUT.PUT_LINE('상수 ce = '||ce); END;
va = 36, vb = 5, vc = , vd = 0 va = 36 상수 ce = 상수 테스트
반응형
DECLARE --테이블의 컬럼의 데이터타입과 일치시켜 주는 것이 좋다. 에러 예방 --스칼라 변수 선언 VEMPNO NUMBER(4); --NULL > VENAME VARCHAR2(10); --NULL > VDEPTNO NUMBER(2); --NULL > VDNAME VARCHAR2(14); --NULL > BEGIN --테이블 안의 데이터를 받아오는 경우 SELECT절 안에 INTO를 이용한다. --SELECT절 컬럼의 데이터타입, 개수, 순서와 --INTO절의 변수의 데이터타입, 개수, 순서가 일치해야한다. --SELECT절 출력값이 한 줄이여야 한다. SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME --변수 대소문자 구분 안 함. INTO vempno, vename, vdeptno, vdname FROM EMP E, DEPT D --[INNER JOIN] WHERE E.DEPTNO = D.DEPTNO AND E.ENAME ='SMITH'; --[JOIN조건] DBMS_OUTPUT.PUT_LINE('사번/이름/부서번호/부서명'); DBMS_OUTPUT.PUT_LINE('---------------------'); DBMS_OUTPUT.PUT_LINE(VEMPNO||'/'||VENAME||'/'||VDEPTNO||'/'||VDNAME); END;
사번/이름/부서번호/부서명 --------------------- 7369/SMITH/20/RESEARCH
728x90
반응형
'[ORACLE]' 카테고리의 다른 글
[ORACLE] IF ~ ELSIF~ ELSE조건문 (0) | 2024.01.25 |
---|---|
[ORACLE] REFERENCE TYPE - TYPE, ROWTYPE (0) | 2024.01.24 |
[ORACLE] 집합연산자 UNION, UNION ALL, INTERSECT, MINUS (0) | 2024.01.24 |
[ORACLE] MERGE (0) | 2024.01.23 |
[ORACLE] PSEUDO - ROWNUM (0) | 2024.01.23 |