본문 바로가기

DB

(52)
Oracle PL/SQL 프로시저 매개변수 타입 설명 IN 프로시저 안으로 호출 프로그램의 상수 값을 전달하는 매개변수를 선언하며 전달되는 값이 NULL일 경우 기본값(Default)을 설정할 수도 있음 OUT 호출 프로그램으로 프로시저의 결과 값을 전달하는 매개변수 선언 IN OUT 프로시저 안으로 호출 프로그램의 상수 값을 전달하고, 결과 값을 다시 호출 프로그램으로 전달하는 매개변수를 선언 IN 매개변수를 이용하여 입력받을 매개변수를 설정하고 해당 변수 이름으로 프로시저 내에서 사용하면 된다. IN값에 아무 값도 입력되지 않으면(NULL)기본값 으로 설정된다. OUT매개 변수는 프로시저를 실행하고 반환할 때 사용되는 변수 이름으로 IS절애서 별도의 선언없이 프로시저 내에서 해당 변수에 값을 입력하면 된다. CREATE OR REPL..
Oracle PL/SQL 프로시저 [데이터 타입 간 형 변환] 일부 데이터 타입의 경우 상호 데이터 타입 변환이 가능하다 가령 문자에서 숫자, 숫자에서 문자 ,문자에서 날짜 또는 날짜에서 문자 타입으로 변환이 가능하다. 형 변환 함수를 사용하여 명시적 으로 변환할 수 있으며 , 변경이 가능한 경우에 한해서 오라클에 의해 묵시적으로 자동 변환될 수도 있습니다. 그러나 가급적 올바른 데이터 타입을 선정하여 사용하도록 하고, 변환이 필요할 경우 명시적으로 선언하여, 개발자도 모르는 사이에 형 변환에 따른 문제가 발생하지 않도록 하는 것이 중요하다. DECLARE I_NUM_EMPNO NUMBER; I_VAR_EMPNO VARCHAR2(100); BEGIN --NUMBER형의 값을 VARCHAR2 형 변수에 입력 SELECT EMPNO INTO I_VAR_EMPNO FRO..
Oracle PL/SQL 프로시저[커서와FOR문] FOR 문은 커서와함께 또 다른 형태로 시용할수 있다. FOR 인덱스 IN [REVERS] 초기값..최종값 LOOP 처리문; END LOOP; 커서와 함께 사용될 경우 FOR 문 구문형식 FOR 레코드 IN 커서명(매게변수1.. ) LOOP 처리문; END LOOP; 해당커서의 패치가 끝나면 자동으로 LOOP 가 종료된다. 레코드는 테이블 로우 전체를 담아둘 수 있는 오라클 데이터 타입이다. DECLARE --커서선언 CURSOR cur_emp_dep (cp_department_id employees.department_id%TYPE) IS SELECT employee_name FROM employees WHERE department_id = cp_department_id BEGIN -- FOR 문을 통..
Oracle PL/SQL 프로시저 [ 커서] 커서란 특정 SQL 문장을 처리한 결과를 담고 있는 영역 (PRIVATE SQL 이라는 메모리 영역)을 가리키는 일종의 포인터로, 커서를 사용하면 처리된 SQL 문장의 결과 집합에 접근할 수 있다. SQL문은 집합적 언어이므로 임의의 SQL문이 처리된 결과의 로우수는 한개 이상이다. 커서의 종류에는 묵시적 커서와 명시적 커서가 있다. 묵시적 커서란 오라클 내부에서 자동으로 생성되어 사용하는 커서로 , PL/SQL 블록에서 실행하는 SQL 문장 (INSRT,UPDATE,MERGE,DELETE,SELECT INTO) 이 실행될 때마다 자동으로 만들어져 사용된다. 개발자 입장에서는 이러한 커서의 동작에 관여할 수는 없지만, 커서 속성을 이용하면 해당 커서에 대한 여러가지 정보를 얻어낼 수 있다. 반면 명시적 ..
Oracle PL/SQL 프로시저 [트랜잭션] 트랜잭션은 '거래' 라는 뜻으로 우리가 은행에서 입금과 출금을 하는 그 거래를 말한다. 일반 적인 프로그래밍 언어나 오라클에서 말하는 트랜잭션도 이 개념에서 차용한것이다. A란 은행에서 출금을 하여 B란 은행계죄에서는 돈이 빠져 나갔는데, 중간에 오류가 생겨서 B은행 계좌에 입금되지 않았다면 그렇다면 이 문제를 어덯게 처리 하면될까? 해결책은 거래 가 성공적으로 모두 끝난 후에야 이를 완전한 거래로 승인하고, 거래 도중 뭔가 오류가 발생햇을때는 이 거래를 아에 처음부터 없었던 거래로 되돌리는 것이다. 이렇게 하면 거래 도중에 발생하 오류에 대해 즉시 처리하지 못할지언정 최소한 금액손실은 발생하지 않는다. 거래 당사자 입장에서도 좀 귀찮기는 하지만 금액 손실이 발생하느니 다시 거래하는 것이 낫다. 이렇게 ..
Oracle PL/SQL 프로시저 [ 효율적인예외처리] 시스템 예외인 경우는 OTHERS 를 사용하자 미리 정의된 예외일 때는 예외명이 있어 EXCEPTION 절에 명시해 사용할수 있지만, 몇가지를 제외하고는 기억하기도 힘들고 사용하기가 번거롭다. 대신 OTHER는 모든 시스템 예외를 잡아내므로 OTHERS 와 SQLCODE, SQL ERRM을 적극 사용하자 예외처리 루틴을 모듈화 하고 발생된 예외 로그를 남기자 예외가 발생할때 SQLCODE나 SQLERRM 함수를 이용해 정확히 발생된 예외 정보를 상세히 알수 있다. 따라서 발생한 예외에 대한 로그 테이블을 만들어 예외가 생길 때마다 이 로그 테이블에 기록해 둔다면 관리하기 매우 편리할것이다. CREATE TABLE ERROR_LOG( ERROR_SEQ NUMBER, PROG_NAME VARCHAR2(80)..
Oracle PL/SQL 프로시저[사용자 정의예외처리] 사용자 정의 예외를 명시적으로, 즉 의도적으로 발생시키기 위해서 'RAISE_사용자_정의_예외명" 을 사용했다. 또한 사용자 정의 예외명 대신 미리 정의된 예외명을 명시해서 사용할 수도 있다. 즉 사용자 정의 예외명을 선언하고 미리 정의된 예외코드를 연결하거나 사용자 정의 예외를 선언하지 않고 바로 미리 정의된 예외를 발생시킬 수도 있다. 예를 들어 매개변수로 정수를 받아 처리하는 프로시저가 있는데 반드시 양수만 입력받아 처리해야 한다면 다음과 같이 INVALID_NUMBER 예외를 발생시킬 수 있다. create or replace PROCEDURE RAISE_TEST( P_NUM NUMBER) IS BEGIN IF P_NUM
Oracle PL/SQL[프로시저/예외처리] PL/SQL 코드를 작성할 떄 발생할 수 있는 오류에는 크게 두가지가 있다 하나는 문법 오류로써 객체 (테이블,뷰,함수,프로시저 등) 나 키워드 이름을 잘못 참조하거나 함수나 프로시저의 매개변수를 잘못 명시했을 때 발생되는 오류로, 이들은 컴파일할 때 걸러진다. 두 번째는 컴파일 때는 아무런 문제가 없으나 실행, 즉 런타임 때 로직을 처리하면서 발생하는 오류인데 이를 예외라고 한다. EXCEPTION WHEN 예외명1 THEN 예외처리 구문2 WHEN 예외명2 THEN 예외처리 구문2 WHEN OTHERS THEN 예외처리구문; 구문을 보면 CASE 문과 비슷한 구조임을 알 수 있다. 즉 처리할 예외명을 언급하고 그예외에 해당되면 예외처리 구문을 나열하는 식이다. WHEN 다음에 위치하는 예외명은 아무 ..