다음을 통해 공유


WCF 서비스 모델을 사용하여 Oracle Database에서 함수 및 프로시저 호출

Oracle Database용 Microsoft BizTalk 어댑터는 프로시저, 함수 및 패키지를 작업으로 표시합니다. WCF 서비스 모델에서 이러한 작업은 WCF 클라이언트에서 메서드로 표시됩니다. WCF 서비스 모델 및 Oracle 데이터베이스 어댑터:

  • 함수를 지원합니다. Oracle 함수의 RETURN 값은 WCF 클라이언트 메서드의 반환 값으로 표시됩니다. Oracle 매개 변수는 WCF 클라이언트 메서드에 대한 매개 변수(아래에 정의된 대로 적절한 방향)로 표시됩니다.

  • 지원 절차. Oracle 프로시저의 첫 번째 OUT 매개 변수는 WCF 클라이언트 메서드의 반환 값으로 표시됩니다. 다른 모든 Oracle 매개 변수는 WCF 클라이언트 메서드에 대한 매개 변수(아래에 정의된 대로 적절한 방향)로 표시됩니다.

  • Oracle 패키지를 지원합니다. 작업의 이름과 해당 매개 변수 형식의 네임스페이스는 패키지 이름으로 한정됩니다.

  • 오버로드된 함수 및 프로시저를 지원합니다.

  • 프로시저와 함수 모두에 대한 기본 Oracle 데이터 형식에 대한 IN, OUT 및 IN OUT 매개 변수를 지원합니다. OUT 매개 변수는 WCF 클라이언트 메서드에서 out 매개 변수로 표시되고 IN OUT 매개 변수는 ref 매개 변수로 표시됩니다.

  • 프로시저 및 함수에 대한 IN, OUT 및 IN OUT REF CURSOR 매개 변수와 함수 RETURN 값을 지원합니다. 자세한 내용은 WCF 서비스 모델을 사용하여 Oracle Database에서 REF CURSORS를 사용하여 작업 수행을 참조하세요.

  • 프로시저 및 함수에 대한 IN, OUT 및 IN OUT RECORD 형식 매개 변수와 함수 RETURN 값을 지원합니다. 자세한 내용은 WCF 서비스 모델을 사용하여 Oracle Database에서 RECORD 형식을 사용하여 작업 수행을 참조하세요.

이 항목에 사용된 예제 정보

이 항목의 예제에서는 /SCOTT/Package/ACCOUNT_PKG/GET_ACCOUNT 오버로드된 프로시저를 사용합니다. 이 절차는 계정 ID 또는 계정 이름을 기반으로 SCOTT/ACCOUNT 테이블에서 레코드를 읽습니다. 이 프로시저 및 테이블을 생성하는 스크립트는 SDK 샘플과 함께 제공됩니다. SDK 샘플에 대한 자세한 내용은 SDK의 샘플을 참조하세요.

WCF 클라이언트 클래스

다음 표에서는 WCF 클라이언트의 이름과 Oracle 데이터베이스 어댑터가 표시하는 프로시저, 함수 및 패키지에 대해 생성된 메서드를 보여 줍니다. 함수 또는 프로시저가 오버로드되지 않는 한 단일 WCF 클라이언트를 사용하여 스키마의 모든 함수, 스키마의 모든 프로시저 또는 패키지의 모든 함수 및 프로시저를 호출합니다.

Oracle 아티팩트 WCF 클라이언트 작업 이름 예제
프로시저 [SCHEMA] ProcedureClient. [PROC_NAME] SCOTTProcedureClient.MYPROC
함수 [SCHEMA] FunctionClient. [FUNC_NAME] SCOTTProcedureClient.MYFUNC
패키지(프로시저 또는 함수) [SCHEMA] Package[PACKAGE_NAME]Client. [PROC_NAME 또는 FUNC_NAME] SCOTTPackageMYPACKAGEClient.MYPROC

[SCHEMA] = Oracle 아티팩트 컬렉션; 예를 들어 SCOTT입니다.

[PROC_NAME] = Oracle 프로시저의 이름입니다. 예를 들어 MYPROC입니다.

[FUNC_NAME] = Oracle 함수의 이름입니다. 예를 들어 MYFUNC입니다.

[PACKAGE_NAME] = Oracle 패키지의 이름입니다.

