달력

12

« 2018/12 »

  •  
  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
  •  

'Oracle/오라클 양성반 15기'에 해당되는 글 6

  1. 2010.09.28 SYSOPER
  2. 2010.09.12 dbca. script, template 이것저것
  3. 2010.09.12 pl/sql exception
  4. 2010.09.12 merge into
  5. 2010.09.12 composite data type , cursor
  6. 2010.09.12 for update
2010.09.28 14:28

SYSOPER Oracle/오라클 양성반 15기2010.09.28 14:28

철저하게 본인 생각에 의해서 쓰여진 부분입니다.


있다는것을 알지만 한번도 들어가본적없을것같은 SYSOPER 테스트.

 

 

oracle database 가 최적의 성능을 발휘하기위해서
선택한 것이 OS에 최적화된성능일것이라 생각된다.
그래서 해당 OS에 맞는 설치파일이 개별로 존재를 하고
각 OS별로 튜닝(하드웨어적인 시스템적인)이 다르다.

완전히 독립적이지 못하다 보니 OS와 떨어져서 예기할수도 없다.

아무튼 중요한건 Oracle DataBase 는 OS와 생각보다 많은 연관이 있다.

 

현업(실제 업무)에서는
DBA가 있고 SE가 있다.
DBA 말그대로 DATABASE Administrator 다.
DATABASE 의 관리자
DATABASE 안의 데이터까지도 전부 컨트롤을 해야하는 사람.

그리고

SE - System Engineer
시스템의 OS또는 하드웨어적인 부분을 컨트롤 하는사람이다.

처음에 말했지만

Oracle은 OS와 많은 연관이 있는 application 이기때문에
계정을 나눴다고 생각이 든다.

SE 에게 하드웨어적인 전체 운영적인 부분의 권한을 주면서도
그렇다고 데이터는 컨트롤 하지 못하게 하는 권한을 생각하다보니
SYSOPER 가 나온것같다.


SE가 database 에 마음대로 접속해서 아무데이터나 막본다면
또는 몰래 가져간다면 그것또한 문제아니겠는가?

 

SYSOPER 의 권한리스트를 보면 아마 정확하게 이해가 가지 않을까 싶다.

1. instance startup, mount, open
2. database open,
3. shutdown
4. dismount database close ,
5. alter database backup archivelog , and recover

딱 보기에도 띄우고 죽이고 이런류의 권한뿐이다.


테스트 한번 해보자.

-- 계정 seman 을 하나 생성한다. 이놈은 이제부터 시스템 엔지니어다.
SQL> create user seman identified by seman;

User created.

SQL>

-- 생성한 계정에 sysoper 권한을 준다.
SQL> grant sysoper to seman;

Grant succeeded.

SQL>


-- 이제 seman 으로 접속해보자 ( sysdba만 치다가 sysoper 치니까 적응이 안된다. )
ocp@orcl> sqlplus seman/seman as sysoper

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Sep 27 15:36:31 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL>

 

############### 이제 SYSOPER 로 이것저것 테스트 해보자. #################

 

CASE 1. select *from tab;

SQL> select *from tab;
TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
MGMT$TARGET                    SYNONYM
MGMT$TARGET_COMPONENTS         SYNONYM
MGMT$TARGET_COMPOSITE          SYNONYM
MGMT$TARGET_PROPERTIES         SYNONYM
MGMT$TARGET_TYPE               SYNONYM
XDB_CONFIGURATION              SYNONYM
XMLROOT                        SYNONYM
XDB_NAMESPACES                 SYNONYM
XDB_DOM_HELPER                 SYNONYM
XDB_UTILITIES                  SYNONYM
XDB_TOOLS                      SYNONYM

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
TEST_SYN1                      SYNONYM
.
.
.

19988 rows selected

SQL>

일단 뭔가 select는 된다.
헌데 좀 특이하다. 보통 이것저것 막나오는데 보기에 시노님만 보인다.
그럼 ... view는??? .... table은 ???

이렇게 날려보자.

SQL> select *From tab where TABTYPE = 'TABLE';

no rows selected

SQL> select *from tab where TABTYPE = 'VIEW';

no rows selected

SQL>

헛. 역시나 다 없단다.

 

CASE 2. 현재 인스턴스의 상태를 확인. ( select instance_name, status from v$instance )

SQL> select instance_name, status from v$instance;
select instance_name, status from v$instance
                                  *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL>

없다고 나온다. (당연할것이다. CASE 1 에서 view 를 못찾았으니.)
뭔가가 객체가 없다고 나오면 권한이 없다는 뜻아니겠는가~

 

CASE 3. 그럼 사용자를 조회해보자. (DBA_USERS)

 

SQL> select *From ALL_USERS;

SQL> select *from DBA_USERS;
select *from DBA_USERS
             *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL>

역시나 없다고 나온다.

 

CASE 4. 그럼 시스템이나 내려보자.


SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>

 

오~ 이건된다.

 

CASE 5. 시스템을 올려보자.

 

SQL> startup
ORACLE instance started.
Database mounted.
Database opened.
SQL>

음..... 역시나 성공..

 

CASE 6. 마지막 계정생성


SQL> create user goodman identified by oracle;
create user goodman identified by oracle
                                  *
ERROR at line 1:
ORA-01031: insufficient privileges


SQL>

 

예상했지만 역시나.......

 

CASE 4,5 를 제외한 조회또는 계정생성등의 작업은 전부 작업이 불가능했다.

 

위의 사항을 봤을때 SYSOPER와 SYSDBA가

역할이 분명해진다. 또한 누가 상위인지 보여진다.


최상위 권한인 SYSDBA는 SYSOPER 를 포함하고있다.
SYSOPER 는 부분집합이라고 할수있겠다.

그것도 OS와 연관이 있는 ( 실제 운영체제에 프로세스가 띄워지는 역할. 혹시나 예기하지만 alter system set .. 으로 메모리를 조절하는것은 분명 OS와도 연관은 있겠으나 이것또한 SYSDBA 권한. ) 일 말고는 할수있는것이 없는 권한이라고 생각해볼수있다.


