Cloud Tech.2012.09.04 18:29
VMware, Xen 을 비롯한 다양한 가상화 솔루션들이 널리 쓰이고 있습니다.
그렇지만 여전히 오라클을 비롯한 비즈니스 소프트웨어들은
다양한 라이선스 제약조건 등으로 가상화 환경에서 쉽게 쓰이기 힘든 것 같습니다.

https://community.emc.com/community/connect/everything_oracle/blog/2012/03/26/vmwares-official-support-statement-regarding-oracle-certification-and-licensing 

한동안 많은 VMware 커뮤니티에서는 CPU Affinity (특정 CPU 코어를 Dedicate 하게 쓰는 옵션) 를 통해 오라클 라이센스를 위반하지 않으면서 사용할 수 있을 거라는 이야기가 많았습니다. 하지만 이 방법은 오라클이 제안하는 하드웨어 파티셔닝(Hardware Partitioning)을 충족하는 듯 하면서도 결론적으로 공식적으로 인정된 방법은 아니라는 문제가 있는 것 같습니다.

우리나라의 VMware 커뮤니티에서도 비슷한 이야기가 정리된 적이 있었습니다. 하지만 정확히 이 내용이 오라클이 허용하는 범위인지는 확인을 해봐야 하는 부분일 것 같습니다. 자칫 잘못하면 VM 이 구동되는 전체 물리 Processor 의 갯수만큼 (물론 Factor를 곱해서 수를 줄일 수 있겠지만) 라이선스를 구비해야 하는 상황이 될 수도 있을 것 같습니다.

http://cafe.naver.com/vmwareesx/2933 

참 쉬운게 없는 세상입니다 ^^

- NoPD -
 
저작자 표시
신고
Posted by 노피디
Development/Database2009.09.18 08:06
윈도우 기반의 서버를 사용할 때 참 유용한 것이 성능 카운터 입니다. 눈으로, 로그로 보이지 않는 것들도 다양한 객체와 성능 카운트를 통해서 확인이 가능하기 때문에 원인을 명확히 알 수 오동작의 단서를 제공하는 유용한 도구입니다. 이 성능 카운터에는 기본적으로 닷넷의 기본 프로바이더가 포함되어 있습니다. 닷넷이 설치된 PC 나 서버에서 해당 카테고리를 선택하면 측정 가능한 다양한 옵션이 보입니다.


그런데 오라클의 ODP.NET 을 사용하는 경우에는 기본적으로 제공되는 성능 개체가 아무것도 없습니다. 그리고 이 말은 " 오라클 클라이언트 10g 까지는 " 이라는 단서를 하나 더 붙이면 정확한 표현이 됩니다. 즉, 성능 카운터를 통해서 ODP.NET 의 다양한 카운터를 확인하기 위해서는 11g 이상의 클라이언트 버전을 설치해 주어야 합니다.


오라클 11g 클라이언트 설치 화면의 옵션을 보면 " Oracle Counters for Windows Performance Monitor " 라는 항목이 있습니다. 클라이언트를 설치하면서 이 옵션을 선택하시면 성능 카운터에 측정 가능한 항목이 추가되게 됩니다. 윈도우 환경에서 시스템 항목의 중요한 요소중 하나인 성능 카운터를 위해서는 클라이언트 버전을 올려야 하는 불편함이 있지만, 무슨일이 일어날지 모르는 미래를 대비한다면 나쁘지 않은 선택이 될 것 같네요.