Oracle Database 어댑터는 Oracle RECORD 형식 매개 변수 및 반환 값뿐만 아니라 REF CURSOR 매개 변수에서 반환된 결과 집합을 Oracle 레코드의 행 데이터(또는 필드)를 포함하는 복잡한 XML 형식으로 나타냅니다. WCF 서비스 모델에서 이러한 각 XML 형식은 .NET 클래스로 표시됩니다. 클래스의 속성은 RECORD 형식 또는 REF CURSOR 결과 집합의 필드를 나타냅니다. Oracle RECORD 형식은 항상 강력한 형식의 .NET 클래스로 표시됩니다. 그러나 REF CURSOR 결과 집합은 REF CURSOR 자체가 강력한 형식 또는 약한 형식으로 선언되는지 여부에 따라 강력한 형식의 레코드 또는 약한 형식의 레코드로 표시될 수 있습니다. REF CURSOR 또는 RECORD 형식 매개 변수(또는 반환 값)를 나타내는 클래스는 프로시저, 함수 또는 패키지에 따라 고유한 네임스페이스에 생성됩니다. 다음 표에서는 이러한 네임스페이스를 보여 줍니다.

Oracle 아티팩트 네임스페이스 예제
프로시저 [BASE_NS]. [SCHEMA]. 절차. [PROC_NAME] microsoft.lobservices.oracledb._2007._03.SCOTT. Procedure.MYPROC
함수 [BASE_NS]. [SCHEMA]. 함수. [FUNC_NAME] microsoft.lobservices.oracledb._2007._03.SCOTT. Function.MYFUNC
패키지(프로시저) [BASE_NS]. [SCHEMA]. 패키지. [PACKAGE_NAME]. [PROC_NAME] microsoft.lobservices.oracledb._2007._03.SCOTT. Package.MYPACKAGE.MYPROC
패키지(함수) [BASE_NS]. [SCHEMA]. 패키지. [PACKAGE_NAME]. [FUNC_NAME] microsoft.lobservices.oracledb._2007._03.SCOTT. Package.MYPACKAGE.MYFUNC
제네릭 레코드 집합(약한 형식) [BASE_NS] microsoft.lobservices.oracledb._2007._03

[BASE_NS] = 기본 어댑터 네임스페이스; microsoft.lobservices.oracledb._2007._03입니다.

[SCHEMA] = Oracle 아티팩트 컬렉션; 예를 들어 SCOTT입니다.

[PROC_NAME] = Oracle 프로시저의 이름입니다. 예를 들어; MYPROC.

[FUNC_NAME] = Oracle 함수의 이름입니다. 예를 들어 MYFUNC입니다.

[PACKAGE_NAME] = Oracle 패키지의 이름입니다.

이러한 네임스페이스를 RECORD 매개 변수에 사용하는 방법에 대한 자세한 내용은 WCF 서비스 모델을 사용하여 Oracle Database에서 RECORD 형식을 사용하여 작업 수행을 참조하세요. 이러한 네임스페이스를 REF CURSOR 매개 변수에 사용하는 방법에 대한 자세한 내용은 WCF 서비스 모델을 사용하여 Oracle Database에서 REF CURSORS를 사용하여 작업 수행을 참조하세요.

일반적으로 Oracle 매개 변수 및 반환 값은 WCF 클라이언트 메서드에서 다음과 같이 매핑됩니다.

  • Oracle IN 매개 변수는 .NET(입력) 매개 변수에 매핑됩니다.

  • Oracle OUT 매개 변수는 .NET out 매개 변수에 매핑됩니다.

  • Oracle IN OUT 매개 변수는 .NET ref 매개 변수에 매핑됩니다.

  • 함수 RETURN 값은 메서드 반환 값에 매핑됩니다.

    그러나 두 가지 중요한 예외가 있습니다.

  • Oracle IN OUT REF CURSOR 매개 변수는 입력 문자열과 출력(출력) 레코드 집합으로 분할됩니다. Oracle Database 어댑터는 IN REF CUSROR 매개 변수를 문자열로 나타내고 OUT REF CURSOR 매개 변수는 복합 형식(레코드 집합)으로 나타내므로 단일 매개 변수로 결합할 수 없습니다.

  • Oracle 프로시저의 첫 번째 OUT 매개 변수는 WCF 클라이언트 메서드의 반환 값에 매핑됩니다. 이는 표준 WCF 동작입니다.

    다음 예제에서는 간단한 Oracle 프로시저의 일부(SCOTT 스키마에 로드됨)와 호출하기 위해 생성된 WCF 클라이언트 메서드의 서명을 보여 줍니다. Oracle 프로시저에는 IN 매개 변수 3개, IN OUT 매개 변수 3개, OUT 매개 변수 3개가 있습니다. 그러나 WCF 클라이언트 메서드는 첫 번째 OUT 매개 변수에 대한 매개 변수를 매핑하지 않습니다. 대신 메서드 반환 값에 매핑됩니다.

