2008년 구정

|
사용자 삽입 이미지

너무나도 많은 사람과 함께 시작했던 연휴

사용자 삽입 이미지

매번 먹는 떡국. 어렸을 땐 진짜 여러그릇 먹었던 것 같은데...

사용자 삽입 이미지

매번 헷갈리는 차례상... 왠지 휑~하네..

사용자 삽입 이미지

백화점갔다가 산 와인... 그렇게 추천할만 하진 않은듯...

2008년 구정의 추억
Trackback 0 And Comment 0

시간에 대한 짧은 생각

|

시간은 우리가 가진 가장 소중한 것이지 않을까 싶다. 이번 설에 어머니와 선물을 사기위해 백화점에 들렀다. 이제는 너무나 익숙해져버린 에스컬레이터였지만 어머니는 아직 이신가보다. 처음 에스컬레이터 발음 조차 익숙하지 않았던 시절 나는 유난히 천천히 에스컬레이터에 탔다. 균형이 무너져서 천천히 발걸음을 옮겼던 기억이 있다. 물론 점점 에스컬레이터를 접하는 기회가 늘어가면서 아무렇지 않았는데... 아직 어머니는 조심스레 발걸음을 옮기고 계셨다. 시간이 흐른다는 것, 익숙해진다는 것 여러가지를 느끼고 알아 가고 싶다.

처음 연구실에 들어갈 때의 가슴떨림, 새로운 환경에 적응하고야 말겠다던 다짐으로 터질 것 같은 떨림이 있었다. 하지만 초심을 끝까지 이어나가지 못한 경험이 있다. 물론 뒤돌아 봤을 때 절대 후회하지 않을 사람과 경험을 가지게 되었지만 처음의 목표는 아니였다.

지금 현재 새로운 환경에 적응하고 있다. 제발 살아있음을 소중하게 여기고 새롭게 열심히 살아가고 싶다. 너무나 빨리 지나가는 시간, 기억, 사람들 속에서 처음의 느낌, 마음가짐을 가진다면 더 좋은 내가 되지 않을까 싶다.

Trackback 0 And Comment 0

2008년 1월 31일

|

**인덱스
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;
/


Trackback 0 And Comment 0

2008년 1월 30일

|

트렌젝션(Transaction): 논리적 작업의 단위
예) 계좌 이체 transeaction

1. 돈을 A 통장 인출 => update A 통장 set 잔고 = 잔고 - 1만원 where 계좌번호 = ~~ and 비번 = ~~;
2. 돈을 B 통장 입금 => update B 통장 set 잔고 = 잔고 + 1만원 where 계좌번호 = ~~ ;

DML => 여러개의 문장이 하나의 transaction 구성
DDL, DCL => 한개의 문장이 하나의 transaction 구성

Transaction 처리(종료)
1. 저장
    Commit
     자동 => DDL,DCL를 만나면, 정상 log out
2. 취소
    Rollback;
    자동 => 비정상 log out, system 정전등 down

1.commit에 대한 실습
update emp
set sal = sal *2;
select * from emp; => 모든 사원들의 급여값이 두배인상되었는지 확인
commit; => 작업저장
창의 x버튼을 눌러 닫은후 다시 실행하여
select * from emp; => sal의 값은?(인상)

2. rollback에 대한 실습
delete emp
where ename='MILLER'; => miller 사원의 정보 삭제 시킴
update emp
set sal=sal*2
where ename='SCOTT'; => scott사원의 급여를 두배로 인상시킴
select * from emp; => miller? scott의 급여?
rollback; =>작업취소
select * from emp; => miller? scott의 급여?

/////////////////////////////////
1. A세션에서
select * from emp; =>행의 갯수등 확인해놓을 것
insert into emp(dmpno, ename, deptno)
values(9000, 'cjedu', 20);
select * from emp; => 9000번 사원입력되었나?(0)

2. B세션에서
select * from emp; => 9000번 사원의 정보?(0)

3. A세션에서
commit;

4. B세션에서
select * from emp; => 9000번 사원의 정보?(0)

*** 1,2,3,4번 실습의 결론
DML 문장은 트랜잭션을 종료하기 전까지 메모리에서만 수횅되므로 다른세션에서 확인할 수 없다. commit 명령이 수행되면 그제서야 DB에 반영됨(read consistency : 읽기 일관성)

5. A세션에서
create table trantest(
id number);

select * from tab; => trantest (0)

6. B세션에서
select * from tab; => trantest?(0)

** 5,6 번 실습의 결론
DDL문장은 자동commit되는 명령문이므로 한문장이 하나의 트랜잭션임, 다른 세션에서 바로 확인된다. 주의) DDL명령문은 rollback이 안됨!

7. A세션
delete emp
where empno = 9000;
select * from emp;  => 9000번 삭제됨

drop table trantest;
select * from tab;
rollback;
select * from tab;
select * from emp;

**7번 실습의 결론
DDL명령문은 자동커밋되므로 그전에 실행했던 DML 명령문들도 함께 커밋됨, 커밋은 save와 동일, 따라서 DDL명령문이후에 rollback이나 commit이라는 명령문은 아무의미가 없음.

참고)트랜잭션의 종료(작업이 종료)되는 경우
: commit, rollback 되면 작업이 종료됨

**commit의 종류
1)commit; 명령어
2)자동 commit => DDL, DCL등의 명령문이 실행되거나 세션을 정상적으로 log out 하는 경우 (exit;라는 명령문)
**rollback 의 종류
1)rollback; 명령어
2)자동 rollback => 비정상적인 log out (x버튼을 누른 경우), 정전등에 의한 시스템 down, dead lock