DATABASE와 OS 간의 경계의 선을 그어주는 권한이라고 생각해볼수 있겠다.

 

뭔가 이상있으면 ㅡ_ㅡ;; 댓글주세요.

 

원래는 차이점을 설명하고 싶었으나

SYSDBA가 다된다라는 사실은 우리가 모두 알고있기에 SYSOPER가 뭐가되는지만 설명함.


'Oracle > 오라클 양성반 15기' 카테고리의 다른 글

SYSOPER  (0) 2010.09.28
dbca. script, template 이것저것  (0) 2010.09.12
pl/sql exception  (0) 2010.09.12
merge into  (0) 2010.09.12
composite data type , cursor  (0) 2010.09.12
for update  (0) 2010.09.12
Posted by ORACLE,DBA,BIG,DATA,JAVA 흑풍전설

템플릿 : 플라스틱이나 아크릴로 만든 얇은 판에 여러 가지 크기의 원 또는 타원 등과 같은 기본도형이나 각종 문자기호 등을 그리는 제도용구.

 

본인이 아는 템플릿의 정의는 붕어빵기계다.

아마도 웹디자인을 했던사람이라면 더욱더 잘 알만한 말같다.

 

템플릿의 가장큰 특징은

정해진 양식. 또는 정해진 구성을 가지고 약간만의 수정을 통해서 짧은 시간에 많은 결과물을 낼수있다고 하는것이 가장 큰것이 아닐까하고 생각이 된다.

 

오라클의 DBCA에 template 옵션이 있는데.

사실은 모르겠다.

흔히들 알고있는 템플릿의 용도같아보이며 이것또한

간단한 몇가지 설정을 통해서 바로 또다른 DB를 생성할수있는 용도로 보인다.

 

우선 db 하나를 dbca를 통해서 생성을 했다. 물론 template 옵션을 활성화하고나서.(여기는 따라하기로 누구나 next next해서 했을테니 패스)

그러고나서 다시 dbca를 들어가서 보기로 했다.

 

 

1. dbca 를 통해서 prod1 라는 이름으로 DB를 생성 , script 및 template 생성.

2. create 후 application 종료되면 다시 dbca를 들어가본다.

 

ㄱ) dbca 화면



ㄴ) create database 선택


ㄷ) 목록에 template 를 만든 prod1이 보인다. prod1 을 선택하고 다음~~
※ 이걸봤을때는 적어도 이 목록에 보이는것들
기존의 4가지도 템플릿으로 이루어져있다는것으로 판단이 된다.



ㄹ) prod2 생성



ㅁ) prod2의 템플릿을 다시생성후 다시 또 create


ㅂ) 생성~~~~



여기서 예상해볼수있는것은

dbca로 template 를 만들면 내부적으로 목록을 관리하는듯보인다.

그 템플릿을 언제라도 사용할수있도록 저렇게 목록에서도 활성화된다는것으로 판단할수있다.

 

SCRIPTS

=============================================================================================================

 

$ORACLE_BASE/admin/

안에 들어가보자~~


여러가지 파일이 생겼다.

 

prod2.sh 라는 파일이 생겼으며 755인걸 봐선 쉘실행파일로 보여진다.

안에 뭐가 있을라나?

 

[oracle@ora1 scripts]$ cat prod2.sh
#!/bin/sh

mkdir -p /u01/app/oracle/admin/prod2/adump
mkdir -p /u01/app/oracle/admin/prod2/bdump
mkdir -p /u01/app/oracle/admin/prod2/cdump
mkdir -p /u01/app/oracle/admin/prod2/dpdump
mkdir -p /u01/app/oracle/admin/prod2/pfile
mkdir -p /u01/app/oracle/admin/prod2/udump
mkdir -p /u01/app/oracle/product/10.2.0/cfgtoollogs/dbca/prod2
mkdir -p /u01/app/oracle/product/10.2.0/dbs
mkdir -p /u02/oradata/prod2
ORACLE_SID=prod2; export ORACLE_SID
echo You should Add this entry in the /etc/oratab: prod2:/u01/app/oracle/product/10.2.0:Y
/u01/app/oracle/product/10.2.0/bin/sqlplus /nolog @/u01/app/oracle/admin/prod2/scripts/prod2.sql
[oracle@ora1 scripts]$

 

실행파일이 저런것으로 보아.

추후에~~~ 어디에선가~~~ 다른 서버에 같은 환경에서 같은 DB를 또 설치를 할때 이~~ sh를 이용하면 한번에 될것으로보인다

 

생각해보면 별로 쓸모는 없다.

 

디렉토리도 고정이고 SID도 고정이며 각기 다른파일을 열어보면 prod2이라는 이름이 고정으로 들어가있다.

그 말인 즉슨 내가 원하는 디렉토리 원하는 SID명을 변경은 안된다.

 

자 이~~~ XX같은것을 왜쓸까???????

 

쓸곳이 있다.~~~적어도 내가 겪었던 업무라면 분명 쓸수있다. ㅎㅎ;;

직접적으로 예는 못들어도 이런경우를 예를 들어보자.

 

전국에 100여개의 매장이 있다.

음 매장은 컴퓨터를 파는 매장이라고 치자~

하드웨어의 성능의 문제로 인해서 또는 여타 다른 문제로 인해서 각 매장은 각각자체적인 DB를 내부적으로 구축하고

저녁 6시이후 마감시간이 되면 취합을 해야하는 시스템이라고 치자.

 

물론 이경우 저녁에 일괄적으로 적용하는 통합하는 방법이 있으나 일단 그건 패스하자 ~~~ 예제니까.

 

100여개의 매장에 같은 DB를 설치를 하러

DB엔지니어닌 나는 100여군데를 돌아다니면서 각각 설치를 해줘야한다.

정말 D.O.G. 고생 이다.

 

매장마다 들러서 dbca라고 명령어를 쳐서 계속 같은 설정을 하고 있어야할까??????

 

이왕 이럴바에는 script를 만들어서 sh파일만 실행하면 편할듯하다.

 

그럼 같은 환경의 같은 DB가 생성된다.

 

===================================================================================================================