CREATE or REPLACE PROCEDURE Sample_Procedure   
    (  
     INNUMBER      IN         NUMBER,  
     INVARCHAR     IN         VARCHAR2,  
     INDATE        IN         DATE,  
     INOUTNUMBER   IN OUT     NUMBER,  
     INOUTVARCHAR  IN OUT     VARCHAR,  
     INOUTDATE     IN OUT     DATE,  
     OUTNUMBER     OUT        NUMBER,  
     OUTVARCHAR    OUT        VARCHAR2,  
     OUTDATE       OUT        DATE  
    ) AS   
    BEGIN  
  
        ...  
  
    END;  
    /  
  
[System.Diagnostics.DebuggerStepThroughAttribute()]  
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]  
public partial class SCOTTProcedureClient : System.ServiceModel.ClientBase<SCOTTProcedure>, SCOTTProcedure {  
  
    public System.Nullable<decimal> SAMPLE_PROCEDURE  
       (  
        System.Nullable<decimal> INNUMBER,   
        string INVARCHAR,   
        System.Nullable\<System.DateTime\> INDATE,   
        ref System.Nullable<decimal> INOUTNUMBER,   
        ref string INOUTVARCHAR,   
        ref System.Nullable\<System.DateTime\> INOUTDATE,   
        out string OUTVARCHAR,   
        out System.Nullable\<System.DateTime\> OUTDATE  
        );  
}  

오버로드된 프로시저, 함수 및 패키지 지원

Oracle Database 어댑터는 오버로드된 각 아티팩트마다 표시되는 노드 ID 및 네임스페이스에 고유한 문자열을 추가하여 오버로드된 프로시저, 함수 및 패키지를 지원합니다. 이 문자열은 첫 번째 오버로드의 경우 "overload1"이고, 다음 오버로드의 경우 "overload2"입니다.

WCF 서비스 모델에서 오버로드된 각 프로시저 또는 함수는 고유한 WCF 클라이언트로 표시됩니다. 이는 SCHEMA의 모든 함수, SCHEMA의 모든 프로시저 또는 PACKAGE의 모든 프로시저 및 함수가 동일한 WCF 클라이언트에서 호출되는 오버로드되지 않은 경우와 다릅니다. 다음 표에서는 오버로드된 프로시저, 함수 및 패키지에 대해 생성된 WCF 클라이언트 이름 및 메서드를 보여 줍니다.

Oracle 아티팩트 WCF 클라이언트 이름 예제
오버로드된 패키지(프로시저) [스키마] Package[PACKAGE_NAME][PROC_NAME] ][OVERLOAD_ID]Client. [PROC_NAME] SCOTTPackageMYPACKAGEMYPROCoverload1Client.MYPROC
오버로드된 패키지(함수) [스키마] Package[PACKAGE_NAME][FUNC_NAME] ][OVERLOAD_ID]Client. [FUNC_NAME] SCOTTPackageMYPACKAGEMYFUNCoverload1Client.MYFUNC

[SCHEMA] = Oracle 아티팩트 컬렉션; 예를 들어 SCOTT입니다.

[PROC_NAME] = Oracle 프로시저의 이름입니다. 예를 들어; MYPROC.

[FUNC_NAME] = Oracle 함수의 이름입니다. 예를 들어 MYFUNC입니다.

[PACKAGE_NAME] = Oracle 패키지의 이름입니다.

[OVERLOAD_ID] = 오버로드된 아티팩트 를 식별하는 고유 문자열입니다. "overload1", "overload2" 등

다음 표에서는 오버로드된 프로시저, 함수 및 패키지에 대해 생성된 네임스페이스를 보여 줍니다.

