일단 이클립스에 JDBC를 설계하기 위해서는 데이터를 받아올 테이블을 생성해야 하는데요. 오라클과 클라이언트 툴이 설치되어 있다고 가정했을 때 다음과 같은 구문으로 테이블을 생성합니다.
참고로 다음 예제 코드들은 해당 강의를 참조하여 작성했습니다.
-- 유저 테이블 create table users ( userid varchar2(50) primary key, username varchar2(50) not null, userpassword varchar2(100) not null, userage number(3) not null, useremail varchar2(50) not null ); -- 게시판 테이블 create table boards ( bno number primary key, btitle varchar2(100) not null, bcontent clob not null, bwriter varchar2(50) not null, bdate date default sysdate, bfilename varchar2(50) null, bfiledata blob null );
다음은 CREATE SEQUENCE SEQ_BNO NOCACHE;
구문을 실행하는데, 이 구문은 boards 테이블의 bno가 추가될 때마다 일렬번호(sequence)를 붙여준다고 하네요.
그 다음 어카운트 테이블을 생성해 줍니다.
create table accounts ( ano varchar(20) primary key, owner varchar(20) not null, balance number not null ); -- 테이블을 생성한 뒤 어카운트 두 개를 생성해 줍니다. insert into accounts (ano, owner, balance) values ('111-111-1111', 'Re_Go', 5000000); insert into accounts (ano, owner, balance) values ('222-222-2222', '박종민', 20000000); commit;
이 다음 새로운 사용자의 정보를 저장하는 user-create 프로시저를 생산해 주는데요. 여기서 짧게 프로시저에 대해 설명을 해보자면
프로시저란 DB(data server)에 저장되어있는, 일련의 작업을 수행하는 sql 코드의 집합을 의미하는데요. 한마디로 표현하자면 sql의 함수 같은 개념인데요.
이러한 프로시저는 오라클에서 다음과 같이 표현되며, 각각 구문의 뜻은 다음과 같습니다.
- CREATE PROCEDURE : 프로시저 생성 구문
- OR : '또는' 을 의미하는 구문
- REPLACE : 프로시저나 테이블을 대체하는 구문
- IN : 해당 테이블의 속성의 데이터타입을 토대로 매개변수에 전달할 때 사용됩니다. 즉 해당 프로시저로 데이터를 생성할 때 어떤 테이블의 속성 타입으로 입력할지를 의미합니다.
- OUT : IN과 반대로 생성이 끝날 때 출력(OUT)되는 문구를 지정합니다.
- IS : 프로시저와 함수가 구분되는 기준점이라고 보시면 됩니다.
- BEGIN : 프로시저나 함수가 시작되는 기준점 입니다.
- END : 프로시저나 함수가 종료되는 기준점 입니다.
CREATE OR REPLACE PROCEDURE procedure_name ( parameter1 IN datatype, parameter2 OUT datatype ) IS BEGIN -- 프로시저 내부에서 수행할 SQL 문장들; END procedure_name;
그럼 위의 기본 프로시저 구문을 토대로 아래의 프로시저 정의를 해석해 보겠습니다.
-- user_create 프로시저를 대체하거나 없을 경우 새로 생성 CREATE OR REPLACE PROCEDURE user_create ( -- 각각의 매개변수에는 users의 다음 속성들의 타입을 전달하도록 함. a_userid IN users.userid%TYPE, a_username IN users.username%TYPE, a_userpassword IN users.userpassword%TYPE, a_userage IN users.userage%TYPE, a_useremail IN users.useremail%TYPE, -- (pls는) 오라클의 정수형 데이터 타입 a_rows OUT PLS_INTEGER ) IS -- 함수 실행점 BEGIN -- users 테이블의 다음 속성에 값을 넣음 INSERT INTO users (userid, username, userpassword, userage, useremail) -- 넣을 값들은 프로시저에서 설정한 매개변수의 값들로 구성) VALUES (a_userid, a_username, a_userpassword, a_userage, a_useremail); -- a_rows(출력값)으로 실행된 sql의 가로 구문수를 출력 a_rows := SQL%ROWCOUNT; COMMIT; END;
참고로 프로시저는 다음 이미지와 같이 앞서 설명한대로 변수 선언 (DECLARE)와 함수 정의 (BEGIN과 END 사이)로 구성됩니다.
(자료 출처 : https://shlee1990.tistory.com/836)
다음은 user_login 함수를 생성하는데요. 여기서도 마찬가지로 sql의 함수 생성법에 대해 짧게 설명해 보겠습니다. 구문은 다음과 같습니다.
- FUNCTION : 함수를 생성할 때 사용되는 키워드 입니다. (이하 CREATE 및 REPLACE문은 생략)
- 매개변수 | 데이터타입 : 프로시저의 변수 타입 지정과 다르게 IN, OUT 키워드를 사용하지 않고 지정합니다.
- RETURN 반환타입 : 함수의 반환값 타입을 지정합니다.
- IS : 프로시저와 함수의 영역을 나누는 기준점으로 사용되며, AS 키워드 또한 같은 역할을 수행합니다.
- 변수 | 데이터타입 : 함수 내에서 사용할 지역 변수들을 지정할 때 사용합니다.
- BEGIN, END : sql 내에서 특정 함수나 프로시저가 sql 구문으로 작성되는 시작점과 종료점을 의미합니다.
- RETURN 반환값 : 반환할 함수의 실행 결과값을 지정합니다.
CREATE OR REPLACE FUNCTION 함수이름 ( 매개변수1 데이터타입, 매개변수2 데이터타입, ... ) RETURN 반환타입 IS 변수1 데이터타입; 변수2 데이터타입; BEGIN -- 함수 본문: 수행할 작업을 여기에 작성합니다. RETURN 반환값; -- 반환값은 반환타입과 일치해야 합니다. END;
참고로 함수 또한 프로시저와 같이 다음 이미지와 같이 앞서 설명한대로 변수 선언 (DECLARE)와 함수 정의 (BEGIN과 END 사이)로 구성됩니다.
이제 위의 기본 함수 구문을 토대로 아래의 함수 정의를 해석해 보겠습니다.
-- user_login 함수 정의 (유저 아이디와 패스워드, 리턴값의 타입 지정) CREATE OR REPLACE FUNCTION user_login ( a_userid users.userid%TYPE, a_userpassword users.userpassword%TYPE ) RETURN PLS_INTEGER IS -- 함수 내 사용할 지역 변수인 유저 패스워드와 결과(result) 지정 v_userpassword users.userpassword%TYPE; v_result PLS_INTEGER; --함수 구문 시작 BEGIN -- users 테이블에서 사용자가 전달한 매개변수 id(a_userid)와 테이블의 userid의 값이 같은 열의 userpassword를 검색 후 함수의 지역 변수 패스워드(userpassword)에 할당합니다. SELECT userpassword INTO v_userpassword FROM users WHERE userid = a_userid; -- 만약 지역 변수인 v_userpassword의 값과 a_userpassword (사용자가 넘겨준 매개 변수 패스워드) 가 일치하면 0 (일치함)을 반환, 틀리면 1 (불일치)를 반환 IF v_userpassword = a_userpassword THEN RETURN 0; ELSE RETURN 1; -- IF문을 끝낼때는 END IF; 구문을 꼭 삽입해야 합니다. END IF; -- 예외 발생 구문으로 NO_DATA_FOUND는 SELECT INTO 구문을 실행하다 데이터 검색에 실패했을때 발동되며, 2 (예외 발생)를 반환합니다. EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 2; -- 함수 종료 지점 END;