반응형

오늘 불현듯...

User Define Cursor 에 대한 부분이 궁금해 졌다...

자바에서 오라클 패키지 호출하여 커서값을 반환하여 자유 스럽게 사용했는데

그 커서 값을 오라클에서 받아서 해볼까 하는...

사실 cursor is 구문이라던지 직접 사용했지

그동안 cursor 반환은 무관심 했었다..

방법은...

즉,  커서 out 값에  l_cursor에 받아와서

3개의 select 한 값을 return 하는데... 각 값들의 속성을 l_ename, l_empno, l_deptno 로 fetch 하여 받아가지고 옴...

참고용

SET SERVEROUTPUT ON SIZE 1000000
DECLARE
  TYPE REF_CUR IS REF CURSOR;
  l_cursor REF_CUR;
  l_ename   emp.ename%TYPE;
  l_empno   emp.empno%TYPE;
  l_deptno  emp.deptno%TYPE;
BEGIN
  get_emp_rs (p_deptno    => 30,
              p_recordset => l_cursor);
            
  LOOP 
    FETCH l_cursor
    INTO  l_ename, l_empno, l_deptno;
    EXIT WHEN v_cursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(l_ename || ' | ' || l_empno || ' | ' || l_deptno);
  END LOOP;
  CLOSE l_cursor;
END;
/


출처 :  http://www.oracle-base.com/articles/misc/UsingRefCursorsToReturnRecordsets.php 




Using Ref Cursors To Return Recordsets

Since Oracle 7.3 the REF CURSOR type has been available to allow recordsets to be returned from stored procedures and functions. Oracle 9i introduced the predefined SYS_REFCURSOR type, meaning we no longer have to define our own REF CURSOR types. The example below uses a ref cursor to return a subset of the records in the EMP table.

The following procedure opens a query using a SYS_REFCURSOR output parameter. Notice the cursor is not closed in the procedure. It is up to the calling code to manage the cursor once it has been opened.

CREATE OR REPLACE
PROCEDURE get_emp_rs (p_deptno    IN  emp.deptno%TYPE,
                      p_recordset OUT SYS_REFCURSOR) AS 
BEGIN 
  OPEN p_recordset FOR
    SELECT ename,
           empno,
           deptno
    FROM   emp
    WHERE  deptno = p_deptno
    ORDER BY ename;
END GetEmpRS;
/

The resulting cursor can be referenced from PL/SQL as follows.

SET SERVEROUTPUT ON SIZE 1000000
DECLARE
  l_cursor  SYS_REFCURSOR;
  l_ename   emp.ename%TYPE;
  l_empno   emp.empno%TYPE;
  l_deptno  emp.deptno%TYPE;
BEGIN
  get_emp_rs (p_deptno    => 30,
              p_recordset => l_cursor);
            
  LOOP 
    FETCH l_cursor
    INTO  l_ename, l_empno, l_deptno;
    EXIT WHEN v_cursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(l_ename || ' | ' || l_empno || ' | ' || l_deptno);
  END LOOP;
  CLOSE l_cursor;
END;
/

The cursor can be used as an ADO Recordset.

Dim conn, cmd, rs

Set conn = Server.CreateObject("adodb.connection")
conn.Open "DSN=TSH1;UID=scott;PWD=tiger"