Oracle 아티팩트 네임스페이스 예제
패키지(프로시저) [BASE_NS]. [SCHEMA]. 패키지. [PACKAGE_NAME]. [PROC_NAME] [OVERLOAD_ID] microsoft.lobservices.oracledb._2007._03.SCOTT. Package.MYPACKAGE.MYPROC.overload1
패키지(함수) [BASE_NS]. [SCHEMA]. 패키지. [PACKAGE_NAME]. [FUNC_NAME]. [OVERLOAD_ID] microsoft.lobservices.oracledb._2007._03.SCOTT. Package.MYPACKAGE.MYFUNC.overload1
제네릭 레코드 집합(약한 형식) [BASE_NS] microsoft.lobservices.oracledb._2007._03

[BASE_NS] = 기본 어댑터 네임스페이스; microsoft.lobservices.oracledb._2007._03.

[SCHEMA] = Oracle 아티팩트 컬렉션; 예를 들어 SCOTT입니다.

[PROC_NAME] = Oracle 프로시저의 이름입니다. 예를 들어; MYPROC.

[FUNC_NAME] = Oracle 함수의 이름입니다. 예를 들어 MYFUNC입니다.

[PACKAGE_NAME] = Oracle 패키지의 이름입니다.

[OVERLOAD_ID] = 오버로드된 아티팩트 를 식별하는 고유 문자열입니다. "overload1", "overload2" 등 문자열의 숫자 값은 Oracle 데이터베이스에서 유지 관리하는 아티팩트 오버로드 ID입니다.

다음 예제에서는 WCF 클라이언트 및 ACCOUNT_PKG 패키지의 오버로드된 GET_ACCOUNT 프로시저에 대해 생성된 메서드 서명을 보여 줍니다. (Oracle 선언이 포함됩니다.) 이 예제에서는 각 오버로드에 대해 고유한 WCF 클라이언트가 생성되는 방법과 각 클라이언트에 대해 생성된 메서드가 고유한 네임스페이스에서 레코드 집합을 반환하는 방법을 보여 주는 예제입니다.

/* Procedure that takes account ID and returns record for existing account in the ACCOUNT table */  
PROCEDURE get_account(aid IN account.acctid%TYPE, acct OUT account%ROWTYPE) ;  
  
/* Procedure that takes account name and returns record for existing account in the ACCOUNT table */  
PROCEDURE get_account(aname IN account.name%TYPE, acct OUT account%ROWTYPE) ;  
  
[System.Diagnostics.DebuggerStepThroughAttribute()]  
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]  
public partial class SCOTTPackageACCOUNT_PKGGET_ACCOUNToverload1Client : System.ServiceModel.ClientBase<SCOTTPackageACCOUNT_PKGGET_ACCOUNToverload1>, SCOTTPackageACCOUNT_PKGGET_ACCOUNToverload1 {  
  
    public microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNT.overload1.ACCTRECORD GET_ACCOUNT(System.Nullable<decimal> AID);  
}  
  
[System.Diagnostics.DebuggerStepThroughAttribute()]  
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]  
public partial class SCOTTPackageACCOUNT_PKGGET_ACCOUNToverload2Client : System.ServiceModel.ClientBase<SCOTTPackageACCOUNT_PKGGET_ACCOUNToverload2>, SCOTTPackageACCOUNT_PKGGET_ACCOUNToverload2 {  
  
    public microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNT.overload2.ACCTRECORD GET_ACCOUNT(string ANAME);  
}  

함수 및 프로시저 호출

WCF 클라이언트를 사용하여 함수 또는 프로시저를 호출하려면 다음 단계를 수행합니다.

  1. 대상 함수, 프로시저 또는 패키지에 대한 WCF 클라이언트 클래스를 생성합니다. 이 클래스에는 대상 아티팩트에서 호출할 작업에 대한 메서드가 포함되어야 합니다.

    참고

    어댑터 서비스 참조 Visual Studio 플러그 인 추가에서 오버로드된 함수 및 프로시저는 사용 가능한 범주 및 작업 상자에 [NAME].1, [NAME].2, [NAME].3 등으로 표시됩니다. 여기서 [NAME]은 오버로드된 아티팩트 이름이고 숫자 값은 Oracle 데이터베이스의 오버로드 ID입니다.

  2. WCF 클라이언트 클래스의 instance 만들고 해당 메서드를 호출하여 함수 또는 프로시저를 호출합니다.

    WCF 클라이언트 클래스를 만들고 Oracle 데이터베이스 어댑터에서 작업을 호출하는 방법에 대한 자세한 내용은 Oracle 데이터베이스 어댑터를 사용하는 WCF 서비스 모델 개요를 참조하세요.

    Oracle 데이터베이스 어댑터는 Oracle 데이터베이스의 트랜잭션 내에서 각 작업을 실행합니다.