8.자동 commit 되는 경우
a세션에서
update emp
set sal = sal *2;
select * from emp; => 급여값 확인
exit;
다시 새로운 창을 열어서
select * from emp; => 급여값(변경되어있음)

9.자동 rollback되는 경우
update emp
set sal = sal *0.5;
select * from emp;  => 급여값
창의 x버튼을 눌러 닫은후
다시 새로운 창을 열어서
select * from emp; => 급여값(변경되지 않음)

1. savepoint 명령어 => rollback시를 위해 transaction중간에 기점을 선언하는 명령어.
update emp
set sal = sal *2
where ename='SCOTT';
select * from emp
where ename = 'SCOTT';

savepoint s1;

delete emp
where ename = 'SCOTT';
select * from emp;

rollback to savepoint s1;
select * from emp;

rollback;
select * from emp;

2. transaction과 lock
1)세션 A에서
rollback;
select *from emp;
update emp
set sal=sal*2
where ename ='MILLER';
select * from emp
where ename ='MILLER';

2)세션 B에서
select * from emp
where ename ='MILLER';

update emp
set sal=sal*2
where ename ='SMITH';

update emp
set sal= sal*2
where ename = 'MILLER';

세션 a로 돌아와서
commit;
세션 b에서 확인

3) 세션 a에서
drop table emp;
(no wait에러 : 테이블의 행에 대해서 다른세션에서 DML중이므로 테이블의 구조 변경, drop은 금지)

결론 : 트렌잭션 중에는 동시에 두가지 lock이 걸림
-row level lock (행수준 락) : 트랜잭션중인 그 행은 오로지 select만 가능, update, delete 불가한 배타적인 속성의  lock(exclusive lock)이 걸림
-table level lock(테이블 수준 락) : 트랜잭션에 참여하지 않은 행은 update, delete가능, but 테이블 자체의  drop, alter 불가한 공유 lock(shared lock)이 걸림

3. dead lock
1)세션 A에서
rollback;
update emp
set sal=sal*2
where ename ='SCOTT';

2)세션 B에서
rollback;
update emp
set sal = sal*2;
where ename ='JONES';

update emp
set sal=sal*2
where ename='SCOTT';

3)세션 A에서
update emp
set sal = sal*2
where ename='JONES';

4. undo segment
: DML 작업중에 발생하는 이전데이터를 저장하는 database내의 영역
conn /as sysdba
show parameter undo_tablespace

select * from dba_tablespaces
where tablespace_name='UNDO';

select * from dba_data_files
where tablespace_name='UNDO';

show parameter undo_retention

**10g Flashback 버전 질의 : 두 시점간의 변경된 데이터를 표시하는 기능
create table rates(
currency varchar2(4),
rate number(15,10)
);

insert into rates values('EURO', 1.1012);
commit;
update rates set rate = 1.1014;
commit;
update rates set rate = 1.1013;
commit;
delete rates;
commit;
insert into rates values('EURO', 1.1016);
commit;
update rates set rate = 1.1011;
commit;

**view : 가상의 논리적인 테이블, 실제 데이터는 테이블에 존재, 보안, 쿼리문을 간단하게 처리하기 위한 목적

1)view의 생성
- emp 테이블에서 10번 부서원들의 모든 정보를 볼 수 있는 emp10이라는 view를 생성하시오.
conn scott/tiger
select * from role_sys_privs;
select * from user_sys_privs;

conn /as sysdba
grant create view to scott;

conn scott/tiger

create or replace view emp20
as select *
     from emp
     where deptno=20;
-생성된 view들의 정보 조회
select * from tab;
select * from user_views;

2)view를 통한 데이터 조회 및 처리
select * from emp20;
insert into emp20(empno,ename, deptno)
values(1,'a',20);
select * from emp;
insert into emp20(empno,ename, deptno)
values(2,'b',30);
select * from emp20;
select * from emp;

**top-n query
1. emp 테이블에서 가장 최근에 입사한 5명의 모든 정보를 조회하시오.
select rownum,empno,hiredate
from
(select empno, hiredate
from emp
order by hiredate desc)
where rownum <=5;

2. 1번 결과를 제외한 나머지 사원들의 모든 정보를 조회하시오.
select rownum,empno,hiredate
from
(select empno, hiredate
from emp
order by hiredate desc)
minus
select rownum,empno,hiredate
from
(select empno, hiredate
from emp
order by hiredate desc)
where rownum <=5;


**emp테이블에 존재하는 사원의 이름을 sql*plus툴에서 입력받아 그 사원의 업무가 MANAGER@

set verify off
set serveroutput on
accept p_name prompt '이 름: '
declare
--선언부
 v_empno  emp.empno%type;
 v_name  emp.ename%type:= upper('&p_name');
 v_sal  emp.sal%type;
 v_oldsal emp.sal%type;
 v_job  emp.job%type;
begin
 select  empno, job, sal
 into v_empno, v_job, v_oldsal
 from emp
 where ename = v_name;

 if v_job IN ('MANAGER', 'ANALYST') then
  v_sal := v_oldsal*1.5;
 else
  v_sal := v_oldsal*1.2;
 end if;
 update emp
  set sal = v_sal
 where empno = v_empno;
 --그 사원의 변경된 급여값을 조회하여
 --화면에 출력하기
 dbms_output.put_line ('변경전 사원의 급여는 ' || v_oldsal ||'이며, 변경된 급여는 ' || v_sal || '입니다.');