Set cmd = Server.CreateObject ("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandText = "get_emp_rs"
cmd.CommandType = 4 'adCmdStoredProc

Dim param1
Set param1 = cmd.CreateParameter ("deptno", adInteger, adParamInput)
cmd.Parameters.Append param1
param1.Value = 30

Set rs = cmd.Execute

Do Until rs.BOF Or rs.EOF
  -- Do something
  rs.MoveNext
Loop

rs.Close
conn.Close
Set rs     = nothing
Set param1 = nothing
Set cmd    = nothing
Set conn   = nothing

The cursor can also be referenced as a Java ResultSet.

import java.sql.*;
import oracle.jdbc.*;

public class TestResultSet  {
  public TestResultSet() {
    try {
      DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
      Connection conn = DriverManager.getConnection("jdbc:oracle:oci:@w2k1", "scott", "tiger");
      CallableStatement stmt = conn.prepareCall("BEGIN get_emp_rs(?, ?); END;");
      stmt.setInt(1, 30); // DEPTNO
      stmt.registerOutParameter(2, OracleTypes.CURSOR); //REF CURSOR
      stmt.execute();
      ResultSet rs = ((OracleCallableStatement)stmt).getCursor(2);
      while (rs.next()) {
        System.out.println(rs.getString("ename") + ":" + rs.getString("empno") + ":" + rs.getString("deptno")); 
      }
      rs.close();
      rs = null;
      stmt.close();
      stmt = null;
      conn.close();
      conn = null;
    }
    catch (SQLException e) {
      System.out.println(e.getLocalizedMessage());
    }
  }

  public static void main (String[] args) {
    new TestResultSet();
  }
}
If you are using a version of Oracle before 9i, then create the following package and replace any references to SYS_REFCURSOR with TYPES.cursor_type.
CREATE OR REPLACE PACKAGE types AS 
  TYPE cursor_type IS REF CURSOR;
END Types; 
/
Hope this helps. Regards Tim... 
반응형

'Database > ORACLE' 카테고리의 다른 글

Automatic SQL Tuning in Oracle Database 10g  (0) 2012.07.20
10G OCP 자격증 관련  (2) 2012.07.08
일정 시간 별로 쿼리 정보 조회  (0) 2012.02.20
오라클 병렬 인덱스 조회 및 수정하기  (0) 2012.01.27
AWR Report 정리본  (0) 2011.09.28
반응형


형태

오라클 계정 -> 5분 단위로 해서 -> 아래의 테이블 생성후 -> Crontab 으로 조회하여 입력하는 형태

자세한 것은 Shell, Crontab 정보를 찾으면서 하면됨

-- 임의로 실행하는 쿼리목록 조회하기
select      to_char(sysdate,'yyyymmdd'),
            to_char(sysdate, 'HH24'),
            to_char(sysdate, 'MI'),
            A.inst_id,
            A.SID,
            A.SERIAL#,
            A.USERNAME,
            A.TYPE,
            A.STATUS,
            A.STATE,
            A.EVENT,
            A.OSUSER,
            A.PROGRAM,
            A.MACHINE,
            A.SQL_ADDRESS,
            B.SQL_ID,
            B.sharable_mem,
            B.persistent_mem,
            B.runtime_mem,
            B.first_load_time,
            B.OPTIMIZER_MODE,
            B.OPTIMIZER_COST,
            B.MODULE,
            B.SQL_FULLTEXT
   from     GV$SESSION a, GV$SQL B
  WHERE     A.STATUS = 'ACTIVE'                       -- 현재 활성화된
    AND     B.ADDRESS=A.SQL_ADDRESS                   -- FULL SQL TEXT 를 얻기 위해
    AND     A.MACHINE NOT IN ('NewWas1','NewWas2')    -- 접속 Machine 이름이 NewWas1, NewWas2 는 아님
    AND     UPPER(B.SQL_FULLTEXT) NOT LIKE '%V$%';    -- V$ 로 시작하는 뷰를 보는 경우는 제외
   
   
CREATE TABLE MStorage.USER_SQL_LOG
(
      VIEW_YMD   VARCHAR2(8) DEFAULT to_char(sysdate,'yyyymmdd'),
      VIEW_HH    VARCHAR2(2) DEFAULT to_char(sysdate, 'HH24'),
      VIEW_MI    VARCHAR2(2) DEFAULT to_char(sysdate, 'MI'),
      INST_ID    NUMBER,
      SID      NUMBER,
      SERIAL#    NUMBER,
      USERNAME   VARCHAR2(30),
      TYPE     VARCHAR2(10),
      STATUS    VARCHAR2(8),
      STATE     VARCHAR2(19),
      EVENT     VARCHAR2(64),
      OSUSER    VARCHAR2(30),
      PROGRAM    VARCHAR2(48),
      MACHINE    VARCHAR2(64),
      SQL_ADDRESS RAW(8),
      SQL_ID   VARCHAR2(13),
      SHARABLE_MEM NUMBER,
      PERSISTENT_MEM NUMBER,
      RUNTIME_MEM NUMBER,
      FIRST_LOAD_TIME VARCHAR2(38),
      OPTIMIZER_MODE VARCHAR2(10),
      OPTIMIZER_COST NUMBER,
      MODULE     VARCHAR2(64),
      SQL_FULLTEXT  CLOB
) TABLESPACE MStorage;

COMMENT ON TABLE MStorage.USER_SQL_LOG IS '로그 모니터링 테이블(GV$SESSION) 참조';

 


-- 인덱스 생성
CREATE INDEX MStorage.IX_USER_SQL_LOG_01 ON MStorage.USER_SQL_LOG
(
  VIEW_YMD,VIEW_HH, VIEW_MI
)
TABLESPACE MStorage;

 


-- 실제 입력 구문

INSERT INTO MStorage.USER_SQL_LOG
       (
       inst_id,
            SID,
            SERIAL#,
            USERNAME,
            TYPE,
            STATUS,
            STATE,
            EVENT,
            OSUSER,
            PROGRAM,
            MACHINE,
            SQL_ADDRESS,
            SQL_ID,
            sharable_mem,
            persistent_mem,
            runtime_mem,
            first_load_time,
            OPTIMIZER_MODE,
            OPTIMIZER_COST,
            MODULE,
            SQL_FULLTEXT               
            )
select      A.inst_id,
            A.SID,
            A.SERIAL#,
            A.USERNAME,
            A.TYPE,
            A.STATUS,
            A.STATE,
            A.EVENT,
            A.OSUSER,
            A.PROGRAM,
            A.MACHINE,
            A.SQL_ADDRESS,
            B.SQL_ID,
            B.sharable_mem,
            B.persistent_mem,
            B.runtime_mem,
            B.first_load_time,
            B.OPTIMIZER_MODE,
            B.OPTIMIZER_COST,
            B.MODULE,
            B.SQL_FULLTEXT
   from     GV$SESSION a, GV$SQL B
  WHERE     1=1-- A.STATUS = 'ACTIVE'                       -- 현재 활성화된
    AND     B.ADDRESS=A.SQL_ADDRESS                   -- FULL SQL TEXT 를 얻기 위해
    AND     A.MACHINE NOT IN ('NewWas1','NewWas2')    -- 접속 Machine 이름이 NewWas1, NewWas2 는 아님
    AND     UPPER(B.SQL_FULLTEXT) NOT LIKE '%V$%';    -- V$ 로 시작하는 뷰를 보는 경우는 제외

반응형
반응형

흠...

병렬 인덱스가 성능을 하락 시키는 경우가 많다...

경합이라던지..

잘써야 하는데,

대부분의 사이트에는 아무런 생각없이(?) 가져다 쓰기 바쁘다...

고로...

일괄적으로 조회나 수정할 때 사용하는 쿼리 하앍..

우선

PARALLEL 옵션의 차수 Degree 를 통회 조회하는 방법


 SELECT *
    FROM  DBA_INDEXES -- Dictionary를 통해 indexes로 끝나는 것을 모두 조회하여도 됨...
   WHERE DEGREE NOT IN ('1','DEFAULT','0')
       AND OWNER NOT IN ('SYS','SYSTEM','WMSYS', 'OUTLN', 'TSMSYS', 'SYSMAN') 
 

EX) 병렬 옵션의 차수가 8인 인덱스를 일괄적으로 4로 변경 하기 !

 SELECT 'ALTER INDEX ' || OWNER || '.' || INDEX_NAME || ' PARALLEL(DEGREE 4);'
     FROM DBA_INDEXES
   WHERE DEGREE = '8'
       AND OWNER NOT IN ('SYS','SYSTEM','WMSYS', 'OUTLN', 'TSMSYS', 'SYSMAN')        
 