중요

REF CURSOR 및 RECORD 형식 매개 변수 또는 함수 또는 프로시저(및 패키지)의 반환 값을 나타내는 클래스는 각 함수 또는 프로시저에 대한 고유한 네임스페이스에 선언됩니다. 예를 들어 두 개의 서로 다른 함수에서 반환 값으로 사용되는 PACKAGE REF CURSOR 형식이 각 WCF 클라이언트 메서드에 대한 고유한 네임스페이스에 선언됩니다. 이러한 서로 다른 반환 값을 보유하도록 별도의 변수를 선언하거나 WCF 클라이언트 메서드 중 하나를 호출할 때 변수를 적절하게 캐스팅해야 합니다.

다음 예제에서는 오버로드된 /SCOTT/Package/ACCOUNT_PKG/GET_ACCOUNT 프로시저를 호출하여 /SCOTT/ACCOUNT 테이블에서 계정 레코드를 가져오는 방법을 보여 줍니다. 먼저 /SCOTT/Package/ACCOUNT_PKG/CREATE_ACCOUNT 프로시저를 호출하여 새 레코드를 만듭니다. 그런 다음 GET_ACCOUNT 다른 오버로드를 호출하여 새 레코드를 두 번 다시 읽습니다. 이 예제에서는 CREATE_ACCOUNT 프로시저에 하나씩, GET_ACCOUNT 오버로드에 각각 하나씩 세 개의 WCF 클라이언트를 사용합니다. 별칭은 GET_ACCOUNT 반환 값에 사용되는 네임스페이스를 구분하는 데 사용됩니다. 전체 샘플은 SDK 샘플에서 사용할 수 있습니다. SDK 샘플에 대한 자세한 내용은 SDK의 샘플을 참조하세요.

using System;  
using System.Collections.Generic;  
using System.Text;  
  
// Add WCF, WCF Adapter LOB SDK, and Oracle Database adapter namepaces  
using System.ServiceModel;  
using Microsoft.ServiceModel.Channels;  
using Microsoft.Adapters.OracleDB;  
  
// Include this namespace for WCF Adapter LOB SDK and Oracle Database adapter exceptions  
using Microsoft.ServiceModel.Channels.Common;  
  
// Alias client namespaces to shorten declarations of "shared" types   
using CREATE_ACCOUNTns = microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.CREATE_ACCOUNT;  
using GET_ACCOUNT_BY_IDns = microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNT.overload1;  
using GET_ACCOUNT_BY_NAMEns = microsoft.lobservices.oracledb._2007._03.SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNT.overload2;  
  
