1.11 PL/SQL 블록 구조
SQL> accept g_one prompt 'Enter the first ename:'
variable g_compensation number;
declare
v_onesal number;
begin
select sal into v_onesal
from emp
where ename = UPPER('&g_one');
:g_compensation := v_onesal ;
end;
/
print g_compensation
문제) 이름을 넣으면 직업이 출력되게 위의 프로그램을 수정하시요 !!
SQL> set serveroutput on
SQL> ed p1.sql
declare
v_name varchar(20);
begin
select ename into v_name
from emp
where empno=&p_empno;
dbms_output.put_line('The first Name of the employee is ' || v_name);
end;
/
문제) 사원번호를 넣으면 부서번호가 출력되게 하시요 !!
2.6 Dbms_output
accept p_sal prompt 'Please enter the salary:'
accept p_comm prompt 'Enter the commission:'
variable g_compensation number
declare
v_sal number(9, 2) := &p_sal;
v_comm number(9,2) default & p_comm;
v_comm2 constant number := 1400;
begin
:g_compensation := v_sal *12 + nvl(v_comm, 0) + v_comm2 ;
end;
/
print g_compensation
문제) 이름을 넣으면 커미션을 출력하는데 커미션에 500을 더해서 출력하게하시요!
2.8 String Literals
set serveroutput on
declare
event varchar2(15);
begin
event := 'Father''s day';
dbms_output.put_line('3rd sunday in june is: ' || event );
event := q'[Mother 's day]';
dbms_output.put_line('2nd Sunday in May is : ' || event );
end;
/
문제) 아래와 같이 출력되게 위의 스크립트를 수정하시요 !!
3rd sunday in june is: Father's day
2nd Sunday in May is : brother's "birthday"
2.11 PL/SQL Variables
accept p_sal prompt 'Please enter the salary:'
accept p_comm prompt 'Enter the commission:'
variable g_compensation number
declare
v_sal number(9, 2) := &p_sal;
v_comm number(9,2) default & p_comm;
begin
:g_compensation := v_sal *12 + nvl(v_comm, 0);
end;
/
문제) 위의 스크립트를 수정하여 comm 에 어떠한 값이 들어가더라도 혹은 값이
안들어가더라도 무조건 comm 에 200 이 할당되게하라 !!
2.12 Not null Constraint
아래의 스크립트에서 틀린곳을 확인하시요 !!
accept p_sal prompt 'Please enter the salary:'
accept p_comm prompt 'Enter the commission:'
variable g_compensation number
declare
v_sal number(9, 2) := &p_sal;
v_comm number(9,2) not null ;
begin
:g_compensation := v_sal *12 + nvl(v_comm, 0);
end;
/
print g_compensation
2.19 Binary_float
set serveroutput on
declare
bf_var binary_float;
bd_var binary_double;
-- bf_var number;
-- bd_var number;
begin
bf_var := 270/35;
bd_var := 140/0.35;
dbms_output.put_line('bf: ' || bf_var );
dbms_output.put_line('bd: ' || bd_var );
end;
/
문제) 위의 datatype을 number 로 수행한후 결과를 비교해보아라 !
2.21 %TYPE Attribute
variable g_sal number;
declare
v_sal emp.sal%type :=0;
begin
select sal into v_sal
from emp
where empno = &empno;
:g_sal := v_sal;
end;
/
print g_sal
문제) 위의 스크립트를 수정하여 직업도 같이 출력되게하시요 !!
G_SAL
----------
3000
G_JOB
--------------------------------
SALESMAN
2.21 Boolean Variable
variable g_print varchar2(20)
declare
v_hire_date date :=
v_five_years boolean;
begin
if months_between(sysdate,v_hire_date)/12 > 5 then
v_five_years := true;
else
v_five_years := false;
end if;
if v_five_years = true then
:g_print := 'true';
else
:g_print := 'false';
end if;
end;
/
print g_print
문제) 위의 스크립트를 수정하여 이름을 넣었을 때 그 사원이 근무년수가 5년이상이면 True 가
출력되게하고 아니면 false 가 출력되게하라 !!
2.28 Bind Variables
variable emp_sal number
set autoprint on
begin
select sal into :emp_sal
from emp
where empno = &empno;
end;
/
문제) 위의 스크립트를 수정하여 사원이름을 넣으면 입사한 년도가 출력되게 하시요!!
EMP_HIREDATE
--------------
1982
2.31 Substitution Variables
set verify off
variable emp_salary number
accept p_empno prompt 'Please enter a valid empno number: '
set autoprint on
declare
v_empno number(6) := &p_empno;
begin
select sal into :emp_salary
from emp
where empno= v_empno;
end;
/
문제) 위의 스크립트를 수정하여 이름을 물어보게하는데 이름을 대문자로 입력하던
소문자로 입력하던 상관없이 월급이 출력되게하시요!!
3.8 SQL Function in PL/SQL
end accept p_ename prompt 'Please enter the ename: '
variable g_compensation varchar2(50)
declare
v_ename varchar2(20) := upper('&p_ename');
v_job varchar2(10) default 'SALESMAN';
begin
select job into v_job
from emp
where ename= v_ename;
:g_compensation := v_ename ||' is a ' || v_job ;
end;
/
print g_compensation
문제) 직업을 물어보게하고 직업을 넣었을 때 그 직업의 최대월급이 출력되게하라!
3.9 Data Type Conversion
아래의 결과가 출력되겠는가 ?
set autoprint on
variable total_salary number
declare
sal number(6) := 6000;
sal_hike varchar2(5) := '1000';
total_salary number(6);
begin
:total_salary := sal + sal_hike;
end;
/
print total_salary
3.13 Nested Blocks
아래의 결과가 출력되겠는가 ?
set serveroutput on
declare
outer_variable varchar2(20) := 'Grobal Variable';
begin
declare
inner_variable varchar2(20) := 'Local Variable';
begin
dbms_output.put_line(inner_variable);
dbms_output.put_line(outer_variable);
end;
dbms_output.put_line(outer_variable);
dbms_output.put_line(inner_variable);
end;
/
3.16 identifier
set serveroutput on
<<outer>>
declare
father_name varchar2(20) :='Patrick';
date_of_birth date :=
begin
declare
child_name varchar2(20) :='Mike';
date_of_birth date :=
begin
dbms_output.put_line('Father''s Name: '|| father_name);
dbms_output.put_line('Date of Birth: ' || outer.date_of_birth);
dbms_output.put_line('Child''s Name: '|| child_name );
dbms_output.put_line('Date of Birth: ' || date_of_birth);
end;
end;
/
문제) 위의 스크립트에서 outer를 빼면 어떻게 출력될것인가 ?
3.17 identifier
아래와 같이 수행하면 에러가 날것인가 수행될것인가 ?
set serveroutput on
<<outer>>
declare
v_sal number(7,2) := 60000;
v_comm number(7,2) := v_sal * 0.20;
v_message varchar2(255) ;
begin
<<inner>>
declare
v_sal number(7,2) := 50000;
v_comm number(7,2) := 0;
begin
v_message := 'clerk have not ' || inner.v_comm;
end;
v_message := 'SALESMAN and ' || v_message;
dbms_output.put_line(v_message);
end;
/
4.7 SELECT in PL/SQL
Variable salary number
declare
v_sum_sal emp.sal%Type;
Begin
select sum(sal) into v_sum_sal
from emp;
:salary := v_sum_sal;
End;
/
print salary
문제) 직업을 물어보게 하고 그 직업의 토탈월급이 출력되게하라 !! (p4-10 참조)
SQL> create sequence seq1;
DECLARE
v_empno emp.empno%TYPE;
BEGIN
SELECT seq1.NEXTVAL
INTO v_empno
FROM dual;
INSERT INTO emp(empno, ename, job, deptno)
VALUES (v_empno, 'HARDING', 'CLERK', 10 );
end;
/
문제) 위의 insert 문이 10번 반복되서 실행되서 수행되게 하시요 !!
4.7 update in PL/SQL
Accept p_job prompt 'Enter the job: '
DECLARE
v_sal_increase emp.sal%TYPE := 2000 ;
BEGIN
UPDATE emp
SET sal = sal + v_sal_increase
WHERE job = '&p_job';
END ;
/
문제) deptno 를 물어보게하고 deptno 를 넣으면 해당 부서번호인 사원들의
월급을 자기 월급의 2배로 갱신되게 하시요 !!
create table sports
(sp_code varchar2(3),
sp_name varchar2(30),
sp_stat varchar2(1) );
insert into sports values('IB1','SQUASH','Y');
insert into sports values('IB2','RACKETBALL','N');
insert into sports values('OB1','BASEBALL','Y');
insert into sports values('OB2','TENNIS','Y');
insert into sports values('OB3','SOCKER','Y');
insert into sports values('XN1','SWIMMING','Y');
insert into sports values('XB1','BASKETBALL','Y');
create table sport_inform
(sp_code varchar2(3) ,
sp_price number default 0,
sp_season varchar2(10),
sp_tel varchar2(20) );
insert into sport_inform values('IB1',100000,'SPRING','080-2134-2111');
insert into sport_inform values('OB1',200000,'SUMMER','080-2134-2111');
insert into sport_inform values('OB2',100000,'FALL','080-2134-2111');
update sports
set sp_stat='N'
where sp_code='IB1';
SQL> merge into sport_inform si
using sports s
on (s.sp_code=si.sp_code)
when matched then
update set si.sp_price=si.sp_price * 2
when not matched then
insert (si.sp_code, si.sp_season, sp_tel)
values(s.sp_code, 'N/A','114');
문제) soprt 테이블에서 status 가 활성화 되어있는 row만 가격을 두배로 갱신하고
없는 데이터는 입력하라 !!
4.22 implict Cursor
부서번호를 넣으면 해당 부서번호가 지워지게하고 몇 명이 지워졌는지 출력하시요 !
accept p_deptno prompt 'Enter the deptno: '
VARIABLE rows_deleted Varchar2(100)
DECLARE
v_deptno NUMBER := &p_deptno ;
BEGIN
DELETE FROM emp
WHERE deptno = v_deptno ;
:rows_delete d := (SQL%ROWCOUNT ||' rows deleted.');
END ;
/
print rows_deleted
문제) 직업을 넣으면 그 직업인 사원들의 월급을 자기 월급의 두배로 갱신되게하고
몇 명이 갱신되었는지 출력하시요 !!
5.7 if – then - else
accept p_age prompt 'Enter the your age: '
set serveroutput on
declare
myage number := &p_age;
begin
if myage < 11
then
dbms_output.put_line(' I am a child');
else
dbms_output.put_line(' I am not a child ');
end if;
end;
/
문제) 11살 이하면 I am a child , 11 살에서 20살 사이면 I am a young , 20살 이상이면 I am a old 라고 출력되게하시요 !!
5.10 Case Expression
declare
grade char(1) := upper('&grade');
appraisal varchar2(20);
begin
appraisal :=
case grade when 'A' then 'Excellent'
when 'B' then 'Very Good'
when 'C' then 'Good'
Else 'No such grade'
end;
dbms_output.put_line('Grade: ' || grade || 'Appraisal ' || appraisal);
end;
/
문제) 월급을 물어보게 하고 월급이 5000 이상이면 Excellent , 4000~ 5000 사이면 Very Good , 3000 ~ 4000 이면 good , 나머지 사원은 no such grade 라고 출력되게하시요 !!
5.13 Case Statement
accept p_deptno prompt 'Enter the deptno: '
set serveroutput on
declare
v_emp number;
v_deptno number := &p_deptno;
begin
case v_deptno when 10 then
select count(*) into v_emp from emp
where deptno=10;
when 20 then
select count(*) into v_emp from emp
where deptno=20;
when 30 then
select count(*) into v_emp from emp
where deptno=30;
end case;
dbms_output.put_line('employee''s number is ' || v_emp );
end;
/
문제) 직업을 물어보게하고 그 직업의 인원수가 출력되게하시요 !!
5.19 Basic
set serveroutput on
DECLARE
v_count NUMBER(2) := 0;
BEGIN
loop
v_count := v_count + 1;
dbms_output.put_line('count: '||to_char(v_count));
Exit When v_count = 10;
END LOOP;
END;
/
문제) dept 테이블의 deptno 컬럼에 51 번서부터 60번까지 숫자를 넣으시요
dname 은 SALES 로 넣으시고 LOC 는 washington 으로 넣으시요 !!
5.21 While
set serveroutput on
DECLARE
v_count NUMBER(2) := 0 ;
BEGIN
WHILE v_count < &p_max
v_count := v_count + 1 ;
dbms_output.put_line('count : '||to_char(v_count));
END
End;
/
문제) dept 테이블의 deptno 컬럼에 51 번서부터 60번까지 숫자를 넣으시요
dname 은 SALES 로 넣으시고 LOC 는 washington 으로 넣으시요 !!
5.22 For
set serveroutput on
DECLARE
v_count number(2) := 0;
BEGIN
for i in 1..10 loop
dbms_output.put_line('Cnt : ' ||to_char(i));
end loop;
End;
/
문제) dept 테이블의 deptno 컬럼에 51 번서부터 60번까지 숫자를 넣으시요
dname 은 SALES 로 넣으시고 LOC 는 washington 으로 넣으시요 !!
5.28 Nested Loops
set serveroutput on
Declare
x number(2) := 0;
y number(2) := 0;
z number(2) := 0;
BEGIN
<<Outer_loop>>
LOOP
x := x + 1;
y := 0;
EXIT WHEN x > 9 ;
dbms_output.put_line('==='||to_char(x)||' 단===');
<<Inner_loop>>
LOOP
y := y + 1;
EXIT Outer_loop WHEN x > 6;
EXIT WHEN y > 9 ;
z := x * y;
dbms_output.put_line(to_char(x)||' * '||to_char(y) || ' = ' || to_char(z));
END
END
END;
/
문제) 5단과 6단만 출력되게하시요 !!
6.7 Nested Loops
Set serveroutput on
declare
type emp_record is record
( empno number(10),
ename varchar2(10),
job varchar2(10) ) ;
v_emp emp_record;
BEGIN
SELECT empno, ename, job
INTO v_emp.empno, v_emp.ename, v_emp.job
FROM emp
WHERE empno = &p_empno;
DBMS_OUTPUT.PUT_LINE( '사원번호 : ' || v_emp.empno );
DBMS_OUTPUT.PUT_LINE( '사원이름 : ' || v_emp.ename );
DBMS_OUTPUT.PUT_LINE( '입 사 일 : ' || v_emp.job );
END;
/
문제) 부서번호를 넣으면 부서번호와 부서명과 부서위치가 출력되게하시요 !!
6.13 %Rowtype
문제) 위에서 수행한 문제를 %Rowtype 으로 변경하여 수행하시요 !!
6.14 Update by %Rowtype
accept p_empno prompt 'Enter The empno: '
declare
emp_rec emp%rowtype;
v_empno emp.empno%type := &p_empno;
begin
select * into emp_rec from emp
where empno= v_empno;
emp_rec.hiredate := sysdate;
update emp set row= emp_rec
where empno= v_empno;
end;
/
문제) 이름을 물어보게하고 이름을 넣으면 무조건 부서번호가 30번으로 커미션은 1500 ,
직업은 SALESMAN 으로 변경되게 하시요!!
6.23 Index by Table
set serveroutput on
declare
type emp_table_type is table of
hr.employees%rowtype index by pls_integer;
my_emp_table emp_table_type;
max_count number(3) := 104;
begin
for i in 100..max_count loop
select * into my_emp_table(i) from hr.employees
where employee_id= i;
end loop;
for i in my_emp_table.first..my_emp_table.last loop
dbms_output.put_line(my_emp_table(i).last_name);
end loop;
end;
/
문제) 위에서 102번의 last_name 만 출력하겠금 스크립트를 수정하시요.
6.24 Nested Tables
set serveroutput on
declare
type location_type is varray(4) of hr.locations.city%type;
offices location_type;
table_count number;
begin
offices := location_type('
table_count := offices.count();
for i in 1..table_count loop
dbms_output.put_line(offices(i) );
end loop;
end;
/
문제) Tokyo 부터 출력되게 위의 스크립트를 수정하시요 !!
6.26 Varray
문제) 위의 6.24 의 스크립트를 varray 로 수정하시요 !!
7.12 Fetch data
set serveroutput on
declare
v_empno emp.empno%type;
v_ename emp.ename%type;
cursor emp_cursor is
select empno, ename
from emp;
begin
open emp_cursor;
loop
fetch emp_cursor into v_empno, v_ename;
exit when emp_cursor%notfound or emp_cursor%rowcount > 5;
dbms_output.put_line(to_char( v_empno ) || ' ' || v_ename);
end loop;
close emp_cursor;
end;
/
문제) dept 테이블에서 loc 만 출력하는 커서문 작성 !!
7.14 Cursor and record
set serveroutput on
declare
cursor emp_cursor is
select empno, ename from emp
where deptno = 30;
begin
for emp_record in emp_cursor loop
dbms_output.put_line( emp_record.empno || ' ' ||emp_record.ename );
end loop;
end;
/
문제) 위의 스크립트를 7-16 을 보고 for loop 문으로 바꾸시요 !!
7.19 %Rowcount
문제) 7.12 스크립트를 수정하여 5개 이상일 때 loop 가 끝나겠금 하시요 !
7.20 for loop using subquery
accept p_deptno prompt 'enter the deptno: '
set serveroutput on
begin
for emp_record in ( select ename, deptno
from emp
where deptno=&p_deptno ) loop
dbms_output.put_line('Employee ' || emp_record.ename
|| ' works in the sales dept ' || emp_record.deptno);
end loop;
end;
/
문제) 직업을 넣으면 scott 의 직업은 clerk 입니다. 라고 출력되게하시요 !!
7.22 cursor with parameter
set serveroutput on
set verify off
declare
cursor emp_cursor (deptid number) is
select empno, ename
from emp
where deptno= deptid;
v_empno number;
v_ename varchar2(10);
begin
open emp_cursor(10);
loop
fetch emp_cursor into v_empno, v_ename;
exit when emp_cursor%notfound ;
dbms_output.put_line(to_char(v_empno) ||' ' || v_ename );
end loop;
close emp_cursor;
end;
/
문제) 위의 스크립트를 수정하여 부서번호를 물어보겠금 하시요 !!
7.25 where current of
create table univ
( name varchar2(10),
score number(10),
grade varchar2(10) );
insert into univ values('SCOTT1',91, null);
insert into univ values('SCOTT2',76 null);
insert into univ values('SCOTT3',47, null);
insert into univ values('SCOTT4',80, null);
insert into univ values('SCOTT5',96, null);
insert into univ values('SCOTT6',77, null);
insert into univ values('SCOTT7',34, null);
insert into univ values('SCOTT8',99, null);
insert into univ values('SCOTT9', 55, null);
insert into univ values('SCOTT11',75, null);
insert into univ values('SCOTT12',68, null);
insert into univ values('SCOTT13',98, null);
insert into univ values('SCOTT14',88, null);
insert into univ values('SCOTT14',66, null);
insert into univ values('SCOTT16',11, null);
declare
v_name univ.name%type;
v_score univ.score%type;
cursor univ_cur is
select name, score from univ FOR UPDATE;
begin
open univ_cur;
fetch univ_cur into v_name, v_score;
while univ_cur%found loop
if v_score >= 90 then
update univ
set grade = 'A'
where current of univ_cur;
elsif v_score >= 80 then
update univ
set grade = 'B'
where current of univ_cur;
elsif v_score >= 70 then
update univ
set grade = 'C'
where current of univ_cur;
elsif v_score >= 60 then
update univ
set grade = 'D'
where current of univ_cur;
else
update univ
set grade = 'F'
where current of univ_cur;
end if;
fetch univ_cur into v_name, v_score;
end loop;
end;
/
문제) 이름을 모두다 scott 으로 update 하고 위의 스크립트를 돌리고 결과를 보고 해결해보아라 !!
8.3 Example of a Exception
set serveroutput on
declare
v_ename varchar2(10);
begin
select ename into v_ename from emp
where deptno=10;
dbms_output.put_line('JONE''S last name is : ' || v_ename) ;
exception
when too_many_rows then
dbms_output.put_line(' your select statement retrived multiple rows ');
end;
/
8.11 Predefined Exception
accept p_empno prompt 'Enter the empno: '
declare
v_empno emp.empno%type := &p_empno;
v_emp emp%ROWTYPE;
BEGIN
SELECT empno, ename, deptno
INTO v_emp.empno, v_emp.ename, v_emp.deptno
FROM emp
WHERE empno = v_empno ;
DBMS_OUTPUT.PUT_LINE('사번 : ' || v_emp.empno);
DBMS_OUTPUT.PUT_LINE('이름 : ' || v_emp.ename);
DBMS_OUTPUT.PUT_LINE('부서번호 : ' || v_emp.deptno);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS에러 발생');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND에러 발생');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('기타 에러 발생');
END;
/
문제) 사원이름을 물어보게하고 해당 사원이 없으면 그런 사원없습니다.
라는 메시지를 출력되게하시요
8.15 Nonpredefined Exception
set serveroutput on
declare
not_null_test EXCEPTION;
/* not_null_test는 선언된 예외 이름
-1400 Error 처리번호는 표준 Oracle7 Server Error 번호 */
PRAGMA EXCEPTION_INIT(not_null_test, -1400);
BEGIN
-- empno를 입력하지 않아서 NOT NULL 에러 발생
INSERT INTO emp(ename, deptno)
VALUES('tiger', 30);
EXCEPTION
WHEN not_null_test THEN
DBMS_OUTPUT.PUT_LINE('not null 에러 발생 ');
END;
/
문제) 위의 스크립트를 수정하여 emp 테이블의 empno 에 중복된 데이타가 들어갔을때
중복된 데이타가 입력되었다는 에러메세지를 출력하게 하시요 !!
8.17 Trapping Function
accept p_deptno prompt 'Enter the deptno : '
declare
v_deptno emp.deptno%type := &p_deptno ;
v_emp emp%ROWTYPE ;
begin
DBMS_OUTPUT.ENABLE;
-- ERROR발생 for문을 돌려야 됨
SELECT * INTO v_emp
FROM emp
WHERE deptno = v_deptno;
DBMS_OUTPUT.PUT_LINE('사번 : ' || v_emp.empno);
DBMS_OUTPUT.PUT_LINE('이름 : ' || v_emp.ename);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR CODE : ' || TO_CHAR(SQLCODE));
DBMS_OUTPUT.PUT_LINE('ERR MESSAGE : ' || SQLERRM);
END;
/
8.19 User Defined Exception
accept p_deptno prompt 'Enter the deptno : '
set serveroutput on
declare
v_deptno emp.deptno%type := &p_deptno;
user_define_error EXCEPTION; -- STEP 1
cnt NUMBER;
BEGIN
SELECT COUNT(empno) INTO cnt
FROM emp
WHERE deptno = v_deptno;
IF cnt < 5 THEN
-- RAISE문을 사용하여 직접적으로 예외를 발생시킨다
RAISE user_define_error; -- STEP 2
END IF;
EXCEPTION
-- 예외가 발생할 경우 해당 예외를 참조한다.
WHEN user_define_error THEN -- STEP 3
RAISE_APPLICATION_ERROR(-20001, '부서에 사원이 몇명 안되네요..');
END;
/
문제) 이름을 넣었을 때 입사한지 30년이 넘었으면 “퇴임대상입니다” 라는 메시지가 출력되게하시요!!
9.6 Procedure
SQL> create or replace procedure raise_salary
(p_job in emp.job%type)
is
begin
update emp
set comm = sal * 1.5
where job=p_job;
end raise_salary;
/
프로시저가 생성되었습니다.
SQL> execute raise_salary(‘SALESMAN’);
PL/SQL 처리가 정상적으로 완료되었습니다.
문제) 직업을 입력하면 그 직업을 가진 사원들의 커미션이 자기 월급의 50%로
수정되게 하는 프로시져 생성하시요
9.9 Function
SQL> create or replace function tax
( p_value in number )
return number is
begin
return ( p_value * 0.08 );
end tax;
/
SQL> select empno, ename, sal, tax(sal)
from emp
where deptno =20;
문제) tax_table 라는 테이블을 생성하고 tax 함수를 사용하여 이름과 세금을 입력하는데 이름을 jack ,
세금은 월급 3000 에 대한 세금으로 입력하시요 !
'oracle10R2' 카테고리의 다른 글
Oracle10g DATAPUMP (0) | 2011.02.13 |
---|---|
10g Administration Workshop II 한글판 (0) | 2010.09.12 |
Oracle Database 10g : Data Warehousing Fundamentals (0) | 2010.07.31 |
OCM Oracle Database 10g : Security (0) | 2010.07.31 |
OCM Oracle Database 10g : Data Modeling (0) | 2010.07.31 |