간단히 참고용으로 작성함... 
반응형
반응형


다음의 내용들은 개인적인 권장하는 사항들이다.

오라클 10g의 경우 엔진 설치를 위한 디렉토리 공간을 20GB 이상 주는 것을 권장한다.

오라클의 adump, bdump, udump, 리스너 로그, 아카이브 로그 등을 백업할 수 있으면

백업하는 것을 권장한다. 하지만 대부분의 경우 백업의 필요성이 절실하지 않기 때문에

삭제한다.

 

각종 로그의 자동관리를 위하여 첨부한 파일과 같이 CRONTAB에 등록하여 관리하면 편리하다.
각각의 로그관리에 대한 정책이 필요하다.

 

정책 예시)
1. alert 로그       : 월별로 로그를 관리. 영구 보관하는 것이 좋다.
                      compress 명령으로 압축하여 보관.
2. adump audit 파일 : 180일 정도 유지, 매일 180일이 지난 trc파일을 삭제
3. bdump trace 파일 : 90일 정도 유지, 매일 90일이 지난 trc파일을 삭제
4. udump trace 파일 : 90일 정도 유지, 매일 90일이 지난 trc파일을 삭제
5. 리스너 로그      : 리스너를 로깅하도록 설정했을 경우 월별로 로그를 관리.

                      180일이 지난 파일은 삭제. compress 명령으로 압축하여 보관.
6. 아카이브로그 파일 : 기본적으로 1주일에 1번 이상 FULL BACKUP을 받을 경우
   백업 툴에서 아카이브로그를 관리해 주지 않을 경우 등록하여 사용
   7일전 아카이브로그 파일 삭제.

 

쉘 예시)

쉘 스크립트 작성 시 오타에 주의할 것. 반드시 테스트 후 적용할 것
#######################################################
#### alert.log                                     ####
#### (매월 1일 실행할 수 있도록 cron job 등록 )    ####
#######################################################

nDate=`date +%Y%m%d`
cp $ORACLE_BASE/admin/TESTDB/bdump/alert_TESTDB.log $ORACLE_BASE/TESTDB/bdump/alert_TESTDB.log.$nDate
cat /dev/null > $ORACLE_BASE/admin/TESTDB/bdump/alert_TESTDB.log
compress -vf $ORACLE_BASE/TESTDB/bdump/alert_TESTDB.log.$nDate

 

#######################################################
#### listener.log                                  ####
#### (매월 1일 실행할 수 있도록 cron job 등록 )    ####
#######################################################

nDate=`date +%Y%m%d`
cp $ORACLE_HOME/network/admin/listener.log $ORACLE_HOME/network/admin/listener.log.$nDate
cat /dev/null > $ORACLE_HOME/network/admin/listener.log
compress -vf $ORACLE_HOME/network/admin/listener.log.$nDate

 

#######################################################
#### audit                                         ####

#######################################################
# 180일이 지난 *.aud를 찾아 삭제
find $ORACLE_BASE/admin/TESTDB/adump \( -ctime +180 -name '*.aud' \) -exec rm -f {} \;

 

#######################################################
#### .trc                                          ####
# 90일이 지난 *.trc를 찾아 삭제                    ####
#######################################################
find $ORACLE_BASE/admin/TESTDB/bdump \( -ctime +90 -name '*.trc' \) -exec rm -f {} \;
find $ORACLE_BASE/admin/TESTDB/udump \( -ctime +90 -name '*.trc' \) -exec rm -f {} \;

 

#######################################################
#### archive log                                   ####
#######################################################
# 7일이 지난 *.arc를 찾아 삭제
find /archive_log \( -ctime +7 -name '*.arc' \) -exec rm -f {} \;


반응형
반응형

http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-10201-088211.html



Oracle Database 10g Release 2 JDBC Drivers


You must accept the OTN Development and Distribution License Agreement to download this software.
Accept License Agreement | Decline License Agreement

Oracle Database 10g Release 2 (10.2.0.5) JDBC Drivers

 JavaDoc (4,383,404 bytes)
 README
 