// This sample demonstrates calling overloaded packaged procedures on Oracle  
// First a new account is created by calling CREATE_ACCOUNT which takes two record parameters  
// Then the information for the new account is returned by calling an overloaded procedure GET_ACCOUNT  
// The first overload returns the account information by account ID  
// The second overload returns the account information by account name  
// Notice that different clients (and namespaces) are created for overloaded procedures and functions  
namespace OracleOverloadsSM  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            decimal acctId;  
            string newAccountName = "Paula Bento";  
  
            Console.WriteLine("Creating clients");  
            // Create Client for CREATE_ACCOUNT Function  
            SCOTTPackageACCOUNT_PKGClient createAccountClient =   
                new SCOTTPackageACCOUNT_PKGClient("OracleDBBinding_SCOTT.Package.ACCOUNT_PKG");  
            // NOTE: user name and password are case-sensitive  
            createAccountClient.ClientCredentials.UserName.UserName = "SCOTT";  
            createAccountClient.ClientCredentials.UserName.Password = "TIGER";  
  
            // Create Client for GET_ACCOUNT Overload 1 -- takes ACCOUNT ID parameter  
            SCOTTPackageACCOUNT_PKGGET_ACCOUNToverload1Client getAccountByIdClient =   
                new SCOTTPackageACCOUNT_PKGGET_ACCOUNToverload1Client("OracleDBBinding_SCOTT.Package.ACCOUNT_PKG.GET_ACCOUNT.overload1");  
            // NOTE: user name and password are case-sensitive  
            getAccountByIdClient.ClientCredentials.UserName.UserName = "SCOTT";  
            getAccountByIdClient.ClientCredentials.UserName.Password = "TIGER";  
  
            // Create Client for GET_ACCOUNT Overload 2 -- takes ACCOUNT NAME parameter  
            // NOTE: this client can be created from configuration; detail provided here  
            // for demonstration  
            OracleDBBinding overload2Binding = new OracleDBBinding();  
            EndpointAddress overload2EndpointAddress = new EndpointAddress("oracleDB://ADAPTER");  
            SCOTTPackageACCOUNT_PKGGET_ACCOUNToverload2Client getAccountByNameClient =   
                new SCOTTPackageACCOUNT_PKGGET_ACCOUNToverload2Client(overload2Binding, overload2EndpointAddress);  
            // NOTE: user name and password are case-sensitive  
            getAccountByNameClient.ClientCredentials.UserName.UserName = "SCOTT";  
            getAccountByNameClient.ClientCredentials.UserName.Password = "TIGER";  
  
            try  
            {  
                Console.WriteLine("Opening clients -- please wait");  
                // Open clients  
                createAccountClient.Open();  
                getAccountByIdClient.Open();  
                getAccountByNameClient.Open();  
  
                Console.WriteLine("Creating new account");  
                // Create an account record  
                // NOTE: ACCTRECORD is defined in all three namespaces so specify the definition  
                // that corresponds to the client.  
                CREATE_ACCOUNTns.ACCTRECORD acctRec = new CREATE_ACCOUNTns.ACCTRECORD();  
  
                // Set any value for ACCTID -- new account ID is returned by CREATE_ACCOUNT  
                acctRec.ACCTID = 0;  
                acctRec.NAME = newAccountName;  
                acctRec.BALANCE = 10537;  
  
                // Create address record  
                CREATE_ACCOUNTns.ACCOUNT_PKGADDRESS_REC_TYPERECORD addrRec = new CREATE_ACCOUNTns.ACCOUNT_PKGADDRESS_REC_TYPERECORD();  
                addrRec.STREET = "456 Valley Rd";  
                addrRec.CITY = "New York";  
                addrRec.STATE = "NY";  
  
                // Create account  
                acctId = (decimal)createAccountClient.CREATE_ACCOUNT(acctRec, addrRec);  
                Console.WriteLine("New Account Created: AccountId = {0}, Name = {1}, Balance = {2:C}",  
                   acctId, acctRec.NAME, acctRec.BALANCE);  
  
                /* Get new account by Id */  
                GET_ACCOUNT_BY_IDns.ACCTRECORD acctById = getAccountByIdClient.GET_ACCOUNT(acctId);  
                Console.WriteLine("Account Returned by Id: AccountId={0}, Name={1}, Balance={2:C}",  
                    acctById.ACCTID, acctById.NAME, acctById.BALANCE);  
  
                /* Get new account by Name */  
                GET_ACCOUNT_BY_NAMEns.ACCTRECORD acctByName = getAccountByNameClient.GET_ACCOUNT(newAccountName);  
                Console.WriteLine("Account Returned by Name: AccountId={0}, Name={1}, Balance={2:C}",  
                    acctByName.ACCTID, acctByName.NAME, acctByName.BALANCE);  
  
                Console.WriteLine("Hit <RETURN> to finish");  
                Console.ReadLine();  
            }  
            catch (TargetSystemException tex)  
            {  
                Console.WriteLine("Exception occurred on the Oracle Database");  
                Console.WriteLine(tex.InnerException.Message);  
            }  
            catch (ConnectionException cex)  
            {  
                Console.WriteLine("Exception occurred connecting to the Oracle Database");  
                Console.WriteLine(cex.InnerException.Message);  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Exception is: " + ex.Message);  
                if (ex.InnerException != null)  
                {  
                    Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);  
                }  
                throw ex;  
            }  
            finally  
            {  
                // Close all the clients  
                createAccountClient.Close();  
                getAccountByIdClient.Close();  
                getAccountByNameClient.Close();  
            }  
  
        }  
    }  
}  

참고 항목

WCF 서비스 모델을 사용하여 Oracle 데이터베이스 애플리케이션 개발