- NoPD -
신고
Posted by 노피디
Development/Database2009.09.02 04:46
* 이 글은 오라클 기술 네트워크(Oracle Technology Network)에 공개된 Joh Paul Cook 의 영문 아티클을 번역 / 의역한 글입니다. 원문은 링크(http://tinyurl.com/m69mvh)를 통하여 확인하실 수 있습니다.

에러 핸들링

에러가 발생하게 되면 닷넷 어플리케이션은 유연하게 에러를 핸들링 해야 하며 사용자에게 의미있는 메세지를 전달해 주어야 합니다. Try-Catch-Finally 에러 핸들링 구조는 닷넷 언어의 한 부분입니다. 아래의 소스코드는 오라클 연계 개발시 Try-Catch-Finally 에러 핸들링 구조를 사용하는 간단한 예입니다.

try
{
    conn.Open();

    OracleCommand cmd = new OracleCommand();
    cmd.Connection = conn;

    cmd.CommandText = "SELECT dname FROM dept WHERE deptno = " + textBox1.Text;
    cmd.CommandType = CommandType.Text;
    if (dr.Read())
    {
        label1.Text = dr["dname"].ToString();
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message.ToString());
}
finally
{
     // 객체 초기화 코드
}
이러한 에러 핸들링 방식은 에러 발생시 무리 없이 에러를 처리할 수 있는 구조이긴 하지만, 사용자 친화적인 방식의 에러 처리라고 보기는 어렵습니다. 이러한 코드상에서 에러가 발생하는 경우 아래와 같이 불친절한 메세지가 사용자에게 출력되게 됩니다.


ORA-12154 와 같은 에러 코드, 에러 메시지는 오라클 DB 관리자(DBA)나 개발자 에게는 굉장히 유용한 메세지 임은 틀림없는 사실입니다만 사용자에게는 전혀 그렇지 못합니다. 보다 나은 에러 핸들링 방법은 추가적인 Catch 구문을 이용하여 주요 데이터베이스 에러 코드를 처리하고 사용자 친화적인 메세지를 출력해 주는 것입니다.

catch (OracleException ex)
{
    switch (ex.Number)
    {
        case 1 :
            MessageBox.Show(" 중복된 데이터를 Insert 하고 있습니다 ");
            break;
        case 12545 :
            MessageBox.Show(" 데이터베이스를 사용할 수 없습니다 ");
            break;
        ...
        ...
        default :
            MessageBox.Show(" 처리되지 않은 데이터베이스 에러가 발생했습니다 : " + ex.Message.ToString();
            break;
        }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message.ToString());
}
보다 상세하게 처리 로직을 추가한 위의 코드를 보면 catch 문이 2개가 사용된 것을 볼 수 있습니다. 오라클과 관련된 에러를 핸들링하는 catch 구문과 일반적인 에러를 핸들링하는 catch 구문이 그것입니다. 이와 같이 에러 메세지를 처리해 주면 사용자에게 보다 편안한 에러 메세지를 제공해 줄 수 있을 것입니다.

- NoPD -
신고
Posted by 노피디
Development/Database2009.09.01 08:14

* 이 글은 오라클 기술 네트워크(Oracle Technology Network)에 공개된 Joh Paul Cook 의 영문 아티클을 번역 / 의역한 글입니다. 원문은 링크(http://tinyurl.com/m69mvh)를 통하여 확인하실 수 있습니다.

Visual C# 구문

프로젝트에 참조 추가를 한 다음 using 구문을 이용하여 네임스페이스를 선언해 주어야 합니다. 기술적으로 네임스페이스 선언은 해주지 않아도 관계 없지만, 간결한 코드를 위해서는 꼭 선언해 주는 것이 좋습니다. 일반적인 경우와 마찬가지로 네임스페이스나 클래스 선언이 시작되기 전에 using 문을 추가해 주면 됩니다.

using Oracle.DataAccess.Client
참조가 정상적으로 추가되었다면 using 문으로 네임스페이스를 선언하는 동안 인텔리센스의 도움을 받으실 수 있었을 것입니다.


연결 문자열과 객체

오라클 연결 문자열은 tnsnames.ora 파일에 정의된 내용과 밀접한 관계를 가지고 있습니다. 여러분들의 tnsnames.ora 파일에 아래와 같이 XE 라는 이름으로 오라클 연결 문자열이 정의되어 있다고 가정해 봅시다. (참고로, tnsnames.ora 파일은 오라클 클라이언트가 설치된 경로의 하위에 network/admin 폴더에 저장되어 있습니다. 클라이언트 버전에 따라 위치는 조금씩 상이할 수 있습니다)

XE =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = DBSVR)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = XE)
    )
  )