JDBC Thin for All Platforms
 classes12.jar (1,621,582 bytes) - for use with JDK 1.2 and JDK 1.3
 classes12_g.jar (2,070,298 bytes) - same as classes12.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 classes12dms.jar (1,629,454 bytes) - same as classes12.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service.
 classes12dms_g.jar (2,078,718 bytes) - same as classes12dms.jar except that classes were compiled with "javac -g" and contain some tracing information.
 ojdbc14.jar (1,569,316 bytes) - classes for use with JDK 1.4 and 1.5
 ojdbc14_g.jar (1,965,422 bytes) - same as ojdbc14.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 ojdbc14dms.jar (1,576,882 bytes) - same as ojdbc14.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service.
 ojdbc14dms_g.jar (1,973,634 bytes) - same as ojdbc14dms.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 demo.tar (604,160 bytes) - contains sample JDBC programs.
 
Note: For platform specific JDBC-OCI libraries See Instant Client


Oracle Database 10g Release 2 (10.2.0.4) JDBC Drivers

 JavaDoc (4,383,404 bytes)
 README
 
JDBC Thin for All Platforms
 classes12.jar (1,609,607 bytes) - for use with JDK 1.2 and JDK 1.3
 classes12_g.jar (2,055,921 bytes) - same as classes12.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 classes12dms.jar (1,617,382 bytes) - same as classes12.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service.
 classes12dms_g.jar (2,064,313 bytes) - same as classes12dms.jar except that classes were compiled with "javac -g" and contain some tracing information.
 ojdbc14.jar (1,555,682 bytes) - classes for use with JDK 1.4 and 1.5
 ojdbc14_g.jar (1,950,033 bytes) - same as ojdbc14.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 ojdbc14dms.jar (1,563,375 bytes) - same as ojdbc14.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service.
 ojdbc14dms_g.jar (1,958,237 bytes) - same as ojdbc14dms.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 orai18n.jar (1,646,178 bytes) - NLS classes for use with JDK 1.2, 1.3, 1.4, and 1.5. This jar file replaces the old nls_charset jar/zip files.
 demo.tar (604,160 bytes) - contains sample JDBC programs.
 
Note: For platform specific JDBC-OCI libraries See Instant Client


Oracle Database 10g Release 2 (10.2.0.3) JDBC Drivers

 JavaDoc (4,383,404 bytes)
 README
 
JDBC Thin for All Platforms
 classes12.jar (1,600,090 bytes) - for use with JDK 1.2 and JDK 1.3
 classes12_g.jar (2,044,594 bytes) - same as classes12.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 classes12dms.jar (1,607,745 bytes) - same as classes12.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service.
 classes12dms_g.jar (2,052,968 bytes) - same as classes12dms.jar except that classes were compiled with "javac -g" and contain some tracing information.
 ojdbc14.jar (1,545,954 bytes) - classes for use with JDK 1.4 and 1.5
 ojdbc14_g.jar (1,938,906 bytes) - same as ojdbc14.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 ojdbc14dms.jar (1,553,561 bytes) - same as ojdbc14.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service.
 ojdbc14dms_g.jar (1,947,136 bytes) - same as ojdbc14dms.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 orai18n.jar (1,645,114 bytes) - NLS classes for use with JDK 1.2, 1.3, 1.4, and 1.5. This jar file replaces the old nls_charset jar/zip files.
 ons.jar (48,492 bytes) - for use by the pure Java client-side Oracle Notification Services (ONS) deamon.
 demo.tar (604,160 bytes) or demo.zip (529,267 bytes) - contains sample JDBC programs.
 
Note: For platform specific JDBC-OCI libraries See Instant Client


Oracle Database 10g Release 2 (10.2.0.2) JDBC Drivers

 JavaDoc (4,383,404 bytes)
 README
 
JDBC Thin for All Platforms
 classes12.jar (1,594,191 bytes) - for use with JDK 1.2 and JDK 1.3 
 classes12_g.jar (2,038,127 bytes) - same as classes12.jar, except that classes were compiled with "javac -g" and contain some tracing information. 
 classes12dms.jar (1,601,843 bytes) - same as classes12.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service. 
 classes12dms_g.jar (2,046,467 bytes) - same as classes12dms.jar except that classes were compiled with "javac -g" and contain some tracing information.
 ojdbc14.jar (1,540,457 bytes) - classes for use with JDK 1.4 and 1.5
 ojdbc14_g.jar (1,932,834 bytes) - same as ojdbc14.jar, except that classes were compiled with "javac -g" and contain some tracing information. 
 ojdbc14dms.jar (1,548,006 bytes) - same as ojdbc14.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service. 
 ojdbc14dms_g.jar (1,940,478 bytes) - same as ojdbc14dms.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 orai18n.jar (1,645,109 bytes) - NLS classes for use with JDK 1.2, 1.3, 1.4, and 1.5. This jar file replaces the old nls_charset jar/zip files. 
 ons.jar (48,492 bytes) - for use by the pure Java client-side Oracle Notification Services (ONS) deamon.
 demo.tar (604,160 bytes) or demo.zip (529,267 bytes) - contains sample JDBC programs.
 
Note: For platform specific JDBC-OCI libraries See Instant Client



Oracle Database 10g Release 2 (10.2.0.1.0) JDBC Drivers

 JavaDoc (4,383,404 bytes)
 README
 