이제 잡소리는 그만하고 sh를 직접 돌려보자.

 

기존에 DB를  DROP 하더라로 해당 스크립트는 잘 남아있으니 걱정말고 날려버리자.

 

기존에 본인의 컴퓨터에서 돌리면 prod2가 이미 있으므로 에러가 날테니 우선 drop 을 하자

그래픽적인 ui보단 console를 좋아하는 나로서는 ~~ sqlplus 에서 drop하련다.

[oracle@ora1 scripts]$ export ORACLE_SID=prod2
[oracle@ora1 scripts]$ sqlplus

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 7 08:02:04 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Enter user-name: /as sysdba

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount exclusive restrict
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  2019288 bytes
Variable Size              79691816 bytes
Database Buffers           79691776 bytes
Redo Buffers                6369280 bytes
Database mounted.
SQL> drop database;

Database dropped.

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL>

이제 sh 파일 실행준비

 

sys,system 비밀번호를 입력하면 나머지는 알아서 한다.

 

아래화면 내용은 실행한 결과.

 

[oracle@ora1 tempsss]$ ./prod2.sh
You should Add this entry in the /etc/oratab: prod2:/u01/app/oracle/product/10.2.0:Y

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 7 08:10:53 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

specify a password for sys as parameter 1
Enter value for 1: oracle <-- sys 비밀번호 입력
specify a password for system as parameter 2
Enter value for 2: oracle <-- system 비밀번호 입력.

Connected to an idle instance.
SQL> spool /u01/app/oracle/admin/prod2/scripts/CloneRmanRestore.log
SQL> startup nomount pfile="/u01/app/oracle/admin/prod2/scripts/init.ora";
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  2019288 bytes
Variable Size              75497512 bytes
Database Buffers           83886080 bytes
Redo Buffers                6369280 bytes
SQL> @/u01/app/oracle/admin/prod2/scripts/rmanRestoreDatafiles.sql;
SQL> set echo off;

