0828,10-30
dba_views에서 뷰검색
select view_name from dba_views
where view_name like 'DBA_%COLUMNS%";
검색한 뷰로 원하는 내용검색
SQL> r
1 select column_name,data_type from dba_tab_columns
2* where owner='HR' and table_name='DEPARTMENTS'
테이블삭제후 되살리기
SQL> drop table emp2;
Table dropped.
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------EMP2 BIN$VYLA42+uua7gQAB/AQA2nA==$0 TABLE 2008-08-28:19:39:37SQL> flashback table emp2 to before drop;
Flashback complete.
쓰레기통안거치고 바로삭제
SQL> drop table emp2 purge;
Table dropped.
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
YY TABLE
XX TABLE
EXCEPTIONS TABLE
7 rows selected.
7-26
scott계정의 인덱스모음 보기..
SQL> select index_name from user_indexes;
INDEX_NAME
------------------------------
PK_DEPT
PK_EMP
PK_DEPT2
PK_EMPX
인덱스 지워주기..(pk는 자동인덱스)
SQL> alter table empx drop constraint pk_empx;
Table altered.
인덱스 생성
SQL> create index ix_emp18_sal on emp(sal);
Index created.
rowid값으로 바로 찾아 들어간다
SQL> select rowid,sal from emp order by sal;
ROWID SAL <--- rowid는 7-26의 row pointer, sal은 key
------------------ ----------
AAAMfMAAEAAAAAgAAA 800
AAAMfMAAEAAAAAgAAL 950
AAAMfMAAEAAAAAgAAK 1100
AAAMfMAAEAAAAAgAAC 1250
AAAMfMAAEAAAAAgAAE 1250
AAAMfMAAEAAAAAgAAN 1300
AAAMfMAAEAAAAAgAAJ 1500
AAAMfMAAEAAAAAgAAB 1600
AAAMfMAAEAAAAAgAAG 2450
AAAMfMAAEAAAAAgAAF 2850
AAAMfMAAEAAAAAgAAD 2975
ROWID SAL
------------------ ----------
AAAMfMAAEAAAAAgAAH 3000
AAAMfMAAEAAAAAgAAM 3000
AAAMfMAAEAAAAAgAAI 5000
14 rows selected.
인덱스의 기본기.
SQL> select * from emp where rowid='AAAMfMAAEAAAAAgAAL';
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7900 JAMES CLERK 7698 03-DEC-81 950
30
B-Tree Index - 데이터양이 많을때
와
BITMAP index - 데이터양이 적을때
7-32
em에서 만들어서 sql문 본것..
CREATE INDEX "SCOTT"."IX_EMP_SAL" ON "SCOTT"."EMP" ("SAL")
unique
CREATE UNIQUE INDEX "SCOTT"."IX_EMP_SAL" ON "SCOTT"."EMP" ("SAL")
descending
CREATE INDEX "SCOTT"."IX_EMP_SAL" ON "SCOTT"."EMP" ("SAL" DESC )
reverse
CREATE INDEX "SCOTT"."IX_EMP_SAL" ON "SCOTT"."EMP" ("SAL") REVERSE
compress(어느정도 길이가 되어야함)
CREATE INDEX "SCOTT"."IX_EMP_SAL" ON "SCOTT"."EMP" ("SAL", "JOB") COMPRESS 1
composite(and검색시,ex)주민등번,unique인덱스와 같이 사용)
CREATE UNIQUE INDEX "SCOTT"."IX_EMP_SAL" ON "SCOTT"."EMP" ("SAL", "JOB")
CREATE BITMAP INDEX "SCOTT"."TEST_IX" ON "SCOTT"."EMP" ("JOB") TABLESPACE "EXAMPLE"
ALTER INDEX "SCOTT"."TEST_IX" REBUILD REVERSE
CREATE INDEX "SYS"."IKKK" ON "SCOTT"."EMP" ("JOB", "MGR", upper(job))
CREATE INDEX "SYS"."IKKK" ON "SCOTT"."EMP" ("JOB", "MGR", upper(job)) COMPRESS 1
7-37
시퀀스 - PK의 기본값을 만드는것이 목적
em에서 만들었슴
CREATE SEQUENCE "SCOTT"."TEST_SE" CYCLE NOORDER NOCACHE MAXVALUE 10 MINVALUE 2 INCREMENT BY 2 START WITH 3
SQL> select TEST_SE.nextval from dual;
NEXTVAL
----------
3
..3.5.7.2.4.6.8.2.4.6.8....식으로 증가함.
7-47
1번
select view_name from dba_views where view_name like 'DBA%TABLES%'
2번
desc DBA_TABLES
3번
SQL> select TABLE_NAME,OWNER from DBA_TABLES where OWNER in('SCOTT','HR');
SQL> desc v_$fixed_table
Name Null? Type
----------------------------------------- -------- ---------------------------- NAME VARCHAR2(30)
OBJECT_ID NUMBER
TYPE VARCHAR2(5)
TABLE_NUM NUMBER
SQL> desc dictionary
Name Null? Type
----------------------------------------- -------- ---------------------------- TABLE_NAME VARCHAR2(30)
COMMENTS VARCHAR2(4000)
select * from dictionary; 하면 코맨트가 붙어있다.
TABLE_NAME
------------------------------
COMMENTS
--------------------------------------------------------------------------------Synonym for GV_$STREAMS_CAPTURE
V$STREAMS_CAPTURE
Synonym for V_$STREAMS_CAPTURE
DBA_APPLY_VALUE_DEPENDENCIES
Synonym for _DBA_APPLY_CONSTRAINT_COLUMNS
DBA_APPLY_OBJECT_DEPENDENCIES
TABLE_NAME
7-47의 a를 찾는다 할때의 방법..
- describe dba_indexes
- select * from dictionary where table_name like '%table%';
- desc user_tables;
8장
PL/SQL - 자동화처리하는데 좋음.
Lock처리
PL/SQL
언어적 특징이 있다.
언어의 특징
- 변수
- 조건문
- 반복문
- 함수
- 프로시져
함수와 프로시져의 차이점은
return값이 있느냐 없느냐..
기본필수
출력가능하게 하기
프로시져만들때 or replace
프로시져 만든후에 저장하기
에러보기
출력하는법..
그냥 아래처럼 입력하면 출력이 안된다.
SQL> exec dbms_output.put_line('AAAA');
PL/SQL procedure successfully completed.
show all하면 쭉 pl/sql 옵션값이 나오는데 이중에
serveroutput 을 on으로
SQL> set serveroutput on <- 해줘야 출력됨
SQL> exec dbms_output.put_line('AAAA'); <- function
AAAA
PL/SQL procedure successfully completed.
프로시져생성
or replace가 들어있어야 나중에 수정후 재실행이 가능해진다.
SQL> create or replace procedure test <- function을 묶은 프로시져, or replace는 ..프로시져에 반드시 들어가야함
2 as
3 begin
4 dbms_output.put_line('AAAA');
5 end;
6 /
Procedure created.
SQL> exec test
AAAA
PL/SQL procedure successfully completed.
SQL> sav test <-- 만든후에는 꼭 세이브 시켜두자.
Created file test.sql
에러 확인하는 방법
SQL> ed test <- 일부로 틀리게 만들고
컴파일은 @
SQL> @test <- 실행
Warning: Procedure created with compilation errors.
SQL> show error <- 에러를 보여달라.
Errors for PROCEDURE TEST:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/26 PLS-00103: Encountered the symbol "); <4/26 4번째 줄에 26번째에 오류가 떴다고 호출
end;" when expecting one of the following:
. ( ) , * @ % & | = - + < / > at in is mod remainder not
range rem => .. <an exponent (**)> <> or != or ~= >= <= <>
and or like LIKE2_ LIKE4_ LIKEC_ as between from using ||
multiset member SUBMULTISET_
SQL> l < 문장 출력
1 create or replace procedure test
2 as
3 begin
4 dbms_output.put_line(AAAA');
5* end;
프로시져 만든것 보는 방법
SQL> select object_name from user_procedures;
OBJECT_NAME
------------------------------
PT
로딩시켜서 다른 이름으로 저장하기
SQL> get pt2
1 create or replace procedure pt2(su number,su2 number)
2 as
3 begin
4 dbms_output.put_line(su+su2);
5* end;
SQL> sav pt3
argument를 이용한
값을 입력받아서 출력하기.
create or replace procedure pt2(su number)
as
begin
dbms_output.put_line(su);
end;
/
두개의 값을 입력받고 연산후 값을 출력하기.
create or replace procedure pt2(su number,su2 number)
as
begin
dbms_output.put_line(su+su2);
end;
/
function 의 간단한예
create or replace function pt3(su number,su2 number)
return number
as
begin
return su+su2;
end;
/
SQL> @pt3
Function created.
실행할때는 함수실행,,
SQL> select pt3(4,5) from dual;
PT3(4,5)
----------
9
피보나치 수열
create or replace procedure pt6
as
a number(6);
sum1 number(6);
b number(6);
begin
a:=1;
b:=2;
sum1:=0;
for i in 1..100 loop
if sum1 > 100 then
i=100
else
sum1:=a+b;
a:=b;
b:=sum1;
dbms_output.put_line(sum1);
end if;
end loop;
end;
/
SQL> @pt6
Procedure created.
SQL>
SQL> exec pt6
3
5
8
13
21
34
55
89
144
PL/SQL procedure successfully completed.
결론...
pl/sql문으로 프로시져같은것을 만들어서
아래와 같은 문장을 테이블 tt에 넣어줄수도 있다.
insert into tt values(dan||'X'||i||'='||dan*i);
SQL> sav test2
Created file test2.sql
SQL> ed test2
create or replace procedure test2
as
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;
/
SQL>
SQL>
SQL> @test2
Procedure created.
SQL> exec test2
1
2
3
4
5
6
7
8
9
10
PL/SQL procedure successfully completed.
ed로 수정후
@test2로 프로시져 생성하고
exec 프로시져명
으로 실행..
SQL> ed test2
create or replace procedure test2 <- 프로시져 시작
as
begin
for i in 1..9 loop <- loop문 시작
dbms_output.put_line(2*i); <- 출력문 종료
end loop; <- loop문 종료
end; <- 프로시져 종료
/
SQL> @test2
Procedure created.
SQL> exec test2
2
4
6
8
10
12
14
16
18
PL/SQL procedure successfully completed.
SQL> ed
Wrote file afiedt.buf
1 create or replace procedure test3
2 as
3 begin
4 for i in 1..9 loop
5 dbms_output.put_line('2'||'X'||i||'='||2*i); <- 문자들을 쭉 출력 | 사용
6 end loop;
7* end;
SQL> @test3
Procedure created.
SQL> exec test3
2X1=2
2X2=4
2X3=6
2X4=8
2X5=10
2X6=12
2X7=14
2X8=16
2X9=18
PL/SQL procedure successfully completed.
SQL> ed test3
create or replace procedure test3(DAN NUMBER)
as
begin
for i in 1..9 loop
dbms_output.put_line(DAN||'X'||i||'='||DAN*i);
end loop;
end;
/
SQL> @test3
Procedure created.
SQL> exec test3(3) <-- 3단을 뽑기위해 3이란값을 넣어줄수있다..
3X1=3
3X2=6
3X3=9
3X4=12
3X5=15
3X6=18
3X7=21
3X8=24
3X9=27
PL/SQL procedure successfully completed.
SQL> ed test3
create or replace procedure test3(DAN NUMBER)
as
begin
if DAN>1 AND DAN<10 THEN <- 조건문 if문..
for i in 1..9 loop
dbms_output.put_line(DAN||'X'||i||'='||DAN*i);
end loop;
ELSE
dbms_output.put_line('WRONG DAN..INPUT 2~9');
END IF;
end;
/
SQL> @test3
Procedure created.
SQL> exec test3(11)
WRONG DAN..INPUT 2~9
PL/SQL procedure successfully completed.
SQL> exec test3(6)
6X1=6
6X2=12
6X3=18
6X4=24
6X5=30
6X6=36
6X7=42
6X8=48
6X9=54
PL/SQL procedure successfully completed.
DB에 로직을 두고...exec를 만들어서 호출시키는 것을 쓰면..
App,Web에서는 호출만 하게하면 됨..
PL/SQL은 개발회사면 기본으로 요구를 한다..
테이블생성
SQL> create table tm(id number(10),data varchar2(50),
2 constraint tm_pk primary key(id));
Table created.
시퀀스생성
SQL> create sequence tm_s;
Sequence created.
프로시져생성
SQL> r
1 create or replace procedure tm_i
2 as
3 begin
4 for i in 1..10 loop
5 insert into tm values(tm_s.nextval,'AAAAA');
6 end loop;
7* end;
Procedure created.
SQL> sav tm_i
Created file tm_i.sql
프로시져로 테이블에 값 집어넣기..
SQL> @tm_i
Procedure created.
SQL> exec tm_i
PL/SQL procedure successfully completed.
SQL> select count(*) from tm;
COUNT(*)
----------
10
SQL> ed
Wrote file afiedt.buf
1 create or replace procedure tm_i(N number)
2 as
3 begin
4 for i in 1..N loop
5 insert into tm values(tm_s.nextval,'AAAAA');
6 commit;
7 end loop;
8* end;
SQL>
SQL> sav tm_i replace
Wrote file tm_i.sql
SQL>
SQL>
SQL> ed tm_i;
SQL>
SQL>
SQL> @tm_i <-- 여기서는 sav를 먼저했는데..원래는 @를 먼저해야하는게 맞다!!
Procedure created.
SQL>
SQL>
SQL> exec tm_i(100)
PL/SQL procedure successfully completed.
SQL> select count(*) from tm;
COUNT(*)
----------
110
SQL> exec tm_i(10000)
PL/SQL procedure successfully completed.
SQL> select count(*) from tm;
COUNT(*)
----------
10110
tm_i는 계속쓰일꺼임
create or replace procedure tm_i(N number)
as
begin
for i in 1..N loop
insert into tm values(tm_s.nextval,'AAAAA');
commit;
end loop;
end;
/
pl/sql관련 교재..
1.oracle 9i pl-sql.pdf
2.oracle datebase plsql usel
3.oracle 10g advanced plsql w...
SQL> ed f1
create or replace function f1(su number)
return number
as
begin
return su*2;
end;
/
SQL> @f1 <- ed로 수정한거 @로 보여주기 후 sav
Function created.
SQL> sav f1
SP2-0540: File "f1.sql" already exists.
Use "SAVE filename[.ext] REPLACE".
SQL> sav f1 replace
Wrote file f1.sql
SQL> ed f1
SQL> select f1(2) from dual;
F1(2)
----------
4
서브쿼리를 대신해 쓸수있다
변수사용,사용자 정의함수
SQL> ed f2
create or replace function emp_max
return number
is
mx number(6); <- 변수크기지정.
begin
select max(sal) into mx from emp;
return mx;
end;
/
SQL>
SQL>
SQL> @f2
Function created.
SQL> select emp_max from dual;
EMP_MAX
----------
5000
SQL> select ename from emp where sal=emp_max;
ENAME
----------
KING
History
Last edited on 10/30/2008 22:29 by darkwonder
Comments (0)