JDBC Thin for All Platforms
 classes12.jar (1,590,491 bytes) - for use with JDK 1.2 and JDK 1.3 
 classes12_g.jar (2,033,507 bytes) - same as classes12.jar, except that classes were compiled with "javac -g" and contain some tracing information. 
 classes12dms.jar (1,598,183 bytes) - same as classes12.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service. 
 classes12dms_g.jar (2,041,904 bytes) - same as classes12dms.jar except that classes were compiled with "javac -g" and contain some tracing information.
 ojdbc14.jar (1,536,979 bytes) - classes for use with JDK 1.4 and 1.5
 ojdbc14_g.jar (1,928,714 bytes) - same as ojdbc14.jar, except that classes were compiled with "javac -g" and contain some tracing information. 
 ojdbc14dms.jar (1,544,468 bytes) - same as ojdbc14.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service. 
 ojdbc14dms_g.jar (1,936,765 bytes) - same as ojdbc14dms.jar, except that classes were compiled with "javac -g" and contain some tracing information.
 orai18n.jar (1,551,155 bytes) - NLS classes for use with JDK 1.2, 1.3, 1.4, and 1.5. This jar file replaces the old nls_charset jar/zip files. 
 ons.jar (48,492 bytes) - for use by the pure Java client-side Oracle Notification Services (ONS) deamon.
 demo.tar (604,160 bytes) or demo.zip (529,267 bytes) - contains sample JDBC programs.
 
Note: For platform specific JDBC-OCI libraries See Instant Client

반응형
반응형

흠흠흠...

문자열 변환 함수 translate

뭐 쉽게 얘길하면

TRANSLATE("문자열", "찾을집합","변경집합")으로 변환가능.

중요한 것은 찾을 집합에 없는 값은 무조건 그냥 출력한다는 것이다.

ex) SELECT TRANSLATE('ABC-1234-5678', 'abc1234','def5678') FROM DUAL;

즉, 'ABC-1234-5678'에서 찾는 집합 'abc1234'에 매핑되는 값만 'def5678'로 변경된다.

위의 문자열중 매핑 안되는 값은 그냥 출력된다.

매핑 안되는 문자열값 : ABC-5678 이 값들은 찾을 집합에 존재하지 않으므로 그냥 skip하여 출력되며

찾는 집합 변경 집합 
 a
 b
 c
 1
 2 6
 3 7
 4 8

위의 표를 기준으로 볼때 a가 발견되면 d로 변경된다.

아래의 값에서 ABC-는 찾는집합과 변경집합이 없으므로 skip 되며

나머지 값들은 모두 해당 변경 집합으로 변경되어 출력된다.

결과
---------------
ABC-5678-5678

TRANSLATE (string1, search_set, replace_set)

Replaces every instance in string1 of a character from search_set with the corresponding character from replace_set. For example:

    TRANSLATE ('abcd', 'ab', '12') --> '12cd'

If the search set contains more characters than the replace set, then the "trailing" search characters that have no match in the replace set are not included in the result. For example:

    TRANSLATE ('abcdefg', 'abcd', 'zyx') --> 'zyxefg'

The letter 'd' is removed, because it appears in search_set without a corresponding entry in result_set.


TRANSLATE(text USING CHAR_CS) and TRANSLATE(text USING NCHAR_CS)

Translates character data to either the database character set (CHAR_CS) or the national character set (NCHAR_CS). The output datatype will be either VARCHAR2 or NVARCHAR2, depending on whether you are converting to the database or the national character set, respectively.

TRANSLATE...USING is an ISO standard SQL function. Starting with Oracle9i Database Release 1, you can simply assign a VARCHAR2 to an NVARCHAR2, (and vice versa), and Oracle will handle the conversion implicitly. If you want to make such a conversion explicit, you can use TO_CHAR and TO_NCHAR to convert text to database and national character sets, respectively. Oracle recommends the use of TO_CHAR and TO_NCHAR over TRANSLATE...USING, because those functions support a greater range of input datatypes.


출처 : 영어부분은 Oracle PL/SQL Programming 책에서 발췌...
반응형
반응형

TOAD for Oracle 을 사용하던중... -_-

Shift 키를 누르지 않고 방향키를 눌렀으나...

여러 블럭들이 선택되는 이상한 현상을 목격하게 되었고...

바로 옆의 PC에 환경 정보를 보고 고쳤으나... 진행이 안되었음...

결국은 toad.ini 파일을 삭제하는 것으로 마무리 지었으나...

toad.ini 파일은 다음 2개의 위치중에 하나에 존재함.

c:\users\<사용자 명>\AppData\Roaming\Quest Software\Toad for Oralce\9.7\User Files\toad.ini -> 삭제(영문판 윈도우)

c:\사용자\<사용자 명>\AppData\Roaming\Quest Software\Toad for Oralce\9.7\User Files\toad.ini -> 삭제(한글판 윈도우)


c:\program files\Quest Software\Toad for Oralce\ClientFiles\User Files\toad.ini -> 삭제

위의 2군데 중 하나를 삭제함으로서 초기 설정 화면을  띄울수 있음.

반응형
반응형

출처 : http://cafe.naver.com/prodba

sysdba로 접속하여 알아낸다...

또한 결과는 alert.log로 찍힌다 ~

$> sqlplus '/as sysdba'

sql>


create trigger logon_denied_to_alert
after servererror on database
declare
message varchar2(4000);
begin
    select 'ip='||sys_context('userenv','ip_address')||',host='||sys_context('userenv ','host')||',osuser='||SYS_CONTEXT('USERENV', 'OS_USER')
    into message
    from dual;