TO_CHAR(SYSTIMEST
-----------------
20100907 08:11:18

Allocating device....
Specifying datafiles...
Specifing datafiles...
Restoring ...
Restore done.

PL/SQL procedure successfully completed.


TO_CHAR(SYSTIMEST
-----------------
20100907 08:11:49

Connected.
SQL> spool /u01/app/oracle/admin/prod2/scripts/cloneDBCreation.log
SQL> Create controlfile reuse set database "prod2"
  2  MAXINSTANCES 8
  3  MAXLOGHISTORY 1
  4  MAXLOGFILES 16
  5  MAXLOGMEMBERS 3
  6  MAXDATAFILES 100
  7  Datafile
  8  '/u02/oradata/prod2/system01.dbf',
  9  '/u02/oradata/prod2/undotbs01.dbf',
 10  '/u02/oradata/prod2/sysaux01.dbf',
 11  '/u02/oradata/prod2/users01.dbf'
 12  LOGFILE GROUP 1 ('/u02/oradata/prod2/redo01.log') SIZE 51200K,
 13  GROUP 2 ('/u02/oradata/prod2/redo02.log') SIZE 51200K,
 14  GROUP 3 ('/u02/oradata/prod2/redo03.log') SIZE 51200K RESETLOGS;

Control file created.

SQL> exec dbms_backup_restore.zerodbid(0);

PL/SQL procedure successfully completed.

SQL> shutdown immediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL> startup nomount pfile="/u01/app/oracle/admin/prod2/scripts/initprod2Temp.ora";
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  2019288 bytes
Variable Size              75497512 bytes
Database Buffers           83886080 bytes
Redo Buffers                6369280 bytes
SQL> Create controlfile reuse set database "prod2"
  2  MAXINSTANCES 8
  3  MAXLOGHISTORY 1
  4  MAXLOGFILES 16
  5  MAXLOGMEMBERS 3
  6  MAXDATAFILES 100
  7  Datafile
  8  '/u02/oradata/prod2/system01.dbf',
  9  '/u02/oradata/prod2/undotbs01.dbf',
 10  '/u02/oradata/prod2/sysaux01.dbf',
 11  '/u02/oradata/prod2/users01.dbf'
 12  LOGFILE GROUP 1 ('/u02/oradata/prod2/redo01.log') SIZE 51200K,
 13  GROUP 2 ('/u02/oradata/prod2/redo02.log') SIZE 51200K,
 14  GROUP 3 ('/u02/oradata/prod2/redo03.log') SIZE 51200K RESETLOGS;

Control file created.

SQL> alter system enable restricted session;

System altered.

SQL> alter database "prod2" open resetlogs;

Database altered.

SQL> alter database rename global_name to "prod2";

Database altered.

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u02/oradata/prod2/temp01.dbf' SIZE 20480K REUSE AUTOEXTEND ON NEXT 640K
MAXSIZE UNLIMITED;

Tablespace altered.

SQL> select tablespace_name from dba_tablespaces where tablespace_name='USERS';

TABLESPACE_NAME
------------------------------
USERS

SQL> select sid, program, serial#, username from v$session;

       SID PROGRAM                                             SERIAL#
---------- ------------------------------------------------ ----------
USERNAME
------------------------------
       155 oracle@ora1.oracle.com (QMNC)                             1


       160 sqlplus@ora1.oracle.com (TNS V1-V3)                       1
SYS

       161 oracle@ora1.oracle.com (MMNL)                             3

 

       SID PROGRAM                                             SERIAL#
---------- ------------------------------------------------ ----------
USERNAME
------------------------------
       162 oracle@ora1.oracle.com (MMON)                             3


       163 oracle@ora1.oracle.com (RECO)                             1


       164 oracle@ora1.oracle.com (SMON)                             1

 

       SID PROGRAM                                             SERIAL#
---------- ------------------------------------------------ ----------
USERNAME
------------------------------
       165 oracle@ora1.oracle.com (CKPT)                             1


       166 oracle@ora1.oracle.com (LGWR)                             1


       167 oracle@ora1.oracle.com (DBW0)                             1

 

       SID PROGRAM                                             SERIAL#
---------- ------------------------------------------------ ----------
USERNAME
------------------------------
       168 oracle@ora1.oracle.com (MMAN)                             1


       169 oracle@ora1.oracle.com (PSP0)                             1


       170 oracle@ora1.oracle.com (PMON)                             1

 

12 rows selected.

SQL> alter database character set INTERNAL_CONVERT WE8ISO8859P1;

Database altered.

SQL> alter database national character set INTERNAL_CONVERT AL16UTF16;

Database altered.

SQL> alter user sys identified by "&&sysPassword";

User altered.

SQL> alter user system identified by "&&systemPassword";

User altered.

SQL> alter system disable restricted session;

System altered.

SQL> @/u01/app/oracle/admin/prod2/scripts/postScripts.sql
SQL> connect "SYS"/"&&sysPassword" as SYSDBA
Connected.
SQL> set echo on
SQL> spool /u01/app/oracle/admin/prod2/scripts/postScripts.log
SQL> @/u01/app/oracle/product/10.2.0/rdbms/admin/dbmssml.sql;
SQL> CREATE OR REPLACE LIBRARY dbms_sumadv_lib AS '/u01/app/oracle/product/10.2.0/lib/libqsmashr.so';
  2  /

Library created.

SQL> execute dbms_datapump_utl.replace_default_dir;

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

SQL> connect "SYS"/"&&sysPassword" as SYSDBA
Connected.
SQL> alter session set current_schema=ORDSYS;

Session altered.

SQL> @/u01/app/oracle/product/10.2.0/ord/im/admin/ordlib.sql;
SQL> create or replace library ORDIMLIBS as '/u01/app/oracle/product/10.2.0/lib/libordim10.so';
  2  /

Library created.

SQL> create or replace library ORDIMLIBT trusted as static;
  2  /

Library created.

SQL>
SQL> Rem ordimasf.jar is only available via download from the
SQL> Rem Oracle Technology Network website. Go to the interMedia section of
SQL> Rem http://otn.oracle.com.
SQL> Rem
SQL> Rem Uncomment the following lines after downloading ordimasf.jar.
SQL>
SQL> -- BEGIN
SQL> -- dbms_java.loadjava('-synonym -schema ORDSYS -resolve -grant PUBLIC ord/jlib/ordimasf.jar');
SQL> -- EXCEPTION
SQL> -- WHEN OTHERS THEN
SQL> --   NULL;
SQL> -- END;
SQL> -- /
SQL> alter session set current_schema=SYS;

Session altered.

SQL> connect "SYS"/"&&sysPassword" as SYSDBA
Connected.
SQL> connect "SYS"/"&&sysPassword" as SYSDBA
Connected.
SQL> execute dbms_swrf_internal.cleanup_database(cleanup_local => FALSE);

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

SQL> spool off
SQL> @/u01/app/oracle/admin/prod2/scripts/postDBCreation.sql
SQL> connect "SYS"/"&&sysPassword" as SYSDBA
Connected.
SQL> set echo on
SQL> spool /u01/app/oracle/admin/prod2/scripts/postDBCreation.log
SQL> connect "SYS"/"&&sysPassword" as SYSDBA
Connected.
SQL> set echo on
SQL> create spfile='/u01/app/oracle/product/10.2.0/dbs/spfileprod2.ora' FROM pfile='/u01/app/oracle/admin/prod2/sc                         ripts/init.ora';

File created.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> connect "SYS"/"&&sysPassword" as SYSDBA
Connected to an idle instance.
SQL> startup ;
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  2019288 bytes
Variable Size              75497512 bytes
Database Buffers           83886080 bytes
Redo Buffers                6369280 bytes
Database mounted.
Database opened.
SQL> select 'utl_recomp_begin: ' || to_char(sysdate, 'HH:MI:SS') from dual;

'UTL_RECOMP_BEGIN:'||TO_CH
--------------------------
utl_recomp_begin: 08:13:52

SQL> execute utl_recomp.recomp_serial();

PL/SQL procedure successfully completed.

SQL> select 'utl_recomp_end: ' || to_char(sysdate, 'HH:MI:SS') from dual;

'UTL_RECOMP_END:'||TO_CH
------------------------
utl_recomp_end: 08:14:02

SQL> spool /u01/app/oracle/admin/prod2/scripts/postDBCreation.log
SQL>

 

=================================================================================================================

instance 가 실행됬으며 process가 떠있는것도 확인~

 

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
prod2            OPEN

SQL>    

 

=================================================================================================================

 

뭔가 좀 이상허다......

 

위처럼 이상없이는 되나. 만약 디렉토리를 변경해서 실행하면 잘될까???

 

아래는 기존 admin/prod2 의 정보가 있는곳의 디렉토리를 변경하고

[oracle@ora1 admin]$ mv prod2/ prod2_old/

 

/tempsss 로 관련 파일을 전부 복사했다.

[oracle@ora1 tempsss]$ pwd
/tempsss
[oracle@ora1 tempsss]$ ls
cloneDBCreation.sql   init.ora           postDBCreation.sql  prod2.sh   rmanRestoreDatafiles.sql
CloneRmanRestore.sql  initprod2Temp.ora  postScripts.sql     prod2.sql
[oracle@ora1 tempsss]$   


실행하면?

[oracle@ora1 tempsss]$ ./prod2.sh
You should Add this entry in the /etc/oratab: prod2:/u01/app/oracle/product/10.2.0:Y

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 7 09:20:22 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SP2-0310: unable to open file "/u01/app/oracle/admin/prod2/scripts/prod2.sql"
SQL>

 

역시나 예상대로 열수없다는 메세지.

디렉토리가 고정이어서 같은 하드웨어및 버전의 시스템에서 디렉토리도 위치도 그대로 $ORACLE_BASE/admin/SID_NAME/scrips 를 만들어서 그곳에서 실행을 해야하는 불편함은 보인다.

==================================================================================================================

이제 템플릿과 스크립트의 용도가 대충 보인다.

 

템플릿은 기존에 구성했던 여러가지 정보(디렉토리, 메모리 구성, 디스크구성등의 정보)를 설정한 내용을 저장해서.

추후에도 사용할수있도록 한다라는것이 주된기능이다.

 

또한 이 템플릿은 사일런트 모드 INSTALL에서 템플릿을 참조 해서도 설치할수있다.(설치 성공후 업데이트예정)

 

 

그리고 스크립트의 기능은 현재 설치했던 DB정보를 그대로 타 시스템에서 그대로 적용하고 싶을때 GUI화면이 없이 바로 적용할수있다라고 보여진다.

 

실제 스크립트 자체에서 디렉토리의 변경정보가 없어서 약간 부족함이 보이긴하나

같은 인스턴스의 DB를 여러군데 설치를 해야할경우 후딱~ 설치할수있는 기능정도로 보면 어떨까 ?

'Oracle > 오라클 양성반 15기' 카테고리의 다른 글

SYSOPER  (0) 2010.09.28
dbca. script, template 이것저것  (0) 2010.09.12
pl/sql exception  (0) 2010.09.12
merge into  (0) 2010.09.12
composite data type , cursor  (0) 2010.09.12
for update  (0) 2010.09.12
Posted by ORACLE,DBA,BIG,DATA,JAVA 흑풍전설
2010.09.12 22:42

pl/sql exception Oracle/오라클 양성반 15기2010.09.12 22:42


Exception

PL/SQL을 작성할때 예기치 않은 오류를 발생할경우 처리할수있는 구문

일반 개발언어의

exception , try catch 구문과 흡사하다.

 

PL/SQL내에서

여러가지 복잡한 조건을 처리하다보면 생각하지 못했던 오류들이 발생할수있다.

또한 그런 오류가 발생했을때 사용자가 오류화면만 보고 아무것도 알지 못하는 상황이 발생하게 될수가 있기때문에

 

PL/SQL내부에서 작성자가 예상할수있는 부분을 예외처리를 통해서

그 예외가 발생했을때 무슨일이 있어도 어떠한 액션을 취하게끔 해주는 역할을 한다.

 

예를 들면

누군가 인터넷 뱅킹으로 100만원을 입금하고있다.

프로그램 내부에서는 어떤 입금관련 sql이 실행되고있다. (물론 이 sql은 pl/sql로 작성되어있다.)

그런데 예기치 못하게 내부에서 오류가 발생을 했다.

그러면 트랜잭션은 시작은 되었으나 종료를 하지 못하고 계속 대기상태가 되버린다.

 

어느정도 예상할수있는 또는 예상할수없는 상황 ( 개발자도 사람이기에 모든 상황을 완벽하게 파악을 하지 못한다. )

등을 처리하기위해서

exception 을 두어 알수없는 exception이 발생하면

rollback 을 하도록 처리한다.

 

그러면 데이터는 문제가 없어지고 , 트랜잭션도 이상없이 종료가 된다.

 

 

* 일반적인 사용방법 1

( ORACLE에서 제공하는 기본적인 메세지를 활용 하고 싶을때 )

declare
    v_val employees.employee_id%type;
begin
   
    /* SQL 작성부분 */
    
   /* 없는 데이터를 조회 */
   select
        employee_id into v_val
   from
        employees
   where
        employee_id = 1999;
     
    
    /* 예외 처리 */
    exception
        when NO_DATA_FOUND then
        dbms_output.put_line('NO_DATA');
       
end;
/

결과) NO_DATA

ORA-XXXXX의 오류가 나지 않고 해당 exception 의 NO_DATA_FOUND 에 적용되어 관련 메세지가 출력.

 

* 일반적인 사용방법 2

( 임의 exception을 정의하여 PL/SQL개발자가 직접 특정 부분에서 exception 을 발생시키고 싶을때 )

declare

    v_test_exp1 exception;
  
begin
   
    /* SQL 작성부분 */
    IF 5 > 3 THEN
    raise v_test_exp1; -- raise 해당 exception 발생시킴
    END IF ;
   
    /* 예외 처리 */
    exception
        when v_test_exp1 then
        dbms_output.put_line('v_test_exp1 ====> '||SQLCODE||'--'||SQLERRM);
        when others then
        dbms_output.put_line(q'[I don't know]');
       
end;
/

결과)v_test_exp1 ====> 1--User-Defined Exception

