**인덱스
1)생성된 인덱스 조회
select a.table_name, b.column_name, a.index_name, a.index_type, a.uniqueness
from user_indexes a, user_ind_columns b
where a.index_name = b.index_name and a.table_name in ('EMP','DEPT');
save ind
** primary key, unique제약이 설정된 컬럼에 대해서는 자동으로 unique 인덱스를 오라클이 생성함
// 실행계획서를 확인하기 위한 환경설정
1.
conn /as sysdba
2.
@C:\oraclexe\app\oracle\product\10.2.0\server\sqlplus\admin\plustrce.sql
=>실행계획서를 확인할 수 있도록 하는 plustrace 권한을 생성하는 script를 실행
3. grant plustrace to scott; => scott에게 plustrace 권한 부여(실행계획서 참조가능하게하는 권한)
4.
conn scott/tiger
실행계획서를 참조할 수 있는 set autotrace 기능을 활성화
SQL> @C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\utlxplan.sql
=>plan_table을 생성하는 스크립트
SQL> set autotrace traceonly explain =>이제부터 쿼리의 실행계획서만을 보여줌
set autotrace off =>원상태로
set autotrace on => 실행계획서 및 실행 성능, 결과값을 보여줌
SQL> select * from emp
where empno = 7788;
SQL> analyze table emp compute statistics;
=>emp 테이블의 현재상황을 통계분석하라
**시퀀스(sequence)
1. 역할 : 새로운 정수값을 생성하는 객체임. 이 정수값은 흔히 pk값으로 사용하면 좋다.
2. 시퀀스 생성
create sequence emp_seq
start with 1000
increment by 1
maxvalue 2000
nocycle
nocache;
=>1000번 부터 2000번까지 1식 증가하는 emp_seq라는 시퀀스를 생성하라
3. 생성된 시퀀스 확인
select * from user_sequences;
4.시퀀스 사용
insert into emp(empno, ename)
values(emp_seq.nextval,'test');
/
select * from emp; => test의 사번?
select emp_seq.currval
from dual;
*** 사용자 접근제어 ***
1.계정 생성
conn /as sysdba =>sys계정으로 접속
show user
select * from all_users; => DB에 접속할 수 있는 모든 계정명 확인
create user cjedu
identified by cjedu; => 새로운 cjedu 계정 생성
conn cjedu/cjedu => 최소한의 권한인 접근 권한이 없는 관계로 접속이 안됨
2. 시스템 권한
conn /as sysdba
select * from system_privilege_map; => 계정들에게 부여할 수 있는 시스템 권한의 모든 정보 확인
grant create session to cjedu; => cjedu에게 create session(접속권한)부여
conn cjedu/cjedu => ??
select * from user_users; => 접속자 본인정보 확인
select * from user_sys_privs; => 부여받은 시스템 권한 확인
select * from role_sys_privs; => 역시부여받은 시스템권한 확인(role채로..)
conn /as sysdba
select * from role_sys_privs; =>부여할 수 있는 모든 role의 정보 확인
grant connect,resource to cjedu; => 일반적으로 생성된 계정들에게는 Connect, resource라는 role을 부여함
conn cjedu/cjedu
select * from role_sys_privs;
3. 객체 권한
show user => cjedu
select * from tab;
select * from scott.dept; => scott계정 소유의 emp 테이블을 조회하려 함.
conn scott/tiger
grant select on dept to cjedu; => cjedu계정에게 dept 테이블에 대한 select권한을 부여함
conn cjedu/cjedu
select * from scott.dept =>조회 가능
delete scott.dept; => 삭제 불가능
////////////////////////////////////////////////////////////
중간에 서버 설정하는 필기등 생략..(채워넣을 것)
select * from user_tab_privs_recd; =>부여받은 객체권한정보 조회
conn scott/tiger
select * from user_tab_privs_made; => 부여한 객체권한정보 조회
///////////////////////////////////////////////////////////////////
1.오라클 네트워크 서버측 환경설정
1)listener.ora 파일 확인
C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN\listener.ora
2)listener 프로세스 활성화 시키기
3)client
////////////////////////////////////////////////////////////
create or replace procedure emp_info( i_empno in emp.empno%type)
is
v_empno emp.empno%type;
v_ename emp.ename%type;
v_job emp.job%type;
v_mgr emp.mgr%type;
v_sal emp.sal%type;
v_deptno emp.deptno%type;
v_mgrname varchar2(10);
begin
select e.empno, e.ename, e.job, e.mgr, e.sal, e.deptno, m.ename
into v_empno, v_ename, v_job, v_mgr, v_sal, v_deptno, v_mgrname
from emp e, emp m
where (e.empno = i_empno) and (e.mgr = m.empno);
dbms_output.put_line ( v_empno||' '||v_ename ||' '|| v_mgrname);
end;
/
select object_name from user_objects
where object_type = 'PROCEDURE';
select text from user_source
where name ='EMP_INFO';
**프로시저를 실행하는 방법
1)sql*plus툴이라면
set serveroutput on
execute 프로시저명(값..);
2)다른 프로시저내에서 호출
begin
프로시저명(값....);
end;
/
3)자바등의 host언어에서 호출
**pl/sql stored procedure
1.이름을 입력받아 그 사원의 정보 중 부서명과 급여를 out변수에 저장하여 return 하는 stored프로시저를 생성하여라.
create or replace procedure out_test(
i_ename in emp.ename%type,
o_dname out dept.dname%type,
o_sal out emp.sal%type)
is
v_deptno emp.deptno%type;
begin
--그 사원의 급여 및 부서코드를 조회해서 변수에 치환
select sal, deptno
into o_sal, v_deptno
from emp
where ename=upper(i_ename);
--그 부서코드에 해당하는 부서명을 조회해서 변수에 치환
select dname
into o_dname
from dept
where deptno= v_deptno;
end;
/
declare
v_dname dept.dname%type;
v_sal emp.sal%type;
begin
out_test('scott',v_dname,v_sal);
dbms_output.put_line('scott의 부서명 :'||v_dname);
dbms_output.put_line('scott의 급여 :'||v_sal);
end;
/
2.이름을 입력받아 그 사원의 정보 중 부서명과 급여를 return 하는 stored function을 생성하여라.
create or replace function function_test(
i_ename in emp.ename%type)
return varchar2
is
v_deptno emp.deptno%type;
v_dname dept.dname%type;
v_sal emp.sal%type;
begin
--그 사원의 급여 및 부서코드를 조회해서 변수에 치환
select sal, deptno
into v_sal, v_deptno
from emp
where ename=upper(i_ename);
--그 부서코드에 해당하는 부서명을 조회해서 변수에 치환
select dname
into v_dname
from dept
where deptno= v_deptno;
return v_sal||v_dname;
end;
/
select function_test('scott') from dual;
1)emp 테이블의 모든 사원들의 사번, 이름, 급여, 부서코드를 화면에 출력하는 stored procedure를 생성
create or replace procedure all_empinfo
is
v_empno emp.empno%type;
v_ename emp.ename%type;
v_sal emp.sal%type;
v_deptno emp.deptno%type;
--커서의 선언
cursor c1 is
select empno,ename, sal, deptno
from emp;
begin
--커서의 open(커서공간에 데이터를 올리는 작업)
open c1;
--커서에 올려진 데이터를 한행씩 변수에 치환(fetch)
loop
fetch c1 into v_empno, v_ename, v_sal, v_deptno;
exit when c1%notfound;
dbms_output.put_line('사번 : '||v_empno);
dbms_output.put_line('이름 : '||v_ename);
dbms_output.put_line('급여 : '||v_sal);
dbms_output.put_line('부서코드 : '||v_deptno);
dbms_output.put_line(chr(13));
end loop;
--커서의 close(메모리공간을 해제)
close c1;
end;
/
2)동일한 급여를 받는 사원들의 이름, 업무, 급여를 조회하여 출력하는 stored procedure를 생성하시오.
create or replace procedure same_sal_procedure
is
v_ename emp.ename%type;
v_job emp.job%type;
v_sal emp.sal%type;
--커서의 선언
cursor c1 is
select ename, job, sal
from emp
where sal in (select sal from emp group by sal having count(*) >1);
begin
--커서의 open(커서공간에 데이터를 올리는 작업)
open c1;
--커서에 올려진 데이터를 한행씩 변수에 치환(fetch)
loop
fetch c1 into v_ename, v_job, v_sal;
exit when c1%notfound;
dbms_output.put_line('이름 : '||v_ename);
dbms_output.put_line('업무 : '||v_job);
dbms_output.put_line('급여 : '||v_sal);
dbms_output.put_line(chr(13));
end loop;
--커서의 close(메모리공간을 해제)
close c1;
end;
/
1.이름을 입력받아 그 사원의 정보 중 부서명과 급여를 out변수에 저장하여 return 하는 stored프로시저를 생성하여라. 예외처리
create or replace procedure out_test(
i_ename in emp.ename%type,
o_dname out dept.dname%type,
o_sal out emp.sal%type)
is
v_deptno emp.deptno%type;
begin
--그 사원의 급여 및 부서코드를 조회해서 변수에 치환
select sal, deptno
into o_sal, v_deptno
from emp
where ename=upper(i_ename);
--그 부서코드에 해당하는 부서명을 조회해서 변수에 치환
select dname
into o_dname
from dept
where deptno= v_deptno;
exception
when no_data_found then
dbms_output.put_line(i_ename||'님은 저희회사 사원이 아닙니다.');
dbms_output.put_line('에러번호 : '||sqlcode||' 에러메시지 : '||sqlerrm);
end;
/
declare
v_dname dept.dname%type;
v_sal emp.sal%type;
begin
out_test('test',v_dname,v_sal);
dbms_output.put_line('test의 부서명 :'||v_dname);
dbms_output.put_line('test의 급여 :'||v_sal);
end;
/