IF (ora_is_servererror(1017)) THEN
message := to_char(sysdate,'Dy Mon dd HH24:MI:SS YYYY') || ' logon denied for ' || message;
sys.dbms_system.ksdwrt(2,message);
end if;
end;
/
반응형

'Database > ORACLE' 카테고리의 다른 글

오라클 TRANSLATE  (0) 2011.03.31
오라클 자격증 신청 절차  (0) 2011.03.28
테이블 정의서 추출 생성 스크립트  (0) 2011.01.06
ORACLE SESSION Monitoring SQL  (0) 2011.01.05
오라클 공부 방법  (0) 2010.12.08
반응형

시스템 유지보수(SM)에는

디스크의 증가량을 주별 또는 월별로 모니터링하여 미리 할당할 수도 있고

보고용으로도 사용할 수 있도록 DB에 관리용 테이블을 만들어

자동으로 저장할 수 있도록 해 놓으면 시간이 많이 지난 다음에도

추이를 알 수 있어 유용합니다.

 

테이블스페이스 사용율(exec_tbs_usage.sh)을

매일 야간에 Crontab에서 실행할 수 있도록 등록하여 사용하는 샘플입니다.

 

% vi exec_tbs_usage.sh
#---------------------------------------------------------
# ORACLE 환경변수
#---------------------------------------------------------
export ORACLE_SID=TESTDB

export ORACLE_BASE=/oracle/app

export ORACLE_HOME=$ORACLE_BASE/product/10.2

      :

#-------------------------------------------------
# 실행할 쉘이 존재하는 절대경로
#-------------------------------------------------
cd /oracle/app/product/10.2/DBA


echo "DB Tablespace Usage"        > ./log/exec_tbs_usage.log
date                             >> ./log/exec_tbs_usage.log
TABLESPACE_USAGE.sh              >> ./log/exec_tbs_usage.log

 

% vi TABLESPACE_USAGE.sh

#!/usr/bin/ksh

###############################################################################
#
# 일별 테이블스페이스(TABLESPACE) 사용량 저장
#
# *---------------------------------------------------------------------------
# *                 일별  테이블 건수
# *---------------------------------------------------------------------------
# *  Program              : TABLESPACE_USAGE.sh
# *  Object Name          : 없음
# *  Object Type          : PL/SQL
# *  OutPut Table         : DBMANAGER.TABLESPACE_USAGE
# *  Create Date          : 2010-06-10
# *-------------------------------------------------------------------------*/
# *
# *  Execution Sample     : exec_tablespace_usage.sh (cron job)
# *                         TABLESPACE_USAGE.sh
# *                         SQL Exec. : sqlplus / as sysdba
# *
# *-------------------------------------------------------------------------*/
#
###############################################################################

#----------------------------------------------
#-- DB수집정보를 저장할 오라클 계정 생성 및 Grant
#----------------------------------------------
#-- DROP USER DBMANAGER CASCADE;
#-- CREATE USER DBMANAGER IDENTIFIED BY DBMANAGER

#--              DEFAULT TABLESPACE TOOLS TEMPORARY TABLESPACE TEMP;
#--
#-- GRANT SELECT_CATALOG_ROLE, SELECT ANY TABLE, SELECT ANY DICTIONARY TO DBMANAGER;
#-- GRANT UNLIMITED TABLESPACE   TO DBMANAGER;
#-- GRANT BECOME USER            TO DBMANAGER;
#-- GRANT CREATE VIEW            TO DBMANAGER;
#-- GRANT CREATE TABLE           TO DBMANAGER;
#-- GRANT ALTER  SESSION         TO DBMANAGER;
#-- GRANT CREATE SESSION         TO DBMANAGER;
#-- GRANT CREATE SYNONYM         TO DBMANAGER;
#-- GRANT SELECT ANY TABLE       TO DBMANAGER;
#-- GRANT SELECT ANY SEQUENCE    TO DBMANAGER;
#-- GRANT SELECT ANY DICTIONARY  TO DBMANAGER;
#--
#--
#----------------------------------------------
#-- DB수집정보를 저장할TABLE 생성 및 Grant
#----------------------------------------------
#--
#-- DROP TABLE DBMANAGER.TABLESPACE_USAGE PURGE;
#-- CREATE TABLE DBMANAGER.TABLESPACE_USAGE
#--      ( GATHER_DATE     CHAR(8)      DEFAULT TO_CHAR(SYSDATE,'YYYYMMDD') NOT NULL,
#--        TABLESPACE_NAME VARCHAR2(30)           NOT NULL,
#--        ALLOC_KBYTES    NUMBER       DEFAULT 0 NOT NULL,
#--        USED_KBYTES     NUMBER       DEFAULT 0 NOT NULL,
#--        EXEC_DATETIME   DATE         DEFAULT SYSDATE NOT NULL
#--      ) TABLESPACE TOOLS;
#--
#-- CREATE UNIQUE INDEX
#--        DBMANAGER.UK_TABLESPACE_USAGE_01 ON DBMANAGER.TABLESPACE_USAGE(GATHER_DATE, TABLESPACE_NAME)
#--        TABLESPACE TOOLS;