* ORA-00000 의 에러 발생을 예외처리하는예제)

(오라클 오류발생을 PL/SQL에서 개별 사용자메세지로 보여주고 싶을때.)

declare

    v_test_exp1 exception;
    pragma exception_init(v_test_exp1, -01400);
    /* 오라클 01400 에러를 재정의 */
   
begin
   
    /*

    SQL 작성부분

    이미 있는 값을 넣어본다.

    */


    insert into jobs (job_id) values('AC_ACCOUNT');   -- 이부분에서 이미 있는 데이터를 입력해서 ORA-01400 에러를 발생
    
    /* 예외 처리 */
    exception
        when v_test_exp1 then
        dbms_output.put_line('v_test_exp1 ====> '||SQLCODE||'--'||SQLERRM);
        when others then
        dbms_output.put_line(q'[I don't know]');
       
end;
/

 

결과 ) v_test_exp1 ====> -1400--ORA-01400: cannot insert NULL into ("HR"."JOBS"."JOB_TITLE")

 

 

* ORA-XXXXX 의 오류를 직접 정의하고 싶을때

declare

    v_test_exp1 exception;
    pragma exception_init(v_test_exp1, -20991);
  
begin
   
    /* SQL 작성부분 */
   
  
   
    IF 5 > 3 THEN
    raise v_test_exp1;
    END IF ;
   
    /* 예외 처리 */
    exception
        when v_test_exp1 then
        raise_application_error(-20991,'Test Message');
        
        when others then
        dbms_output.put_line(q'[I don't know]');
       
end;
/

 

결과 ) ORA-20991: Test Message;

'Oracle > 오라클 양성반 15기' 카테고리의 다른 글

SYSOPER  (0) 2010.09.28
dbca. script, template 이것저것  (0) 2010.09.12
pl/sql exception  (0) 2010.09.12
merge into  (0) 2010.09.12
composite data type , cursor  (0) 2010.09.12
for update  (0) 2010.09.12
Posted by ORACLE,DBA,BIG,DATA,JAVA 흑풍전설
2010.09.12 22:42

