Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
PL/SQL KANG JOHYEON JOHYEON@KANGWON.AC.KR PL/SQL PL/SQL Procedural language extension to Structured Query Language(SQL) SQL을 확장한 순차적 처리 언어 SQL과 일반 프로그래밍 언어의 특성을 결합 조건문, 반복문 등을 선언해서 사용할 수 있음 DATABASE LABORATORY PL/SQL 기본 구조 기본 단위는 블록(block) 선언부 실행부 예외처리부 선언부 사용할 변수나 상수를 선언하는 부분 DECLARE를 사용해서 나타냄 실행부 실제 처리 로직을 담당하는 부분 선언된 변수에 값을 할당하거나 SQL문장을 사용하는 등 실제 로직을 처리 BEGIN으로 시작되어 END로 끝남 예외처리부 로직을 처리하던 중 발생할 수 있는 각종 오류들에 대해 처리하는 부분 EXCEPTION 키워드 사용 DATABASE LABORATORY PL/SQL 기본 구조 DECLARE counter INTEGER; BEGIN counter := counter +1; IF counter IS NULL THEN dbms_output.put_line(‘Result : COUNTER IS Null’); END IF; END; DATABASE LABORATORY PL/SQL 기본 구조 변수 선언은 ‘변수명 데이터타입‘ 형태로 선언 문장의 종료 시점에 세미콜론(;) 사용 값 할당에 ‘=‘ 가 아닌 ‘:=‘를 사용 IF … END IF EXCEPTION은 생략 가능 결과 메시지가 나오지 않을 경우, 첫번째 줄에 다음 명령어 입력 SET SERVEROUTPUT ON; DATABASE LABORATORY PL/SQL 예제 DECLARE counter INTEGER; i INTEGER; BEGIN FOR i IN 1..10 LOOP counter := (2*i); dbms_output.put_line(‘2*’ || i || ‘ = ‘ || counter); END LOOP; END; 실습 : 구구단 프로그래밍하기 DATABASE LABORATORY 예외처리부 DATABASE LABORATORY 예외처리부 EXCEPTION WHEN 예외1 THEN 예외처리1 WHEN 예외2 THEN 예외처리2 … WHEN OTEHRS THEN 예외처리 EXCEPTION 오라클에서 미리 정의된 내용 사용자가 직접 정의해서 사용할 수 있는 EXCEPTION DATABASE LABORATORY 예외처리부 예외 내용 예외 번호 SQLCOD E 발생시점 ACCESS_INTO_NULL ORA-06530 -6530 초기화 되지 않은 오브젝트에 값을 할당 COLLECTION_IS_NULL ORA-06531 -6531 초기화 되지 않은 중첩 테이블이나 VARRAY 같은 콜렉션을 EXISTS 외의 다른 메소드로 접근을 시도 DUP_VAL_ON_INDEX ORA-00001 -1 유일 인덱스가 걸린 컬럼에 중복 데이터를 입력 LOGIN_DENIED ORA-01017 -1017 잘못된 사용자나 비밀번호로 로그인 시도 NOT_LOGGED_ON ORA-01012 -1012 오라클에 연결되지 않은 경우 ZERO_DIVIDE ORA-01476 -1476 제수가 0일 때 발생 DATABASE LABORATORY 예외처리부 DATABASE LABORATORY 변수와 상수 변수 선언 emp_num1 NUMBER(9); grade CHAR(2); emp_num2 INTEGER := 1; 상수 선언 nYear CONSTANT INTEGER := 30; (o) nYear CONSTANT INTEGER; (x) DATABASE LABORATORY 변수와 상수 %TYPE 참조할 테이블에 있는 컬럼의 데이터 타입을 가져옴 변수명 테이블명.컬럼명%TYPE %ROWTYPE 하나 이상의 값에 적용 일반 변수에는 사용할 수 없다. 컬렉션이나 OBJECT 타입 변수에서만 사용 가능 DATABASE LABORATORY 레코드 배열 형태와 다르게 여러 개의 데이터 타입으로 구성될 수 있음 PL/SQL에서 사용하는 테이블 형태의 데이터 타입 구문형식 TYPE 레코드이름 IS RECORD (필드1 데이터타입1, 필드 2 데이터타입2,…) 레코드이름 테이블명%ROWTYPE; 레코드이름 커서명%ROWTYPE; DATABASE LABORATORY 레코드 member 테이블의 스키마 DATABASE LABORATORY 레코드 DATABASE LABORATORY IF 문 IF 조건 THEN 처리문; END IF; IF 조건 THEN 처리문 1; ELSE 처리문 2; END IF; IF 조건1 THEN 처리문 1; ELSIF 조건2 THEN 처리문 2; … ELSE 처리문 n; END IF; DATABASE LABORATORY IF 문 DATABASE LABORATORY CASE 문 DATABASE LABORATORY NULL 문 아무것도 처리하지 않겠다는 것을 나타낸다. DATABASE LABORATORY LOOP 문 LOOP 처리문장들… END LOOP; 간단하지만 내부에 처리문장만 나열한다면 무한루프에 빠진다. ‘EXIT;’ 을 사용해서 반복문을 종료하는 구문을 사용해야 한다. DATABASE LABORATORY LOOP 문 DATABASE LABORATORY WHILE-LOOP 문 WHILE 조건 LOOP 처리문장들; END LOOP; DATABASE LABORATORY FOR-LOOP FOR 카운터 IN [REVERSE] 최소값..최대값 LOOP 처리문장들; END LOOP; 카운터 값은 최솟값부터 시작해서 최대값까지 반복 루프를 1씩 증가하면서 실행 DATABASE LABORATORY FOR-LOOP DATABASE LABORATORY GOTO 문 해당 라벨로 바로 이동한다. DATABASE LABORATORY 커서(CURSOR) 쿼리에 의해 반환되는 결과는 메모리 상에 위치하게 되는데 커서(cursor)를 이용 하여 결과집합에 접근할 수 있음. 커서 선언 CURSUR 커서명 IS SELECT 문장; 커서 열기(open) OPEN 커서명; 패치(fetch) FETCH 커서명 INTO 변수…; 커서 닫기(close) CLOSE 커서명; DATABASE LABORATORY 커서(CURSOR) DATABASE LABORATORY 커서(CURSOR) %FOUND 커서가 막 오픈된 상태에서는 NULL 값을 반환한다. 오픈되고 첫 번째 패치가 발생한 이후부터는 TRUE 값을 반환하 며 더 이상 패치할 로우가 없을 경우 FALSE를 반환한다. %NOTFOUND 더 이상 패치(할당)할 로우가 없음을 의미한다. %FOUND와 반대 %ISOPEN 커서가 오픈된 상태일 경우 TRUE 값을 반환한다. %ROWCOUNT 카운터(counter) 역할을 한다. 커서가 막 오픈되었을 때에는 0, 패치될 때마다 1씩 증가한다. DATABASE LABORATORY 함수 오라클에서 제공하는 SQL 함수가 아닌 사용자 정의 함수를 말한다. CREATE OR REPLACE FUNCTION 함수명(파라미터1 데이터타입1,…) RETURN INTEGER IS 변수선언…; BEGIN 처리내용…; RETURN 리턴값; END; DATABASE LABORATORY 함수 DATABASE LABORATORY 함수 DATABASE LABORATORY 프로시저 특정한 처리를 수행하는 서브 프로그램 함수와 달리 값을 반환하지 않음 CREATE OR REPLACE PROCEDURE 프로시저명 (파라미터1 데이터타입, …) IS 변수선언부…; BEGIN 프로시저 본문처리…; EXCEPTION 예외처리…; END; DATABASE LABORATORY 프로시저 프로시저의 실행은 EXEC 또는 EXECUTE로 실행시킨다 DATABASE LABORATORY 과제 Member 테이블에 데이터를 수정, 삭제 할 수 있는 프로시저를 만드시오. Member 테이블에서 Email을 얻어오는 함수를 작성하시오 DATABASE LABORATORY