end;


Trackback 0 And Comment 0

2007년 1월 29일

|

1.테이블생성
1)생성권한이 존재해야 함
select * from user_sys_privs;
select * from role_sys_privs;

2)여유공간이 있어야 함.
select tablespace_name, sum(bytes)
from user_free_space
group by tablespace_name;

conn /as sysdba
select tablespace_name, file_name
from dba_data_files;

** select table_name from dictionary
    where table_name like '%PRIV%';

3)새로운 테이블스페이스를 생성해서 그곳에 테이블을 생성

conn /as sysdba
create tablespace newtbs
datafile 'C:\ORACLEXE\ORADATA\XE\newtbs01.dbf' size 500k;
=>물리적인 파일이 생성됨을 확인

select * from dba_tablespaces
where tablespace_name='NEWTBS';
=>테이블 스페이스의 기본 속성 확인

select * from dba_data_files
where tablespace_name='NEWTBS';
=> TS를 구성하는 파일속성 확인

select * from user_free_space
where tablespace_name='NEWTBS';
=> 여유공간 확인

**새로운테이블을 생성
이름 : employee (scott계정 소유)
컬럼 :
empno number(2) primary key,
ename varchar2(20) unique,
sal number(10) 600~9000사이의 값만 허용,
job varchar2(30) not null,
deptno number(2) foreign key로서 dept테이블의 deptno컬럼의 값을 참조할수 있도록 설정


create table scott.employees
(empno number(2) constraint employees_empno_pk primary key,
ename varchar2(20) constraint employees_ename_uk unique,
sal number(10) constraint employees_sal_ck check(sal between 600 and 9000),
job varchar2(30) constraint employees_job_nn not null,
deptno number(2) constraint employees_deptno_fk references scott.dept(deptno));

select * from dba_tables
where table_name='EMPLOYEES' and owner='SCOTT';

select * from dba_users
where username ='SCOTT';

drop table scott.employees;

create table scott.employees
(empno number(2) constraint employees_empno_pk primary key,
ename varchar2(20) constraint employees_ename_uk unique,
sal number(10) constraint employees_sal_ck check(sal between 600 and 9000),
job varchar2(30) constraint employees_job_nn not null,
deptno number(2) constraint employees_deptno_fk references scott.dept(deptno))
tablespace newtbs;


insert into scott.employees(empno,ename,sal,job,deptno)
values(1,'A',500,'ANALYST',10); => sal의 제약조건에 따라 입력안됨

insert into scott.employees(empno,ename,sal,job,deptno)
values(1,'A',600,'ANALYST',60); => 외래키가 없어서 60이 에러

insert into scott.employees(empno,ename,sal,job,deptno)
values(1,'A',600,'ANALYST',10);


///////////////////////////////////////////////////////////
테이블 속성 비활성화
///////////////////////////////////////////////////////////

alter table scott.employees
disable primary key;

alter table scott.employees
disable unique(ename);

alter table scott.employees
disable constraint employees_sal_ck;

alter table scott.employees
disable constraint employees_job_nn;

alter table scott.employees
disable constraint employees_deptno_fk;

///////////////////////////////////////////////////////////
데이터 입력 =>테이블스페이스 크기 때문에 에러가 발생한다
///////////////////////////////////////////////////////////
insert into scott.employees(empno,ename,sal,job,deptno)
values(1,'A',600,'ANALYST',10);

insert into scott.employees
select * from scott.employees;

** 테이블스페이스의 공간을 확장
1)기존의 파일사이즈를 증가
alter database datafile 'C:\oraclexe\oradata\XE\newtbs01.dbf' resize 1M;

2)새로운 파일을 추가
alter tablespace newtbs add datafile 'C:\oraclexe\oradata\XE\newtbs02.dbf' size 1M autoextend on;


**생성된 테이블의 정보 확인
1.생성된 테이블들의 이름을 확인
conn scott/tiger
select * from tab;
select table_name from user_tables;
select object_name from user_objects
where object_type='TABLE';

2. employees테이블의 구조 확인(컬럼명, 데이터타입)
3. employees테이블에 설정된 제약들 확인
select
a.table_name, b.column_name, a.constraint_name,a.constraint_type,a.search_condition, a.status
from user_constraints a, user_cons_columns b
where a.constraint_name=b.constraint_name and
a.table_name='EMPLOYEES';

save cons //쿼리 저장

ed cons // 쿼리 수정

@cons // 쿼리 실행

**CTAS를 이용한 테이블 생성
:기존의 테이블의 구조 및 데이터를 이용하여 새로운 테이블을 생성, 일종의 데이터 복사
create table 새로운테이블이름
as select~ ;

예) emp테이블에서 10번 부서원들의 사번, 이름, 업무, 급여, 입사일자를 포함하는 새로운 emp_10이라는 테이블을 생성하시오.
create table emp_10
as select empno,ename, job,sal,hiredate
     from emp
     where deptno=10;
select * from tab;
desc emp_10
select * from emp_10;


문제1)emp 테이블에서 부서별로 부서번호, 인원수, 평균급여, 급여의 합, 최소급여, 최대급여를 포함하는 emp_deptno테이블을 생성하여라
create table emp_deptno
as select deptno, count(*) dept_people_num , avg(sal) sal_avg, sum(sal) sal_sum, min(sal) sal_min , max(sal) sal_max
     from emp
     group by deptno;