merge into Oracle/오라클 양성반 15기2010.09.12 22:42

프로그램을 개발하면

특정 테이블에 데이터를 넣거나 아니면 수정하거나 할일이 있다.

 

보통 개발을 하게되면

개발 언어로 해당 데이터가 있는지 없는지 확인(select 실행)을 하고

데이터가 있으면 수정 ( update 실행 )

데이터가 없으면 삽입 ( insert 실행 )

 

이런류의 작업을 주로 한다.

 

이 작업이 조금 개선이 되면

 

처음부터 데이터를 수정(update 실행)을 시도 하거나 삽입(insert 실행)을 시도한다.

그리고나서 그결과가 실패면 반대의 작업을 한다.

 

 

이런 작업을 프로그램상에서 select 문, update 문 , insert 문을 실행하는것보다.

한번에 해당 요청을 한번에 해서 오라클자체 내에서 처리하는것이 이득일것이라고

본다.

 

오라클에서는 merge 라는 기능으로 이러한 작업을 SQL문으로 편하게 처리할수있도록

하여 성능은 향상이 되고 , 프로그램상의 코딩량을 줄여준다.

 

 

 

특정의 한테이블에 데이터를 수정및 삽입을 할경우USING 에 DUAL을 쓴다.

 

MERGE INTO 테이블명

USING DUAL

ON ( 조건 )

WHEN MATCHED THEN

UPDATE SET

WHEN NOT MATCHED THEN

INSERT (컬럼명1,컬럼명2)

VALUES(값1,값2);

 

테이블 A와 테이블 B를 비교하여

데이터가 있으면 삽입 , 없으면 수정 한다.

 

MERGE INTO 테이블명

USING 조인테이블

ON ( 테이블명.column = 조인테이블.column )

WHEN MATCHED THEN

UPDATE SET

WHEN NOT MATCHED THEN

INSERT (컬럼명1,컬럼명2)

VALUES(값1,값2);

 

 

예제)

jobs 테이블 조회.

JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
AD_PRES    President                                20000      40000
AD_VP      Administration Vice President            15000      30000
AD_ASST    Administration Assistant                  3000       6000
AC_MGR     Accounting Manager                        8200      16000
AC_ACCOUNT Public Accountant                         4200       9000
SA_MAN     Sales Manager                            10000      20000
SA_REP     Sales Representative                      6000      12000
ST_MAN     Stock Manager                             5500       8500
ST_CLERK   Stock Clerk                               2000       5000
IT_PROG    Programmer                                4000      10000
MK_MAN     Marketing Manager                         9000      15000

JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
MK_REP     Marketing Representative                  4000       9000

12 rows selected.

SQL>

 

 

##################### MERGE INTO insert 일경우 #######################

 

declare

    n_job_id    jobs.job_id%type;
    n_job_title jobs.job_title%type;
   
begin

/* BABO 라는 job_id 가 없기때문에 insert 를 한다. */

n_job_id := 'BABO';
n_job_title := 'STUDY MAN';

 

merge into jobs
using DUAL
on ( job_id = n_job_id )
when matched then
update set
job_title = n_job_title
when not matched then
insert (job_id,job_title)
values (n_job_id, n_job_title);

end;
/

 

결과

SQL> select *From jobs;

JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
BABO       STUDY MAN
AD_PRES    President                                20000      40000
AD_VP      Administration Vice President            15000      30000
AD_ASST    Administration Assistant                  3000       6000

 

##################### MERGE INTO update 일경우 #######################

 

declare

    n_job_id    jobs.job_id%type;
    n_job_title jobs.job_title%type;
   
begin

/* AC_ACCOUNT라는 job_id 가 있기때문에 update 를 한다. */

n_job_id := 'AC_ACCOUNT';
n_job_title := 'TEST';

 

merge into jobs
using DUAL
on ( job_id = n_job_id )
when matched then
update set
job_title = n_job_title
when not matched then
insert (job_id,job_title)
values (n_job_id, n_job_title);

end;
/

 

결과 )

SQL> select *From jobs where job_id = 'AC_ACCOUNT';

JOB_ID     JOB_TITLE                           MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
AC_ACCOUNT TEST                                      4200       9000

SQL>

'Oracle > 오라클 양성반 15기' 카테고리의 다른 글

SYSOPER  (0) 2010.09.28
dbca. script, template 이것저것  (0) 2010.09.12
pl/sql exception  (0) 2010.09.12
merge into  (0) 2010.09.12
composite data type , cursor  (0) 2010.09.12
for update  (0) 2010.09.12
Posted by ORACLE,DBA,BIG,DATA,JAVA 흑풍전설

PL/SQL

(미리말하지만 ㅡ_ㅡ;; 전 글재주가 없습니다.)

/**************************************************************************/

 

composite data type

 

기본적인 하나의 데이터 타입 ( 스칼라 데이터 타입 )
1개이상의 데이터를 묶어서 만든 데이터 타입

 

============ Record ============

