PLT 6 . 3 PL / SQL 블록 PL / SQL 은 프로그램 을 논리 적 인 블록 으로 나누 게 하 는 구조 화 된 블록 언어 이 다 . PL / SQL 블록 에서 사용 하 는 변수 는 블록 에 대해 논리 적 으로 선언 할 수 있 고 사용 할 수 있 다 . 변수 들 과 그 외 의 식별자 를 참조 하 고 선언 함 으로써 PL / SQL 블록 내 에서 값 을 저장 하 고 변경 할 수 있 는 논리 적 인 단위 이 다 . PL / SQL 블록 구문 과 지침 PL / SQL 은 SQL 의 확장 이 기 때문 에 SQL 에 적용 하 는 일반 적 인 구문 은 PL / SQL 언어 에 대해서 도 적용 가능 하 다 . 문장 은 몇 라인 이상 계속 될 수 있 습니다 . 문법 적 인 요소 는 공백 으로 분리 될 수 있 습니다 . 식별자 식별자 는 상수 , 변수 , 예외 , 커서 , 커서 변수 , SUBPROGRAM , 패키지 를 포함 하 는 PL / SQL 프로그램 항목 과 요소 를 명명 하 기 위해 사용 됩니다 . 식별자 는 30 문자 까지 포함 할 수 있 지만 알파벳 문자 로 시작 해야 합니다 . 블록 에서 사용 된 테이블 의 열 이름 과 동일 한 이름 으로 식별자 를 사용 할 수 없 습니다 . PL / SQL 식별자 가 동일 SQL 명령 에 있 고 열 로 동일 이름 을 가지 고 있 다면 , 이때 ORACLE 은 참조 중 인 열 로 간주 합니다 . 예약어 는 더블 인용 부호 에 둘러싸여 있 지 않 으면 식별자 로서 사용 될 수 없 습니다 . 예약어 는 읽 기 쉽 도록 대문자 로 사용 합니다 . 구분 문자 구분 문자 는 PL / SQL 에 대한 특수 한 의미 를 가지 는 단순 상징 이 거나 혼합 상징 입니다 . 단순 상징 혼합 상징 기호 의 미 기호 의 미 + 덧셈 연산자 <> 관계 형 연산자 - 뺄셈 연산자 ! = 관계 형 연산자 * 곱셈 연산자 || 접속 연산자 / 나눗셈 연산자 -- 단일 라인 주석 지시 자 = 관계 형 연산자 / * 주석 구분 문자 시작 @ 원격 액세스 지시 자 */ 주석 구분 문자 종료 ; 문장 종결자 : = 지정 연산자 ( 치환 연산자 ) LiteralLiteral 은 식별자 ( identifier ) 로 표현 되 지 않 은 숫자 , 문자 , 문자열 , BOOLEAN 값 입니다 . 문자 Literal 은 PL / SQL 문자 집합 내 에서 인쇄 가능 한 모든 문자 를 포함 합니다 . 숫자 Literal 은 단순 값 ( 예 : - 32 . 5 ) 또는 과학 적 인 표기법 주석 코드 주석 코드 각 단계 를 문서 화 하 고 디버깅 을 돕 기 위해 코드 에 주석 을 기술 합니다 . 주석 이 단일 라인 에 있 으면 두 개 의 대쉬 ( --) 을 기술 하 면 – 뒤 에 기술 된 것 은 주석 으로 인식 하 고 , 주석 범위 가 여러 줄 이 라면 기호 / * 와 */ 사이 에 주석 을 기술 한다 . 주석 은 철저 하 게 정보 를 제공 해야 하 고 기능 적 인 논리 또는 데이터 에 대한 어떤 조건 또는 기능 을 강요 해서 는 안 됩니다 . 좋 은 주석 은 읽 기 쉽 게 하 고 코드 유지 를 위해 매우 중요 합니다 . PL / SQL 에서 SQL 함수 SQL 에서 이용 가능 한 대부분 의 함수 는 PL / SQL 표현식 에서 도 유효 합니다 . 단일 행 숫자 함수 단일 행 문자 함수 데이터 형 변환 함수 데이트 함수 그 밖 의 함수 아래 함수 는 절차 적 인 문장 에서 는 사용 불 가능 합니다 . GREATEST , LEAST , DECODE . 그룹 함수 ( AVG , MIN , MAX , COUNT , SUM , STDDEVE , VARIANCE ) 는 테이블 에서 행 그룹 에 적용 되 므로 PL / SQL 블록 에 있 는 SQL 문장 에서 만 이용 가능 합니다 . V _ total : = SUM ( number _ table ) ; -- Error 가 발생 한다 . 데이터 형 변환 PL / SQL 은 데이터 형 이 문장 에서 혼합 되 었 다면 동적 으로 데이터 형 변환 을 시도 합니다 . 예 를 들 면 NUMBER 값 을 CHAR 변수 가 지정 되 었 다면 그것 이 CHAR 변수 에 저장 될 수 있 도록 하 기 위해 PL / SQL 은 동적 으로 숫자 를 문자 로 변환 합니다 . 문자 표현 을 숫자 값 으로 나타내 는 역 의 상황 도 적용 됩니다 . DATE 변수 에 대해 문자 값 을 지정 할 수 있 고 역 의 상황 도 적용 됩니다 . 혼합 된 데이터 형 이 표현식 에서 생성 되 면 데이터 를 전환 하 기 위해 해당 변환 함수 를 사용 하 여야 합니다 . PL / SQL 은 가능 한 한 데이터 형 변환 을 시도 하 지만 성공 은 수행 중 인 작업 에 달려 있 다 . 명시 적 으로 데이터 의 형 변환 을 시도 하 는 것 은 상당히 성능 에 영향 을 미치 고 소프트웨어 버전 이 변경 되 더라도 유효 하 게 유지 될 수 있 기 때문 에 좋 은 프로그램 이 될 수 있 다 . 데이터 형 변환 함수 의 종류 TO _ CHAR ( value , format ) TO _ DATE ( value , format ) TO _ NUMBER ( value , format ) 중첩 블록 과 변수 범위 문장 은 실행 명령 이 허용 하 는 곳 어디 에서 든지 중첩 될 수 있 습니다 . 중첩 블록 은 하나 의 문장 이 됩니다 . 예외 섹션 에서 도 중첩 블록 을 사용 할 수 있 습니다 . 객체 범위 는 객체 를 참조 할 수 있 는 프로그램 영역 입니다 . 선언 된 변수 를 실행 섹션 에서 참조 할 수 있 습니다 . 한정 시키 지 않 은 변수 는 참조 할 수 있 는 영역 에서 변수 를 참조 가능 합니다 . - 블록 은 둘러싸 는 블록 을 참조 할 수 있 습니다 . - 블록 은 둘러싸인 블록 을 참조 할 수 없 습니다 . DECLARE x NUMBER ; y NUMBER ; BEGIN x : = 1 ; y : = 2 ; -- 이곳 에서 x , y 의 값 은 x : = 1 , y : = 2 DECLARE y NUMBER ; z NUMBER ; BEGIN -- 이곳 에서 x , y , z 의 값 은 x : = 1 , y : = NULL , z : = NULL x : = 3 ; y : = 4 ; z : = 5 ; -- 이곳 에서 x , y , z 의 값 은 x : = 3 , y : = 4 , z : = 5 END ; -- 이곳 에서 x , y , z 의 값 은 x : = 3 , y : = 2 , z 는 참조 불 가능 하 다 . END ;/ PL / SQL 에서 연산자 연산자 는 논리 , 산술 , 연결 , 연산 제어 명령 인 괄호 , 지수 연산자 가 있 다 . 우선 순 위연 산 자설 명 1 **, NOT 지수 승 , 논리 부정 연산자 2 +, - 식별 , 부정 연산자 3 *, / 곱셈 , 나눗셈 연산자 4 +, - , || 덧셈 , 뺄셈 , 연결 연산자 5 =,!=,,=, IS NULL , LIKE , BETWEEN , IN 비교 연산자 6 AND 논리곱 7 OR 논리합 DECALRE v _ cnt NUMBER : = 0 ; v _ eq BOOLEAN ; v _ valid BOOLEAN ; BEGIN V _ cnt : = v _ cnt + 1 ; v _ eq : = ( v _ n 1 = v _ n 2 ) ; v _ valid : = ( v _ empno IS NOT NULL ) ; END ;/ NULL 로 작업 할 때 아래 규칙 을 명심 함 으로써 몇 가지 일반 적 인 실수 를 피할 수 있 습니다 . 관계 연산자 로 NULL 을 비교 하 면 항상 NULL 이 됩니다 . NULL 에 논리 연산자 NOT 을 적용 하 면 항상 NULL 이 됩니다 . 조건 제어 문장 에서 조건 이 NULL 이 되 면 관련 된 문장 은 실행 되 지 않 습니다 . 프로그래밍 지침 사항 PL / SQL 블록 을 개발 할 때 명확 한 코드 생성 과 유지 를 경감 하 기 위하 여 프로그래밍 지침 을 수행 합니다 . 코드 규약 범 주대 소문자 규약 사용 예 SQL 명령어 대문자 SELECT , INSERT , UPDATEPL / SQL 키워드 대문자 DECLARE , BEGIN , END 데이터 형 대문자 NUMBER , VARCHAR 2 , CHAR 식별자 와 매개변수 소문자 v _ sal , v _ ename , v _ job 데이터베이스 테이블 과 열 명 소문자 emp , dept , salgrade 코드 명 지정 규약 식별자 명명 규약 사용 예 변수 v _ namev _ sal 상수 c _ namec _ company _ name 커서 name _ cursuremp _ cursor 예외 e _ namee _ too _ many 테이블 형 name _ table _ typeamount _ table _ type 테이블 name _ tableorder _ total _ table 레코드 형 name _ record _ typeemp _ record _ type 레코드 name _ recordcustomer _ recordSQL * Plus 치환 매개변수 p _ namep _ salSQL * Plus 전역 변수 g _ nameg _ year _ sal 코드 들여쓰기 명확성 을 위해 또는 읽 기 쉽 도록 하 기 위해 코드 를 각 단계 별 로 들여 씁니다 . 구조 를 보여 주 기 위해 Carriage return 을 사용 합니다 . DECLARE v _ deptno emp . deptno % TYPE ; BEGIN SELECT deptno INTO v _ deptno FROM emp WHERE empno = 7788 ; IF v _ deptno IN ( 10 , 20 ) THEN UPDATE emp SET sal = 3500 WHERE empno = 7788 ; ELSE UPDATE emp SET sal = 2500 WHERE empno = 7788 ; END IF ; END ;/ 공유 하 기 글 요소