**컬럼, 테이블명 naming rule
1. 영어, 숫자, 한글,_,#,$ 가능
2. 예약어 불가능(v$reserved_words)
3. 시작은 영어, 한글로만 시작
4. 1~30자이내


문제2) emp 테이블에서 사원번호, 이름, 업무, 입사일자, 부서번호만 포함하는 emp_temp테이블을 생성하는데 자료는 포함하지 않고 구조만 생성하여라.
create table emp_temp
as select empno, ename, job, hiredate, deptno
     from emp
     where empno is null;

** 테이블의 구조 수정
1)테이블 이름 수정
 RENAME a TO b;
2)컬럼 이름 수정
 ALTER TABLE 테이블명 RENAME a to b;
3)컬럼의 데이터 타입 및 최대길이 변경
 ALTER TABLE 테이블명
 MODIFY 컬럼명 datatype(최대길이);
4)컬럼의 추가 삭제
 ALTER TABLE 테이블명
 ADD 컬럼명 datatype(최대길이);

 ALTER TABLE 테이블명
 DROP COLUMN 컬럼명; (즉시 삭제) 또는

 ALTER TABLE 테이블명
 SET UNUSED COLUMN 컬럼명; ==>이후
 ALTER TABLE 테이블명
 DROP UNUSED COLUMNS;
5)제약조건의 추가 및 삭제
 ALTER TABLE 테이블명
 ADD CONSTRAINT 제약명 제약유형(컬럼명);

 ALTER TABLE 테이블명
 DROP PRIMARY KEY/UNIQUE(컬럼명)/CONSTRAINT 제약명              CASCADE;   ==>cascade는 pk제약을 삭제하려고 하는데 pk제약을 참조하는 fk제약이 만약이 존재한다면 이 옵션을 사용함으로서 pk제약이란 fk제약이 함께 삭제

6)제약의 비활성화 및 활성화  ==>다량의 BATCH업무의 성능향상을 위해 비활성화
ALTER TABLE 테이블명
DISABLE PRIMARY KEY/UNIQUE(컬럼명)/CONSTRAINT 제약명 CASCADE;

ALTER TABLE 테이블명
enable PRIMARY KEY/UNIQUE(컬럼명)/CONSTRAINT 제약명;

** 테이블 삭제
1)DROP TABLE 테이블명 CASCADE CONSTRAINTS;

- DEPT테이블을 삭제
DROP TABLE dept CASCADE CONSTRAINTS;

 - oracle 10g에서는 drop table을 시키면 테이블을 recyclebin으로 일단 저장후 이후에 삭제시킴
show recyclebin

flashback table dept to before drop;

2)TRUNCATE TABLE 테이블명;
 truncate table employees;

 select * from employees;
 desc employees

** 결론)
drop table은 완전삭제,truncate table은 모든 데이터를 완전삭제,구조는 존재함, 저장공간은 해제됨.


**테이블에 데이터를 입력, 수정, 삭제 작업, DML(Date Manipulation Language) ==> DML작업은 트랜잭션을 구성

1)입력
insert into 테이블명(컬럼1, 컬럼2...)
values(값1, 값2,...)

1.emp 테이블에 새로운 사원의 정보를 입력하시오.
(사번 : 8000, 이름: 홍길동, 업무 : MANAGER, 입사일: 현재날짜 및 시간, 급여 : 3000, 부서코드 : 10, 기타 : null)
insert into emp(empno,ename, job, mgr, hiredate, sal,comm, deptno)
values(8000, '홍길동', 'MANAGER',null, sysdate, 3000, null, 10);

2.emp 테이블에 새로운 사원의 정보를 입력하시오
(사번 : 8001, 이름: 김길동, 업무 : CLERK, 입사일 : 2001년도 8월 1일 10시, 급여: 2000, 부서코드: 20, 기타 : null)
insert into emp(empno,ename, job, mgr, hiredate, sal,comm, deptno)
values(8001, '김길동', 'CLERK',null, to_date('2001/08/01/10','rrrr/mm/dd/hh24'), 2000, null, 20);

select empno, ename, to_char(hiredate,'rrrr/mm/dd:hh24:mi:ss')
from emp;

2)수정
update 테이블명
set 컬럼명1 = 값1, 컬럼명2=값...
(where 조건절);

3)삭제
delete (from) 테이블명
(where 조건절);


Trackback 0 And Comment 0

2007년 1월 28일

|
09:00 ~
**그룹함수(집계함수)
select 그룹함수                                                        5)
from                                                                      1)
where 그룹함수 사용불가 =>행을 제한하는 조걸절               2)
group by                                                                3)
having 그룹함수 사용 => 그룹을 제한하는 조건절                4)
order by 그룹함수 사용                                               6)

문제1)
select conut(*),avg(sal),max(sal),min(sal)
from emp;
문제2)
select avg(sal), max(sal), min(sal), sum(sal)
from emp
where job = 'SALESMAN';
문제3)
select count(*), count(comm), avg(comm), avg(nvl(comm,0)), sum(comm)/count(comm), sum(comm)/count(*) , count(distinct deptno)
from emp;

select sal, ename
from emp
where sal=(select max(sal) from emp);

문제3)
select deptno, count(*), avg(sal),min(sal),max(sal),sum(sal)
from emp
group by deptno;

문제4)
select deptno, count(*), avg(sal), min(sal), max(sal), sum(sal)
from emp
group by deptno
order by sum(sal) desc;