* Record : 하나이상의 기본 자료형을 모아서 만든 사용자 정의 데이터 타입.
(개발언어에서의 클래스 , type, 구조체와 비슷함)

 

 

    A. 기본구문 :   
       Type type_name IS RECORD
        (column_name1, column_name2,column_name3 ... );
       
    B. 예 :
        TYPE emp_record_type IS RECORD
            (last_name  varchar(25),
             job_id     varchar(10),
             salary     number(10));
       
        (레코드변수)    (레코드 타입)
        emp_record      emp_record_type;  
       
   
    C. 사용방법 :
       
        emp_recor.last_name  := '홍길동';
        emp_recor.job_id     := 'job';
        emp_recor.salary     := 15000;
       
        ※ last_name, job_id, salary 는 "멤버" 라고 함.
   
   
    D. 작성순서 :
        1. 레코드 타입 정의.
        2. 레코드 변수 정의.
        3. 멤버변수에 값을 할당. ( memory write )
        4. 멤버변수값 활용. ( memory read )
   
    E. 관련 연습 문제 :
   
        문제)
        레코드 타입으로 사원의 사번, 이름, 입사일자를 출력하는 프로그램을 작성하시오.
        단, 사번은 치환 변수를 사요하시오.
       
        출력예시
            Emp# : 7788
            Emp_name : SCOTT
            Emp_hiredate : 87/04/19
           
       
        답)
        SQL>conn scott/tiger
        SQL>set serveroutput on
       
        SQL>
        declare
      
            /**************************************************
                --레코드 변수 기본구문
               
                TYPE 레코드이름 IS RECORD
                (
               
                );
            **************************************************/
           
            TYPE emp_record IS RECORD
            (
                 v_empno        number,
                 v_ename        varchar(30),
                 v_hiredate     date
            );
           
            emp_rec     emp_record;
          
        begin
                select
                    empno,
                    ename,
                    hiredate
                        into
                        emp_rec.v_empno,
                        emp_rec.v_ename,
                        emp_rec.v_hiredate
                from
                    emp
                where
                    empno = &pempno;
                   
                DBMS_OUTPUT.PUT_LINE('사번 : '||emp_rec.v_empno);
                DBMS_OUTPUT.PUT_LINE('이름 : '||emp_rec.v_ename);
                DBMS_OUTPUT.PUT_LINE('입사일자 : '||emp_rec.v_hiredate);
        end;
        /
       
        결과)       
        Enter value for pempno: 7788
        old  33:                     empno = &pempno;
        new  33:                     empno = 7788;
        사번 : 7788
        이름 : SCOTT
        입사일자 : 1987-04-19 00:00:00
       
        PL/SQL procedure successfully completed.
       
        SQL>

 

 

============ Collection ============

* Collection : 동일한 자료형을 모아놓은 무한 집합체의 개념
(개발언어에서의 array,collection과 비슷한 개념)

 

※ 동일한 자료를 모아놓은 개념은 맞다.

여기서 동일한 자료는 특정데이터형의 여러가지데이터이다.

A. 기본구문 :   

TYPE type_name IS TABLE OF

레코드처럼 원하는 데이터형정의

index by PLS_INTEGER; <----- 이구문은 있어도 되고 없어도 된다.

 

B. 예제 :

declare

    type col_test_value is table of emp.ename%type;
 
    ct_val col_test_value;
   
begin
   
    select
        ename

         
            bulk collect

            into  
            ct_val
    from
        emp;
       
    dbms_output.put_line('ename=>ct_val=>'||ct_val(1) );
    dbms_output.put_line('ename=>ct_val=>'||ct_val(2) );
    dbms_output.put_line('ename=>ct_val=>'||ct_val(3) );
    dbms_output.put_line('ename=>ct_val=>'||ct_val(5) );
  
end;
/

 

 

결과)

ename=>ct_val=>SMITH
ename=>ct_val=>ALLEN
ename=>ct_val=>WARD
ename=>ct_val=>MARTIN

 

bulk collect : 왜  쓰는지는 검색을 해도 좋은 답을 얻지 못했습니다.

개인적인 생각 ( bulk collect 는 보통 데이터를 select해서 가져온 데이터는 보통 PL/SQL 작성시 한행단위로

개발을 하거나 데이터를 저장하고 있는데 이 is table of 같은 것은 데이터를 여러건을

특정 메모리공간에 넣어주어야 하기때문에 그공간을 미리 확보를 해야하기에

그 공간을 확보하겠다는 의미로 보여진다. 그래서 collect 아닐까;;; )

 

안쓰게 되면. ORA-06550 에러 ( sql문에는 로컬 모음이 유형이 허용되지 않음 )

 

※ index 번호는 1번부터 시작.

 

 

예제) 특정테이블 전체의 데이터를 collection 으로 사용가능

 

declare

    type col_test_value is table of emp%rowtype;
 
    ct_val col_test_value;
   
begin
   
    select
        *
            bulk collect
            into  
           
            ct_val
    from
        emp;
       
    dbms_output.put_line('ename=>ct_val=>'||ct_val(1).ename||'---'||ct_val(1).empno);
    dbms_output.put_line('ename=>ct_val=>'||ct_val(2).ename||'---'||ct_val(2).empno);
    dbms_output.put_line('ename=>ct_val=>'||ct_val(3).ename||'---'||ct_val(3).empno);
    dbms_output.put_line('ename=>ct_val=>'||ct_val(5).ename||'---'||ct_val(5).empno);
  
end;
/

 

결과)

ename=>ct_val=>SMITH---7369
ename=>ct_val=>ALLEN---7499
ename=>ct_val=>WARD---7521
ename=>ct_val=>MARTIN---7654

/**************************************************************************/

커서란?

내생각은 아니고 여러군데 검색을 해보면.

- 특정한 sql영역을 가리키는 핸들

- SQL Plus에서 사용자가 실행한 SQL문의 단위를 의미합니다

- 커서는 Private SQL의 작업영역 입니다

- 쿼리문장에 의하여 생성된 데이터 셋트
- 데이터셋트 자체를 cursor 라고 해도 무방.

이런뜻이라고 한다.

 

기본구문
    cursor cursor_name is
    select_statement;

 

명시적 커서 사용 철차

1) 커서 만들기
    declare 절에 커서를 생성(select 구문)
2) 커서 열기
    Open 커서이름;
3) 1행씩 가져 오기 : Fetch
    into 절 반드시 사용할 것 (데이터가 없을때까지 fetch)
4) 커서 닫기
    close 커서이름;

 

 예제)

declare
    cursor emp_cursor is
    select
        empno,
        ename
    from
        emp
    where
        deptno = 30;
       
    v_empno emp.empno%type;
    v_ename emp.ename%type;
    begin
        open emp_cursor; -- 커서 열기
  
        /*
            fetch 커서 내에서 1건씩 데이터 꺼내기
            into 절을 사용, select ... into 절과 유사하다.
        */    
       
        fetch emp_cursor into v_empno,v_ename;
        dbms_output.put_line('v_empno=>'||v_empno||'----'||'v_ename=>'||v_ename);
       
        fetch emp_cursor into v_empno,v_ename;
        dbms_output.put_line('v_empno=>'||v_empno||'----'||'v_ename=>'||v_ename);
       
        close emp_cursor;
    end;
    /

 