XE 라는 약어는 오라클 클라이언트를 위한 데이터베이스 연결 주소 정보를 정의하고 있습니다. tnsnames.ora 파일에 정의된 위의 약어를 사용하기 위해서 비주얼 스튜디오에서 아래와 같은 연결 문자열 선언을 해야합니다.

string oradb = "Data Source=XE;User ID=scott;Password=tiger;";
물론 tnsnames.ora 파일을 사용하지 않기 위하여 연결 문자열을 아래와 같이 변경할 수도 있습니다. tnsnames.ora 파일에 지정된 내용을 그대로 연결 문자열에 정의하면 됩니다.

string oradb = "Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = DBSVR)(PORT = 1521))) " +
               "(CONNECT_DATA =(SERVICE_NAME = XE)));" +
               "User Id=scott;Password=tiger;";
위에서 볼 수 있는 것처럼, 사용자 이름과 패스워드는 연결 문자열 속에 평문으로 저장되어 있습니다. 이 방법은 연결 문자열을 만드는 가장 간단한 방법이지만 보안의 관점에서 봤을 때는 평문으로 저장된 사용자 이름, 패스워드는 좋은 선택이 아닙니다. 특히, 닷넷 어플리케이션은 DLL, EXE 를 막론하고 디스 어셈블러를 통해서 소스 코드의 복원이 가능하기 때문에 보안에 취약합니다. 이와 관련한 내용은 다른 글에서 보다 자세히 다루도록 하겠습니다.

다음으로, 여러분은 커넥션 클래스를 이용하여 객체를 생성하고 초기화 해야만 합니다. 연결 문자열은 커넥션 객체에 할당 되어야 합니다.

OracleConnection conn = new OracleConnection(XE);
연결 문자열의 할당은 오버로드된 객체의 생성자를 통해서 전달되어 할당이 가능합니다. 생성자의 다른 오버로드는 아래와 같은 구문도 사용 가능하도록 정의되어 있습니다.

OracleConnection conn = new OracleConnection();
conn.ConnectionString = oradb;
연결 문자열의 할당이 끝나면 이제 남은 일은 커넥션 객체의 Open 메소드를 이용하여 오라클 데이터베이스와의 실제 연결을 만드는 작업을 하면 됩니다. 이 과정에서의 에러 핸들링은 다음 포스트에서 소개하도록 하겠습니다.

conn.Open();
Command 객체

Command 객체는 실행 되어야 하는 SQL 문자열이나 저장 프로시저를 SQL 명령의 형태로 지정할 때 사용됩니다. Connection 객체와 마찬가지로 해당 클래스로부터 인스턴스가 만들어져야 합니다. 아래의 예제에서 ODP.NET 은 부서 테이블로부터 부서 번호가 10인 부서 명(DNAME)을 돌려주는 SQL 구문을 수행할 것입니다.

string sql = "SELECT dname FROM dept WHERE deptno = 10";
OracleCommand cmd = new OracleCommand(sql, conn);
cmd.COmmandType = COmmandType.Text;
오버로드된 다른 생성자를 사용하면 구문은 조금 다르게 변할 수 있습니다. Command 객체는 커맨드 텍스트를 실행할 수 있는 메소드를 가지고 있습니다. 이 메소드들은 서로 다른 형태의 SQL 구문에 적절한 메소드 들입니다.

스칼라 값 얻기

실제로 데이터를 데이터베이스로부터 얻기 위해서 OracleDataReader 객체를 생성하고 ExecuteReader 메소드를 사용하면 됩니다. 데이터는 컬럼 이름을 지정하거나 인덱스 번호를 이용하여 엑세스 할 수 있습니다. 결과 값은 닷넷 고유의 데이터 형을 이용하거나 오라클 고유의 데이터 형을 이용하여 엑세스 할 수 있습니다. 닷넷에 포함되어 있는 어떤 언어를 사용하더라도 이같은 특징을이용할 수 있습니다.