문제5)
select deptno, job, count(*), avg(sal), sum(sal)
from emp
group by deptno, job
order by deptno;

문제6)
select null "부서 및 전체", sum(sal)
from emp
union all
select deptno,sum(sal)
from emp
group by deptno;

//////////////////////////////////////////////
//동일한 의미
select deptno,job, sum(sal)
from emp
group by rollup(deptno,job);

select deptno,sum(sal)
from emp
group by grouping sets((deptno,job),(deptno),());
//////////////////////////////////////////////
//////////////////////////////////////////////
//동일한 의미
select deptno,job,sum(sal)
from emp
group by cube(deptno,job);

select deptno,job, sum(sal)
from emp
group by grouping sets((),(job),(deptno),(deptno,job));
//////////////////////////////////////////////

//그룹에 대해서 전체를 의미하는 ()
select deptno,sum(sal)
from emp
group by grouping sets((),deptno);

문제7)
select deptno, count(*), sum(sal)
from emp
group by deptno
having (count(*) >4);

문제8)
select job, sum(sal)
from emp
group by job
having sum(sal)>5000 and job != 'SALESMAN'
order by sum(sal) desc;

**조인 문법
1)ORACLE JOIN 문법
- cartesian product
- equi join
- non equi join
- self join
- outer join

2)ANSI JOIN 문법(9i부터 사용가능)
- cross join
- natural join
- using 절을 이용한 join
- join~ on 절을 이용한 join
- left/right/full outer join


문제1)
select e.empno, e.ename, e.job, e.deptno "사원부서번호", d.deptno "부서번호", d.dname,d.loc
from emp e, dept d

ANSI JOIN
select e.empno, e.ename, e.job, e.deptno "사원부서번호", d.deptno "부서번호", d.dname,d.loc
from emp e cross join dept d;


문제2) emp 테이블과 dept테이블을 Cartesian product하여 사원번호, 이름, 업무, 부서번호, 부서명, 근무지를 출력하여라
select e.empno, e.ename, e.job, e.deptno "사원부서번호", d.deptno "부서번호", d.dname,d.loc
from emp e, dept d
where e.deptno = d.deptno;

ANSI JOIN
select empno, ename, job, deptno "사원부서번호", deptno "부서번호", dname, loc
from emp natural join dept;

select empno,ename,job,deptno,dname,loc
from emp join dept using (deptno);

select e.empno, e.ename, e.job, e.deptno "사원부서번호", d.deptno "부서번호", d.dname,d.loc
from emp e JOIN dept d
ON (e.deptno=d.deptno);

문제3) salesman의 사원번호, 이름, 급여, 부서명, 근무지를 출력하여라
select e.empno, e.ename, e.sal, d.dname, d.loc
from emp e, dept d
where e.job = 'SALESMAN' and ( e.deptno = d.deptno);

ANSI JOIN
select e.empno, e.ename, e.sal, d.dname, d.loc
from emp e JOIN dept d
ON (e.deptno=d.deptno and e.job = 'SALESMAN');

문제4) 사원번호, 이름, 업무, 급여, 급여의 등급을 출력하여라. (emp와 salgrade테이블이용)
select e.empno, e.ename, e.job, e.sal, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal;

ANSI JOIN
select e.empno, e.ename, e.job, e.sal, s.grade
from emp e JOIN salgrade s
ON (e.sal between s.losal and s.hisal);

문제5)emp테이블과 dept 테이블에서 사원들의 이름, 업무, 그들이 근무하는 부서명, 위치를 출력하시요.(단, 사원이 존재하지 않는 부서의 정보도 함께 출력하시오)

select e.ename, e.job, d.dname, d.loc
from emp e, dept d
where e.deptno(+) = d.deptno
order by dname;

ANSI JOIN
select e.ename, e.job, d.dname, d.loc
from emp e RIGHT OUTER JOIN dept d
ON (e.deptno=d.deptno);

문제6)emp 테이블에서 모든 사원들의 이름, 업무 및 그 사원들을 관리하는 관리자이름을 출력하여라.

select e.ename , e.job, m.ename
from emp e, emp m
where e.mgr = m.empno;

ANSI JOIN
select e.ename , e.job, m.ename
from emp e join emp m
ON( e.mgr = m.empno);

문제0)emp 테이블에서 scott의 급여보다 많은 급여를 받는 사원의 사원번호, 이름, 담당업무, 급여를 출력하여랴
select empno,ename, job, sal
from emp
where sal > (select sal from emp where ename ='SCOTT');

문제1) emp 테이블에서 사원번호가 7521인 사원과 업무가 같고 급여가 7934인 사원보다 많은 사원의 사원번호, 이름 담당업무, 입사일자, 급여를 출력하여라
select empno, ename, job, sal
from emp
where job = (select job from emp where empno =7521) and sal > (select sal from emp where empno=7934);

문제2)emp 테이블에서 평균급여보다 적은 급여를 받는 사원의 사원번호, 이름, 담당업무, 급여, 부서번호를 출력하여라.

select empno, ename, job, sal, deptno
from emp
where sal < (select avg(sal) from emp);

문제3)emp 테이블에서 부서별 평균급여가 20번 부서의 평균급여보다 높은 부서코드 및 평균급여를 출력하여라

select deptno, avg(sal)
from emp
group by deptno
having avg(sal)
 > (select avg(sal) from emp where deptno =20 group by deptno);