암묵적 으로 편하게 사용하기. - cursor for loops

 

특징 : open , fetch, exit , close 가 암묵적으로 진행.

 

기본구문

for record_name in cursor_name loop
   
end loop;

 

개발은 해본사람은 알겠지만 위 구문은 배열을 일일이 for문을 작성해서 원하는데이터를 가져오는 번거로움을 최소화

하기위해서 생긴 for in 또는 foreach 와 같은 형태다.

 

예제)

declare
    cursor emp_cursor is
    select
        deptno,
        ename,
        sal
    from
        emp;
   
begin
    for rs in emp_cursor loop


        if rs.deptno = 30 then
            dbms_output.put_line('===>'||rs.ename||' -- '||rs.sal);
        end if;
   
    end loop;
end;
/

결과)

===>ALLEN -- 1600
===>WARD -- 1250
===>MARTIN -- 1250
===>BLAKE -- 2850
===>TURNER -- 1500
===>JAMES -- 950


'Oracle > 오라클 양성반 15기' 카테고리의 다른 글

SYSOPER  (0) 2010.09.28
dbca. script, template 이것저것  (0) 2010.09.12
pl/sql exception  (0) 2010.09.12
merge into  (0) 2010.09.12
composite data type , cursor  (0) 2010.09.12
for update  (0) 2010.09.12
Posted by ORACLE,DBA,BIG,DATA,JAVA 흑풍전설
2010.09.12 22:41

for update Oracle/오라클 양성반 15기2010.09.12 22:41


다시한번말하지만~~~ 글재주제로입니다.

 

이세상에 존재하는 모든 데이터베이스는

무결성을 베이스로 해서 데이터베이스가 만들어진다.( 아니면 말고;;; )

 

데이터는 한곳에 있는데 그 데이터를 여러사람들이 접근을 해야하고

그로인해서 발생할수있는 문제들로 인해서 LOCK이라는것이 생겼다.

 

뭐 각설하고

보통 TX,TM 여러가지 락들이 있는데

그중에서 사용자가 원하는 데이터를 락을 걸수는 없을라나?

구조를 보면 누군가 update를 하거나 delete를 하면 lock을 획득하고

다른사람이 그 데이터를 볼때 오라클이면 오라클만의 구조로 무결성을 유지하고, MSSQL이면 mssql에 맞는 구조로 무결성을 유지한다.

 

헌데 select 한 데이터를 락을 걸어야 할경우도 분명있다.

 

9i부터 새로 생긴기능인 for update는 select를 해서 lock 걸어주는 기능이다.

 

옵션.

 

1. FOR UPDATE with no option
2. FOR UPDATE NOWAIT(= WAIT 0)
3. FOR UPDATE WAIT integer (0 ~ 4294967295, second)
4. FOR UPDATE OF

테스트)

총 3개의 세션 필요.

 

A세션 - sid = 145

B세션 - sid = 141

C세션 - sys계정으로 모니터링

 

1. sys계정으로 현재 상황을 먼저 보자.

C세션 -

 

현재는 아무 뻘짓도 안하니 아무 일도 없다.

 

SQL> select sid, lockwait From v$session where username = 'HR';

       SID LOCKWAIT
---------- --------
       141
       145

SQL>

 

SQL> select sid, type, lmode, request From v$lock where sid in (141,145);

no rows selected

SQL>

 

2. A세션에서 for update 발생시키자.

 

SQL> select employee_id,last_name from employees where department_id = 20 for update;

EMPLOYEE_ID LAST_NAME
----------- -------------------------
        201 Hartstein
        202 Fay

SQL>

 

3. C세션에서 다시 현재 상황을 보자.

TM락과 , TX락이 발생했다.

 

SQL> select sid, lockwait From v$session where username = 'HR';

       SID LOCKWAIT
---------- --------
       141
       145

SQL> select sid, type, lmode, request From v$lock where sid in (141,145);

       SID TY      LMODE    REQUEST
---------- -- ---------- ----------
       145 TM          3          0  <---- 3 - RX
       145 TX           6          0  <---- 6 - X

SQL>

 

4. B세션에서 A에서 SELECT한 데이터를 업데이트 해보자.

SQL> update employees set last_name = 'babo' where department_id = 20;

거서 깜빡깜빡~~~~ 대기중~~~

 

5. C세션에서 다시 현재 상황을 보자.

SQL> select sid, lockwait From v$session where username = 'HR';

       SID LOCKWAIT
---------- --------
       141 29FBA14C
       145

SQL> select sid, type, lmode, request From v$lock where sid in (141,145);

       SID TY      LMODE    REQUEST
---------- -- ---------- ----------
       141 TX          0          6 <---- 141번 세션이 X모드로 요청을 기다리고 있다.
       145 TM          3          0
       141 TM          3          0
       145 TX          6          0

SQL>

 

6. A세션에서 commit 을 해보자.

SQL> commit;

Commit complete.

SQL>

 

7. C세션에서 다시 현재 상황을 보고 B세션의 모습을 보자.

C세션

SQL> select sid, lockwait From v$session where username = 'HR';

LOCK대기상태가 사라졌다.

       SID LOCKWAIT
---------- --------
       141
       145

SQL>  select sid, type, lmode, request From v$lock where sid in (141,145);

       SID TY      LMODE    REQUEST
---------- -- ---------- ----------
       141 TM          3          0
       141 TX          6          0

SQL>

B세션

2 rows updated.

SQL>

'Oracle > 오라클 양성반 15기' 카테고리의 다른 글

SYSOPER  (0) 2010.09.28
dbca. script, template 이것저것  (0) 2010.09.12
pl/sql exception  (0) 2010.09.12
merge into  (0) 2010.09.12
composite data type , cursor  (0) 2010.09.12
for update  (0) 2010.09.12
Posted by ORACLE,DBA,BIG,DATA,JAVA 흑풍전설