OracleDataReader dr = cmd.ExecuteReader();
dr.Read();

label1.Text= dr["dname"].ToString();
label1.Text = dr.ZGetString(0).ToString();
label1.Text = dr.GetOracleString(0).ToString();
위의 예제에서 우리는 DNAME 이라는 문자열 형태의 리턴 값을 가지고 데이터를 핸들링 하고 있습니다. 그러나 DEPTNO (부서번호) 와 같은 문자열이 아닌 데이터를 핸들링 할 떄는 타입 미스매치(Type Mismatch)에 주의해야 합니다. 닷넷 런타임 라이브러리는 암시적으로 적절한 형 변환을 자동으로 시도합니다. 그러나 간혹 데이터 형의 호환성에 문제가 있거나 암시적인 형 변환이 실패하면 예외가 발생하게 됩니다. 암시적인 형 변환이 에러 없이 수행된다 하더라도 필요한 경우에 대하여 명시적으로 형 변환을 하는 것을 권장합니다.

객체 소멸

데이터베이스 엑세스가 모두 끝나고 나면 Connection 객체의 Close 혹은 Dispose 메소드를 반드시 호출해 주어야 합니다. Dispose 메소드는 내부적으로 Close 메소드를 호출하도록 되어 있습니다.

conn.Close();
conn.Dispose();
코드를 만들 때 using 문을 이용하여 로직을 구성한 경우에는 명시적으로 Close 나 Dispose 메소드를 호출할 필요가 없습니다. 아래의 코드는 using 문을 이용하여 데이터베이스를 연결하는 예제 코드입니다.

using (OracleConnection conn = new OracleConnection(oradb))
{
    conn.Open();
    OracleCommand cmd = new OracleCOmmand();
    cmd.Connection = conn;
    cmd.CommandText = "select dname from dept where deptno = 10";
    cmd.COmmandType = COmmandType.Text;
    OracleDataReader dr = cmd.ExecteReader();
    dr.Read();
    label1.Text = dr.GetString(0);
}
추가적으로 OracleCommand 객체는 Dispose 메소드를 포함하고 있고 OracleDataReader 객체는 Close 와 Dispose 메소드를 포함하고 있습니다. 일반적인 경우에는 객체의 생성과 소멸이 큰 영향을 주지 않을 수 있지만 닷넷 환경에서 시스템의 리소스를 해제하고 어플리케이션의 성능 향상을 위해서 반드시 신경써 주어야 할 부분입니다.

- NoPD -
신고
Posted by 노피디
Development/Database2009.08.31 00:27