문제4)emp 테이블에서 업무별 평균급여중 가장 낮은 평균급여를 갖는 업무명과 그 평균급여를 출력하여라
select job, avg(sal)
from emp
group by job
having avg(sal) = (select min(avg(sal)) from emp group by job);

**서브쿼리의 종류
1)단일행 서브쿼리 : 리턴값이 1개인 경우, 일반비교연산자 사용
2)다중행 서브쿼리 : 서브쿼리의 리턴값이 2개 이상인 경우
where절, having 절에서 사용되는 경우 연산자를 IN, ANY, ALL을 사용하여야 한다.
3)단일컬럼 서브쿼리
4)다중컬럼 서브쿼리 : 컬럼을 쌍을 이루어서 비교해야 하는 경우
5)correlated 서브쿼리(상호관련 서브쿼리): 서브쿼리내에 메인쿼리의 테이블이 사용되는 경우로서 메인쿼리 테이블의 행의 갯수만큼 서브쿼리가 실행됨, 흡사 조인처럼 성능이 좋지 않음. 성능향상을 위해서 컬럼에 인덱스 생성해야 함
6)INLINE VIEW : FROM 절에 선언한 서브쿼리, 성능향상, 쿼리문을 simple하게 처리할 수 있음.


**dept 테이블에 존재하지 않는 부서코드를 갖는 사원의 정보를 조회하시오
select *
from emp
where deptno NOT IN (select deptno from dept);

select *
from emp e
where not exists ( select 'X' from dept d where e.deptno = d.deptno);


문제5)emp 테이블에서 업무별로 최소 급여를 받는 사원의 사원번호, 이름, 업무, 입사일자, 급여, 부서번호를 출력하여라.

select empno, ename, job, hiredate, sal, deptno
from emp
where (job,sal) in (select job, min(sal) from emp group by job);

문제6)emp와 dept테이블에서 업무가 manager인 사원의 이름, 업무, 부서명, 근무지를 출력하여라
select e.ename, e.job, d.dname, d.loc
from emp e, dept d
where e.job = 'MANAGER' and e.deptno=d.deptno;

select e.ename, e.job, d.dname, d.loc
from (select * from emp where job='MANAGER') e, dept d
where e.deptno = d.deptno;

오늘 배운 것은 그룹함수, 조인, 서브쿼리!!!

Trackback 0 And Comment 0

2008년 1월 25일

|

2008년 1월 25일 금요일
09:00 ~10:00
다이어그램으로 노멀라이제이션 하는 것

10:00 ~12:00
sql + 명령문
show user

conn system/암호 => systems계정으로 DB에 접속
conn /as sysdba => sys계정으로 DB에 접속(DB시작, 종료 작업가능)
show user
select status from v&instance; => DB의 상태확인
-open (사용자들이 접속해서 작업가능한 시작 상태)
-mounted (mount상태로서 DB의 복구, 상태변경등이 가능한 상태)
-started (nomount상태로서 인스턴스만 시작된 상태)

select * from all_users; => 현재 DB에 접속가능한 계정정보 확인
@C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN\scott.sql

conn scott/tiger
select * from tab; => scott계정 소유의 모든 테이블들의 이름확인

//테이블 생성
CREATE TABLE employee(
emp_num NUMBER(4) CONSTRAINT employee_emp_num_pk PRIMARY KEY,
first_name VARCHAR2(10),
last_name VARCHAR2(10),
soc_sec_num VARCHAR2(10),
address VARCHAR2(30),
tel VARCHAR2(15),
hire_date DATE,
store_code NUMBER(2));

//오타 수정
ALTER TABLE employee RENAME COLUMN larst_name TO last_name;

ed로 클립보드를 열어서  / 로 실행
desc employee => employee 테이블의 구조 확인
set linesize 100 한줄에 나오는 사이즈 조절

INSERT INTO employee VALUES(1,'길동','홍','800101-1000000', '서초구 양재동','100-111',SYSDATE, 10); =>새로운 한행 삽입

col first_name format a5 //폭 조절

SELECT *  FROM employee;

**employee 테이블이 생성된 물리적인 파일 확인
conn /as sysdba
select table_name, tablespace_name
from dba_tables
where owner='SCOTT';

select file_name
from dba_data_files
where tablespace_name='USERS';

13:00~
**sql
1)데이터 조희 : select
SELECT 컬럼명 /* distinct, ""
FROM 테이블명
WHERE 행조건절;

2) 객체(테이블등)
생성 : create
수정 : alter
 삭제: drop, truncate
=>DDL(Data Definition Language)

3)데이터
입력: insert
수정: update
삭제: delete
=>DML(Data Manipulation Language)

4)트렌젝션 제어: commit, rollback, savepoint
=> TCL(transaction Control Language)

5)User에게 권한 부여 : Grant
권한 취소 : Revoke
=>DCL(Data Control Language)

//sql + 설정 파일
C:\oraclexe\app\oracle\product\10.2.0\server\sqlplus\admin\glogin.sql

***select 예제
select 컬럼명/컬럼명(+,-,*,/) 숫자등의 표현식/distinct 컬럼명/*/컬럼명 "별칭"/ 연결연산자(||)

from 테이블명;
where 컬럼표현식 연산자 값; =>행을 제한하는 조건절

연산자
1)비교연산자 : = , >, <, >= <=, !=, <>
2)SQL연산자

  • between 값1 and 값2
  • in (값1, 값2, 값3,...)
  • like '...%..._' : 문자열의 패턴

    • %: 모든, _ : 반드시  
  • is null : 널값

 문제