#-- COMMENT ON TABLE DBMANAGER.TABLESPACE_USAGE IS '테이블스페이스 크기 및 사용량';
#--
#-- COMMENT ON COLUMN DBMANAGER.TABLESPACE_USAGE.GATHER_DATE     IS '수집 일시';
#-- COMMENT ON COLUMN DBMANAGER.TABLESPACE_USAGE.TABLESPACE_NAME IS '테이블스페이스 명';
#-- COMMENT ON COLUMN DBMANAGER.TABLESPACE_USAGE.ALLOC_KBYTES    IS '할당된 크기(KB)';
#-- COMMENT ON COLUMN DBMANAGER.TABLESPACE_USAGE.USED_KBYTES     IS '사용된 크기(KB)';
#-- COMMENT ON COLUMN DBMANAGER.TABLESPACE_USAGE.EXEC_DATETIME   IS '수행 일시';

#---------------------------------------------------------
# ORACLE 환경변수
#---------------------------------------------------------
export ORACLE_SID=TESTDB

export ORACLE_BASE=/oracle/app

export ORACLE_HOME=$ORACLE_BASE/product/10.2

      :

#-------------------------------------------------
# 실행할 쉘이 존재하는 절대경로
#-------------------------------------------------
cd /sw/oracle/app/product/10.2/DBA