* 이 글은 오라클 기술 네트워크(Oracle Technology Network)에 공개된 Joh Paul Cook 의 영문 아티클을 번역 / 의역한 글입니다. 원문은 링크(http://tinyurl.com/m69mvh)를 통하여 확인하실 수 있습니다.

글을 시작하며

마이크로소프트의 개발 프레임워크인 닷넷 프레임워크의 인기가 높아짐에 따라 많은 개발자들이 닷넷 어플리케이션과 오라클과의 통합을 위한 가장 좋은 방법에 대한 정보를 갈구하고 있습니다. 기본적인 연결에 대한 것 뿐아니라 비주얼 스튜디오 2005 또는 2008을 이용하여 효과적이고 효율적인 개발을 하는 방법에 대한 요구가 무척 많습니다.

이 글을 통해서 오라클 데이터베이스를 사용하는 닷넷 어플리케이션을 만드는 기본적이지만 필수적인 과정에 대한 설명을 하고자 합니다.

  • 닷넷 프로젝트에 오라클 클래스 라이브러리를 추가하고 참조하는 방법
  • 오라클 데이터베이스 연결 문자열을 만드는 방법
  • Connection, Command, DataReader 객체를 사용하는 방법
  • 여러분들은 비교적 쉬운 것부터 복잡한 것까지 준비된 3개의 예제를 통해 이 같은 내용을 적용해 볼 수 있을 것입니다. 글에 포함되어 있는 모든 스크린 샷은 비주얼 스튜디오 2008의 화면들 입니다만, 비주얼 스튜디오 2005 에서도 크게 다르지 않은 화면을 보게 될 것입니다.

    .NET Data Provider

    닷넷으로 오라클 연계 어플리케이션을 개발하기 위해서 기본적인 오라클 클라이언트(Oracle Client) 뿐만 아니라 관리되는 데이터 프로바이더(Managed Data Provider)가 필요합니다. 데이터 프로바이더는 우리가 만들게 될 닷넷 어플리케이션 코드와 오라클 클라이언트 연결 소프트웨어 사이에 위치한 계층입니다. 대부분의 경우 닷넷 OLE DB 데이터 프로바이더가 아닌, 개별 데이터베이스 패키지에 최적화된 데이터 프로바이더를 사용할 때 어플리케이션은 최적의 성능을 발휘하게 됩니다.

    오라클, 마이크로소프트 뿐만 아니라 서드 파티 벤더들은 오라클에 최적화된 데이터 프로바이더를 제공하고 있습니다. 오라클과 마이크로소프트는 무료로 이같은 데이터 프로바이더를 제공하고 있습니다. (마이크로소프트의 닷넷 프레임워크 2.0에 데이터 프로바이더가 포함되어 있긴 하지만, 여전히 오라클 클라이언트를 필요로 합니다) 이 글에서는, 마이크로소프트가 닷넷 프레임워크에 제공하는 데이터 프로바이더 대신, 오라클이 공급하는 Oracle Data Provider for .NET (이하 ODP.NET) 을 사용할 예정입니다. ODP.NET 은 오라클 데이터베이스 혹은 오라클이 제공하는 별도의 다운로드 경로(http://tinyurl.com/ndouwh)를 통해서 다운로드 받을 수 있습니다.

    ODP.NET 은 표준 ADO.NET 데이터 엑세스를 제공할 뿐만 아니라, XML DB, 데이터 엑세스 성능 최적화, RAC(Real Application Clusters) 커넥션 풀링과 같은 오라클만의 특화된 기능들을 사용할 수 있도록 해줍니다.

    ODP.NET 과 오라클 클라이언트 소프트웨어가 설치되었다면, 비주얼 스튜디오를 통한 오라클 연계 어플리케이션 개발을 할 준비가 완료되었습니다. 개발을 시작하기 전에 오라클 데이터베이스와의 연결 상태를 확인하는 것은 좋은 생각입니다. 오라클 클라이언트 소프트웨어에 기본적으로 제공되는 SQL*Plus 와 같은 도구를 이용해서 데이터베이스 연결이 잘 되는지 테스트 해보시기 바랍니다.

    비주얼 스튜디오 2008 에서 프로젝트 생성하기

    지금부터 오라클 데이터베이스에서 데이터를 추출하는 ODP.NET 어플리케이션을 만들어 보도록 하겟습니다. 에러 핸들링과 관련한 부분은 글 후반부에 다루도록 하겠습니다. 비주얼 스튜디오를 실행한 후, 가장 먼저 해야 할 일은 프로젝트를 생성하는 것입니다. File 메뉴의 New > Project 를 선택하여 프로젝트를 생성하겠습니다.


    새 프로젝트 창이 열리면 개발 하고자 하는 언어를 선택하고 (주: 이 글에서는 Visual C# 을 이용하여 코드 샘플을 보여주도록 하겠습니다) "Windows Form 응용 프로그램" 템플릿을 선택하도록 하겠습니다. 프로젝트와 솔루션 이름은 임의로 OraWinApp 라고 정하도록 하겠습니다. 이름을 입력한 후 "확인" 버튼을 눌러 프로젝트를 생성합니다.


    참조 추가하기

    OraWinApp 프로젝트는 오라클 데이터베이스에 연결되어야 하므로, 우리가 선택한 ODP.NET 데이터 프로바이더의 DLL 파일을 프로젝트에 참조로 추가해야만 합니다. 일반적인 어플리케이션 개발의 참조 추가와 마찬가지로 "솔루션 탐색기"의 "참조"에서 마우스 오른쪽 버튼을 눌러 "참조 추가"를 선택합니다. (혹은 프로젝트에서 마우스 오른쪽 버튼을 눌러 "참조 추가"를 선택해도 관계 없습니다)

    참조 추가 방법 #1


    참조 추가 방법 #2

    참조 추가 다이얼로그가 출력되면 "Oracle.DataAccess" 컴포넌트를 찾아서 확인 버튼을 누르면 됩니다. 설치된 오라클 클라이언트 버전에 따라 버전 정보, 런타임 정보가 조금 상이할 수 있습니다. 가능하면 최신 버전의 런타임을 사용하는 것이 좋지만, 일반적인 경우 런타임 버전에 따라 생기는 큰 차이점은 없습니다.


    참조 추가가 완료되면 오라클 데이터베이스를 이용하는 닷넷 어플리케이션 개발의 준비는 모두 끝납니다. 다음 글에서는 실제로 Oracle.DataAccess 컴포넌트를 이용하여 코드를 어떻게 만드는지 본격적인 개발 작업에 들어가도록 하겠습니다.

    - NoPD -

     

    신고
    Posted by 노피디
    Development/Database2009.08.28 11:17

    닷넷 환경에서 오라클을 개발하기 위한 방법은 크게 두가지이다. 오라클 클라이언트를 전체 설치할 때 따라오는 ODP.NET (Oracle Data Provider for .NET) 만을 이용하는 방법이 한가지이고, 다른 하나는 Visual Studio IDE 환경에 Plug-in 가능한 ODT.NET (Oracle Developer Tools for Visual Studio.NET) 을 설치해서 사용하는 방법이 다른 한가지이다.

    복잡하지 않은 개발을 하는 상황이고 데이터베이스에 의존적인 개발이 적은 경우 (예>Stored Procedure 의 사용 등) 에는 전자의 방법을 사용하는 것이 간단하며, 그렇지 않은 경우는 ODT.NET 을 설치해서 사용하는 것이 디버깅, 개발 효율성 측면에서 훨씬 우수할 수 있다.

    NoPD 의 경우 마이크로소프트가 닷넷 환경에서 제공하는 표준 Provider (System.Data.OracleClient) 를 사용하던 도중 오라클 Provider 로 교체를 하는 케이스를 경험했었는데, 구문이라던가 사용하는 방법이 크게 다르지 않기 때문에 마이그레이션을 하는 경우에도 전자의 방법을 강력하게 추천한다.

    ※ ODT.NET 다운로드 : http://tinyurl.com/lvcw56

    - NoPD -
    신고
    Posted by 노피디
    Development/Database2009.08.28 09:07
    그동안 닷넷 환경에서 오라클을 연계해서 개발하는 프로젝트를 많이 해보지 못했다. 최근 몇 건의 오라클 연계 프로젝트에서 닷넷과 작업을 하면서 한글로 된 Article 의 부재와 기술 지원의 미비함을 보면서 뭔가 직접 작업을 좀 해봐야 겠다는 생각을 무척 많이 하게되었고, 관련된 Oracle.com 의 영문 아티클들 번역을 시작해 볼까 한다.

    - 오라클 닷넷 개발자 센터 : http://www.oracle.com/technology/tech/dotnet/index.html
    - ODP.NET 개발자 센터 : http://www.oracle.com/technology/tech/windows/odpnet/index.html

    시간이 얼마나 걸릴지 모르지만, 하루 한개의 아티클을 번역한다는 개념으로 열심히 하다보면 언젠가 쓸만한 한글 기술문서 셋트가 될 수 있지 않을까 싶다.

    - NoPD -
    신고
    Posted by 노피디
    Development/Database2009.05.11 12:47
    If you experience ORA-12537 connection closing after you opened firewall properly, you should check contents of protocol.ora file placed in Oracle Server.Generally, you can find it at "$ORACLE_HOME/network/admin/protocol.ora".


    tcp.validnode_checking = yes
    tcp.invited_nodes=( 192.168.0.100 )


    Above config means, 152.68.18.73 is the only IP address which has authority to contact this Oracle Server. Be careful not to miss add server own IP address should be here.


    tcp.validnode_checking = yes
    tcp.excluded_nodes= (192.168.0.100 )


    If you set any IP address into tcp.excluded_nodes item, that IP will be blocked when try to connect Oracle Server. Surely, you can use invited and excluded nodes with in same protocol.ora file simultaneously. When you need to allow more IP addresses, you can describe IP addresses in one line with comma seperation.


    tcp.validnode_checking = yes
    tcp.invited_nodes=( 192.168.0.100, 192.168.0.101 )


    If you have so many IP addresses to allow or block, you can use IP range like 192.168.0.0 (B-Class). And you also can use domain name to describe specific IP address. Let`s see below example.


    tcp.validnode_checking = yes
    tcp.invited_nodes=( 192.168.0.100, 192.168.0.101, 192.168.0.0 )


    Once you change on protocol.ora file, you should restart Oracle listener to make it effective.

    - NoPD -
    신고
    Posted by 노피디
    Development/Database2009.05.08 23:09
    Last night, I have got request from my customer. He wanted to know how many XML nodes are there in XML log table placed in Oracle. I tried to find sufficient oracle function but couldn`t. So I make slightly dirty SQL query but it was very helpful to reduce manual job. Let`s see SQL query first.

    SELECT xml_seq, 
           to_char((length(xml_recv)-length(replace(xml_recv,'<ITEM>',''))) / length('<ITEM>')) as item_count
      FROM tbl_xml_log
    
    Look above SQL carefully. It looks dirty calculation about length of column but very simple. You can change <ITEM> to string that you want to count on specific column. It would be helpful for guys who want to count repeated character in specific column.

    - NoPD -
    신고
    Posted by 노피디
    Development/Database2009.04.06 19:27
    오라클의 테이블에 DML 관련 작업을 하다보면 ORA-00054 에러를 종종 만나게 된다. (종종 만나지 말아야 하나, 어쩔 수 없이 만나는 듯) 인덱스 관련된 작업의 Lock 이나 기타 DML 작업에서 Lock 이 걸린 경우 이같은 증상을 많이 만날 수 있다.

    STEP 1 : Lock 이 발생한 OBJECT 확인
    SELECT object_id, object_type
        FROM dba_objects
      WHERE object_name='테이블 / 인덱스 이름';

    STEP 2 : Lock 을 잡고 있는 세션 ID 확인
    SELECT *
        FROM v$locked_object
      WHERE object_id='STEP1에서 검색한 object_id';

    (오라클 사용자 이름과 세션 ID 를 기억해 둔다)

    STEP 3 : Lock 을 잡고 있는 세션의 Serial 번호 확인
    SELECT sid, serial#, command, taddr
        FROM v$session
      WHERE sid='STEP2의 세션 ID 번호';

    STEP 4 : 세션 강제 종료
    ALTER SYSTEM KILL SESSION '<세션 ID, Serial#>';

    STEP 5 : 세션 종료 확인 및 Rollback 체크
    SELECT used_ublk
        FROM v$transaction
      WHERE ADDR='<STEP3의 TADDR>';

    참고 URL : http://kr.forums.oracle.com/forums/thread.jspa?messageID=1457903

    - NoPD -
    신고
    Posted by 노피디

    티스토리 툴바