1번) select empno, ename, sal, job form emp;
2번) select empno, ename, sal+300 , job form emp;
3번) select ename, sal, comm, sal*12+nvl(comm,0) from emp;
4번) select ename "NAME", sal "SALARY" from emp;
5번) select ename "성 명", sal*12 "급 여" from emp;
6번) select ename||' is a ' ||job from emp;
7번) select ename||': 1 Year salary= ' ||(sal*12+nvl(comm,0))  from emp;
8번) select distinct job from emp;
9번) select distinct deptno from emp;
10번) select empno, ename, job, sal from emp where sal >= 3000;
11번) select empno, ename, job, sal, deptno from emp where job like 'MANAGER';
12번) select empno, ename, job, sal, hiredate, deptno from emp where hiredate >
1982/01/01';
13번) select ename, job, sal, deptno from emp where sal between 1300 and 1500;
14번) select empno, ename, job, sal, hiredate from emp where empno in (7902 ,7788,
566);
15번) select empno, ename, job, sal, hiredate, deptno from emp where hiredate like
82/%%/%%';
        select empno, ename, job, sal, hiredate, deptno from emp where to_char(hiredate,
rrrr') = '1982';
16번) select empno, ename, job, sal, hiredate, deptno from emp where comm is null;
17번) select empno, ename, job, sal, hiredate, deptno from emp where sal >=1100 and
ob ='MANAGER';
18번) select empno, ename, job, sal, hiredate, deptno from emp where job != MANAGER' and job != 'CLERK' and job !='ANALYST';
         select empno, ename, job, sal, hiredate, deptno from emp where job not in ('MANAGER', 'CLERK', 'ANALYST');
19번) select empno, ename, job, sal, hiredate, deptno from emp where (job = 'PRESIDENT' AND SAL > 1500) OR JOB ='SALESMAN';
20번) select * from emp where (ename like '%L%L%' ) and ( (deptno = 30) or ( mgr = 7782) );
21번) select empno, ename, job, sal, hiredate "입사일 ", deptno from emp order by "입사일" desc;

**함수 : 좀 더 강력한 질의문을 작성하기 위해서
1) 오라클 제공 내장 함수
-단일행 함수
1번)
select empno,ename,lower(job),deptno
from emp
where upper(ename) = 'SCOTT';
2번)
select initcap(dname), initcap(loc)
from dept;
3번)
select empno, ename, job, sal, deptno
from emp
where substr(ename, 1,1) > 'K' and substr(ename, 1,1) < 'Y' order by ename;
4번)
 select empno, ename, length(ename), sal, length(sal)
from emp
where deptno = 20;
5번)
select mod(sal,30)
from emp;
6번)
select round((sysdate - hiredate)/7), round(mod(sysdate - hiredate, 7))
from emp order by 1 desc;
7번)
select round(months_between(sysdate, hiredate))
from emp
where deptno = 10;
8번)
select add_months(hiredate,5)
from emp
where deptno = 10;
9번)
select next_day(hiredate, '금')
from emp
where deptno = 10;
10번)
select last_day(hiredate) - hiredate
from emp;



Trackback 0 And Comment 0

2008년 1월 24일

|

최봉의(choibong@empal.com)

-> 오라클 10g, 쿼리, 오라클 개념 소개

14:00 ~15:00

오라클 10g

  1. SQL & PL/SQL
  2. fundamental I => Oracle 구조, 관리개념
  3. fundamental II => backup & recovery, net
  4. performance tuning

Data : 자료 (ex. CJ Systems -> 사원자료 : 사번(숫자), 이름(문자), 주소, 주민번호, 학교, 전화번호...)