if [ $# != 0 ]
then

    echo "\n-----------------------------------------"
    echo "\n인수(Argument) 갯수가 틀립니다."
    echo "\n실행 예) : TABLESPACE_USAGE.sh"
    echo "\n-----------------------------------------"
    exit
fi

#---------------------------------------------------------
# 입력 값 없음
#---------------------------------------------------------

##################################
##### [ 오라클 PL/SQL Start] #####
##################################

#--------------------
#-- SQL*PLUS 접속
#--------------------
sqlplus -s /nolog<<EOF

SET SERVEROUTPUT ON
SET PAGESIZE 0 SQLPROMPT "" ECHO OFF HEADING OFF FEEDBACK OFF TIMING OFF VERIFY OFF TERMOUT ON TRIMSPOOL ON

---------------------
-- SYS 계정으로 접속
---------------------
connect / as sysdba

DECLARE

-------------------------------------------------------
-- 커서 변수 선언
-------------------------------------------------------
    cursor_insert    INTEGER;
    cursor_delete    INTEGER;

-------------------------------------------------------
-- 데이터 값을 저장할 변수 선언
-------------------------------------------------------
    v_dummy          NUMBER;
    v_gather_date    VARCHAR2(08) := TO_CHAR(SYSDATE,'YYYYMMDD');

-------------------------------------------------------
-- SQL 문장을 저장할 변수 선언
-------------------------------------------------------
    insertStmt       VARCHAR2(2000);
    deleteStmt       VARCHAR2(2000);

    BEGIN

-------------------------------------------------------
-- CURSOR 열기
-------------------------------------------------------
        cursor_insert := DBMS_SQL.OPEN_CURSOR;
        cursor_delete := DBMS_SQL.OPEN_CURSOR;

-----------------------------------------------------------------
-- 중복 데이터에 의한 오류를 방지하기 위해
-- DBMANAGER.TABLESPACE_USAGE에 있는 해당일자(TODAY)의 정보 삭제
-----------------------------------------------------------------
        deleteStmt := 'DELETE /*+ parallel(A 8) */ FROM DBMANAGER.TABLESPACE_USAGE A WHERE A.GATHER_DATE = :gather_date';

        DBMS_SQL.PARSE( cursor_delete, deleteStmt, DBMS_SQL.NATIVE );

        DBMS_SQL.BIND_VARIABLE( cursor_delete, 'gather_date', v_gather_date );

        v_dummy := DBMS_SQL.EXECUTE( cursor_delete );

-------------------------------------------------------
-- DBMANAGER.TABLESPACE_USAGE에 입력(INSERT)
-------------------------------------------------------
        insertStmt := ' INSERT INTO DBMANAGER.TABLESPACE_USAGE                           '||
                      ' ( GATHER_DATE, TABLESPACE_NAME,  ALLOC_KBYTES, USED_KBYTES )     '||
                      ' SELECT :gather_date, C.TABLESPACE_NAME,                          '||
                      '        NVL(A.TOTAL,0)                   ALLOC_KBYTES,            '||
                      '        NVL(A.TOTAL,0) - NVL(B.FREE,0)   USED_KBYTES              '||
                      '   FROM (SELECT TABLESPACE_NAME,                                  '||
                      '                NVL(ROUND((SUM(BYTES)/1024),2),0) TOTAL           '||
                      '           FROM SYS.DBA_DATA_FILES                                '||
                      '          GROUP BY TABLESPACE_NAME) A,                            '||
                      '        (SELECT TABLESPACE_NAME,                                  '||
                      '                NVL(ROUND((SUM(BYTES)/1024),2),0) FREE            '||
                      '           FROM SYS.DBA_FREE_SPACE                                '||
                      '          GROUP BY TABLESPACE_NAME) B,                            '||
                      '        DBA_TABLESPACES             C                             '||
                      '  WHERE C.TABLESPACE_NAME = A.TABLESPACE_NAME(+)                  '||
                      '    AND C.TABLESPACE_NAME = B.TABLESPACE_NAME(+)                  '||
                      '    AND C.TABLESPACE_NAME NOT LIKE '||'''TEMP%'''                   ;
        DBMS_SQL.PARSE( cursor_insert, insertStmt, DBMS_SQL.NATIVE);

        DBMS_SQL.BIND_VARIABLE( cursor_insert, 'gather_date', v_gather_date );

        v_dummy := DBMS_SQL.EXECUTE( cursor_insert );

-------------------------------------------------------
-- CURSOR 닫기
-------------------------------------------------------
        DBMS_SQL.CLOSE_CURSOR( cursor_insert );
        DBMS_SQL.CLOSE_CURSOR( cursor_delete );
        COMMIT;

         EXCEPTION
--            WHEN DUP_VAL_ON_INDEX THEN
--                 DBMS_OUTPUT.PUT_LINE('DUP_VAL_ON_INDEX 에러-중복되는 데이터가 존재');
--            WHEN TOO_MANY_ROWS    THEN
--                 DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS 에러-리턴해야 하는 SELECT문이 하나 이상의 행을 반환');
--            WHEN NO_DATA_FOUND    THEN
--                 DBMS_OUTPUT.PUT_LINE('NO_DATA_FOUND 에러-SELECT문이 아무런 데이터 행을 반환하지 못함');
--            WHEN INVALID_CURSOR   THEN
--                 DBMS_OUTPUT.PUT_LINE('INVALID_CURSOR 에러-잘못된 커서 연산');
              WHEN OTHERS           THEN
                   DBMS_OUTPUT.PUT_LINE('ERR CODE : ' || TO_CHAR(SQLCODE));
                   DBMS_OUTPUT.PUT_LINE('ERR MESSAGE : ' || SQLERRM);
 END;
/
exit
EOF

 

환경 : Unix, Aix5L, Oracle10gR2

반응형

'Database > ORACLE' 카테고리의 다른 글

오라클 공부 방법  (0) 2010.12.08
오라클에서 사용량 많은 프로세스 죽이기  (0) 2010.12.03
오라클 이기종간의 DB 복제  (0) 2010.10.15
ORACLE PATCHSET Upgrade  (0) 2010.09.14
오라클 라이브러리 (참고문서)  (0) 2010.09.10
반응형


Oracle version이 10.2.0.4로 동일하고 DB간 character set 도 동일하다고 가정한다면....

 

그냥 데이타파일을 copy하면 안되고요...

Cross-Platform Transportable Tablespaces 기능을 사용하시면 됩니다.

 

이때 Source 와 Target DB에서 아래를 조회해서 endian format이 같은지 검사해서...

아래 경우 little endian인데...source db와 target db의 os가 동일한 endian이면 상관없지만

 

 

        SQL> select PLATFORM_ID, PLATFORM_NAME  from v$database;
       
        PLATFORM_ID PLATFORM_NAME
        ----------- ------------------------------
                 10 Linux IA (32-bit)

 

        SQL> select  * from v$transportable_platform;
       
        PLATFORM_ID PLATFORM_NAME                  ENDIAN_FORMAT
        ----------- ------------------------------ --------------
                  1 Solaris[tm] OE (32-bit)        Big
                  2 Solaris[tm] OE (64-bit)        Big
                  7 Microsoft Windows IA (32-bit)  Little  
                 10 Linux IA (32-bit)              Little   <--- Little endian임.
                  6 AIX-Based Systems (64-bit)     Big
                  3 HP-UX (64-bit)                 Big
                  5 HP Tru64 UNIX                  Little
                  4 HP-UX IA (64-bit)              Big
                 11 Linux IA (64-bit)              Little
                 15 HP Open VMS                    Little
                  8 Microsoft Windows IA (64-bit)  Little
                  9 IBM zSeries Based Linux        Big
                 13 Linux 64-bit for AMD           Little
                 16 Apple Mac OS                   Big
                 12 Microsoft Windows 64-bit for A Little
                    MD

 

다를 경우 Rman으로 Data File Conversion 을 해야 합니다.

 

     - Source 에서
       > rman target=/
       RMAN> Convert Tablespace 'FINANCE, HR' to Platform ='AIX_Based System (64-bit)'  <--    

                  v$transportable_platform.platform_name
                     DB_FILE_NAME_CONVERT = '/orahome/dbs1', '/orahome/dbs/transport_aix',
                                            '/orahome/dbs2', '/orahome/dbs/transport_aix'; 
         <--해당 디렉토리 아래 FINANCE, HR TS에 해당하는 모든 것을 convert하여 지정된 디렉토리 아래로 copy
        
     또는
    
     - Target 에서
       > rman target=/    
       RMAN> Convert Datafile '/tmp/transport_stage/*' From Platform = 'Solaris[tm] OE (32-bit)'
                     DB_FILE_NAME_CONVERT = '/tmp/transport_stage/fin', '/orahome/dbs1/fin',
                                            '/tmp/transport_stage/hr',  '/orahome/db2/hr';
     - DB_FILE_NAME_CONVERT 가 없으면 flash recovery area에 같은 이름으로 만들어진다.
     - Parallelism option은 parallel하게 복수개의 file을 convert할때 사용.  Convert 시간은 Rman으로
       백업할때 걸리는 시간과 같다. Convert 전후의 file size는 변함이 없다.





TDB라는 방법도 있습니다.

http://www.oracle.com/technetwork/database/features/availability/maa-wp-10gr2-platformmigrationtdb-131164.pdf


HP.UX -> AIX로 진행 해 봤는데..

시간이 많이 걸리던 순서대로 나열하면 exp/imp, TTS, TDB 순서 더군요...

참고 하세요..





반응형

+ Recent posts