DataBase : file system(공유 안됨, 소프트웨어 의존적, 중복...)-> DB( HDB(계층) -> NDB(network DB) -> RDB(관계형 DB : "table" 중심으로, Column, Row(= record, tuple)-> ORDB, OODB

DabaBaseManagement System : software ( 소형(mysql), 중형(ms sql server) , 대형(Oracle, Sybase,DB2)
DataBase System : 사용자(end user, developer : 화면 + logic , DBA : DB관리), DB, DBMS로 구성


15:00 ~ 16:00

Database design approach

  • 업무에 대한 이해

  • 주요한 데이터 객체 파악(entities, attributes, relationships) ER모델링

  •  ER다이어그램

  • 논리적인 설계

  • 속성(특성, 타입)에 대한 정확한 표현

  • 정규화를 통한 검증

  • 실제 데이터 베이스 설계 및 논리적인 데이터


The Classes of Object

  • Entity (사람, 공간, 사물, 사건)
    사람: 고객, 직원
    사물 : 비디오
    장소 : 점포
    행위 : 대여, 가격변동

  • Attributes
    각각의 엔티티에 속성을 찾는다

  • Relationships
    엔티티간의 관계를 찾아낸다.

내가 작성
고객 테이블 ( ID, 이름, 주소, 신용카드, 카드유효기간, 비디오명, 연체료)
직원 테이블 ( 이름, 주소, 전화번호, 입사일, 근무점포, 주민번호, 직급 )
비디오 테이블( 스톡번호,  복사본, 대여로, 비디오 명, 비디오 종류, 대여 상황, 직원이름)
점포 테이블 (점포명, 주소, 매니저이름)
대여료 테이블 (시작일자, 종료일자, 비디오 종류, 대여료)

앞에서 실습(비디오, 대여 테이블 정규화 실시)
고객 : 이름, 번호, 주소, 전화번호, 신용카드번호, 유효일자
직원 : 이름, 주소, 전화번호, 입사일, 근무접포, 주민번호, 직급, 직원번호
점포 : 이름, 주소
비디오 테입 : 번호, 위치, 입고일 (중복되지 않는 것을 추출, 복사본 갯수는 추출이 가능하다.)
비디오 제목 : 타이틀, 장르, 대여료(중복되는 것을 정리)
대여주기록 : 고객번호, 대여일자, 점포번호, 담당직원번호
대여상세기록 : 비디오번호, 반납예정
가격변동 : 비디오장르, 변동일자, 가격

Trackback 0 And Comment 0

연수 과제

|
우선 집에서 볼 수 있는 제품들 ^^ 자취생의 허름한 살림에도 이 정도 있다!!!

사용자 삽입 이미지

식용유 아니죠!! 올리브유 맞습니다 ^^;;

사용자 삽입 이미지

비오는 날엔 부침을 먹지요 ^^

사용자 삽입 이미지

가장 기본이 되는 설탕 ^^

사용자 삽입 이미지

연구실 MT갔다가 챙겨온 육개장입나다.

이제부터는 영화 보러 가는길에 봤던 것들입니다.

사용자 삽입 이미지
뚜레주르~ 투썸 플레이스 ~ 차이나팩토리~ 골드 스톤 ~~

I Love CJ 노래에도 담았던 뚜레주르가 있습니다. ^^


사용자 삽입 이미지

이건 뭘까요 ^^;; 저~~~쪽 전광판에서 나오는 CJ도너스 캠프 광고입니다. ^^ 슈렉과 원색적인 비난이 나오죠(넌 니 이름도 못쓰잖아 ^^;;)

사용자 삽입 이미지

잠시 정차중인 CJ GLS 차량입니다. ^^

사용자 삽입 이미지

여기는 강남 CGV !!! 근처에 콜드스톤, 투썸 플레이스, 빕스, 올리브영, CJ 투자증권 다양한 것들이 있더군요 ^^;; 핸드폰 공간이 별로 없어서 이정도만 찍었습니다.

사용자 삽입 이미지

내셔널 트레져는 전편과 비슷한 방식이고 볼만 합니다. 좀 있으면 나올 인디아나 존스도 기대되는군요 ^^

마지막으로 교수님께 선물(선물로쓰고 뇌물이라고 읽는다)로 드린 한뿌리^^

사용자 삽입 이미지

생각보다 많은 것을 봤습니다. ^^;; 오랜만에 나간 외출에서 교육의 의도대로 충실하게 눈에 쏙쏙 들어 오더군요 ^^ 의식하지 못한채 많은 제품과 서비스를 받고 있었습니다. 앞으로는 카드가 발급되면 더 눈에 들어 올것이라 생각하며 이만 외출미션을 마치겠습니다. ^^
Trackback 0 And Comment 0

포항불빛축제

|
카페에 올렸던 글 퍼왔음

----------------------------------------------------------------------------------

밥먹고 자전거 타고 돌아다니니까 이런거 하고있네요. 그냥 급하게 폰으로 찍었습니다. ^^ 다른 것 보다 용이 꽤 멋있는거 같네요 ^^ 아~~ 계속 가도 덥고 집에 있어도 덥고 역시 포항은 서울 보다 덥습니다. ^^;; 쉬다가 올라가서 빨리 수영이나 해야겠어요. ㅎㅎ

사용자 삽입 이미지

석가탑과 다보탑 사이로 보이는 포항에 작은 타워 ^^;;

사용자 삽입 이미지


물에 연꽃 같은걸 띄워 놓고 저쪽에서 보이는 서치라이트 같은걸로 하늘로 빛을 쏘는데 꽤 괜찮더라고요. 뒤로 보이는 포항제철도 꽤 멋있네요 ^^ 서치라이트하면 배트맨 생각이 ^^;;

사용자 삽입 이미지
사용자 삽입 이미지

하회탈. 각시탈과 양반탈 맞나..^^;; 역시 주입식 교육의 단점.. 생각이 잘 안나는...^^;;

사용자 삽입 이미지
사용자 삽입 이미지

여기서 용이 제일 멋있는거 같아요 ^^;; 한 20미터 정도는 된 것 같은데 근처에 전경들이 안전선 안으로 들어가지 마시라고 이야기 하고 그냥 들어가는 분 한테 버럭~~화를 내는데 더운데 불쌍하기도 하고 재밌기도 하고 그랬어요 ^^;;

사용자 삽입 이미지

원숭이~~~ 그리고 복숭아~~~

사용자 삽입 이미지

멀리서 보고 누가봐도 달마시안이네 라고 외쳤는데 사실 작품명은 강아지가족... ^^;; 이것도 패러디라고 우기는게야... ㅎㅎ

사용자 삽입 이미지

마지막으로 호랑이~~

그래도 휴가와서 계곡도 가고 이런 곳도 가고 좋네요. ^^ 다들 좋은 휴가 보내시고요 ^^ 다음주 토요일에 뵙겠습니다. ^^/

추가로 불꽃놀이사진 ^^;;

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

다리에서 돗자리 펴고 편히 봤어요 ^^;; 다리를 가뿐히 통제해주는 센스 ㅎㅎ
Trackback 0 And Comment 0
prev | 1 | 2 | 3 | 4 | 5 | 6 | 7 | next