プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

データベースへの接続

各項で、CONNECT文の詳細な構文について説明します。次のとおりです。

EXEC SQL CONNECT { :user IDENTIFIED BY :oldpswd | :usr_psw }
   [[ AT { dbname | :host_variable }] USING :connect_string ]
      [ {ALTER AUTHORIZATION :newpswd  |  IN { SYSDBA | SYSOPER } MODE} ] ;

データの問合せまたは操作をする前に、Pro*C/C++プログラムをデータベースに接続する必要があります。ログインするには、単にCONNECT文を使用します。

EXEC SQL CONNECT :username IDENTIFIED BY :password ; 

usernameおよびpasswordは、charまたはVARCHARホスト変数です。

または、この文は次のようにも指定できます。

EXEC SQL CONNECT :usr_pwd; 

ホスト変数usr_pwdには、スラッシュ文字(/)で区切られたユーザー名とパスワードが含まれます。

これらは、単純化したCONNECT文のサブセットです。

CONNECT文は、プログラムが実行する最初のSQL文であることが必要です。つまり、プリコンパイル・ユニット内では、他のSQL文をCONNECT文の前に物理的に置くことはできますが、論理的に置くことはできません。

Oracleのユーザー名とパスワードを別々に入力するには、2つのホスト変数を文字列またはVARCHARとして定義します。(ユーザー名とパスワードの両方を含むユーザー名を入力する場合、必要なホスト変数は1つのみです。)

CONNECTを実行する前に、ユーザー名とパスワードの変数を設定する必要があります。設定しない場合、CONNECTは失敗します。プログラムのプロンプトで値の入力を求めることも、次のように値をハードコードすることもできます。

char *username = "SCOTT"; 
char *password = "TIGER"; 
... 
EXEC SQL WHENEVER SQLERROR ... 
EXEC SQL CONNECT :username IDENTIFIED BY :password; 

ただし、ユーザー名とパスワードは、CONNECT文にはハードコードできません。また、引用符で囲んだリテラルは使用できません。たとえば、次の2つの文はどちらも無効です

EXEC SQL CONNECT SCOTT IDENTIFIED BY TIGER; 
EXEC SQL CONNECT 'SCOTT' IDENTIFIED BY 'TIGER'; 

ユーザー名およびパスワードをハードコードすることはお薦めしません。

ALTER AUTHORIZATION句を使用したパスワードの変更

Pro*C/C++のクライアント・アプリケーションでは、EXEC SQL CONNECT文を拡張し、実行時にユーザーのパスワードを変更できます。

この項では、様々なALTER AUTHORIZATION句の実行結果について説明します。

標準のCONNECT

アプリケーションで次の文が発行されるとします。

EXEC SQL CONNECT ..;   /* No ALTER AUTHORIZATION clause */

通常の接続が実行されます。予想される結果は次のとおりです。

  • アプリケーションが問題なく接続されます。

  • アプリケーションは接続できるが、パスワードに関する警告を受ける。この警告は、パスワードの期限は切れているが、まだログインできる猶予期間であることを示しています。この時点で、ユーザーは、アカウントがロックされる前にパスワードを変更するように求められます。

  • アプリケーションが接続に失敗します。次の原因が考えられます。

    • パスワードが間違っています。

    • アカウントが期限切れになっているか、またはロック状態です。

CONNECT文でのパスワードの変更

次のCONNECT文があるとします。

EXEC SQL CONNECT .. ALTER AUTHORIZATION :newpswd;

この文は、アプリケーションがアカウントのパスワードをnewpswdで指定した値に変更することを示します。変更後は、user/newpswdで接続試行が実行されます。次の結果が予想されます。

  • アプリケーションは問題なく接続できる。

  • アプリケーションが接続に失敗します。次のどちらかの原因が考えられます。

    • なんらかの理由でパスワードを認識できませんでした。パスワードは元のままです。

    • アカウントがロックされています。パスワードは変更できません。

Oracle Net Servicesを使用した接続

Oracle Net Servicesのドライバを使用して接続するには、tnsnames.ora構成ファイルまたはOracle Namesで定義されているサービス名を使用します。

Oracle Namesを使用する場合、ネーム・サーバーは、ネットワーク定義データベースからサービス名を取得します。

Oracle Net Servicesの詳細は、『Oracle Net Services管理者ガイド』を参照してください。

自動接続

ユーザー名を使用してOracleに自動的に接続できます。

CLUSTER$username 

usernameは現行のオペレーティング・システムのユーザー名、CLUSTER$usernameは有効なOracleデータベース・ユーザー名です。(CLUSTER$の実際の値は、INIT.ORAパラメータ・ファイルに定義されています。)Pro*C/C++プリコンパイラに渡すのはスラッシュ文字のみです。次に例を示します。

... 
char  *oracleid = "/"; 
... 
EXEC SQL CONNECT :oracleid; 

これにより、ユーザーCLUSTER$usernameで自動的に接続されます。たとえば、オペレーティング・システムのユーザー名がRHILLで、CLUSTER$RHILLが有効なOracleユーザー名の場合は、/を使用した接続により、ユーザーCLUSTER$RHILLでOracleに自動的にログインできます。

また、プリコンパイラには文字列内で/を渡すこともできます。ただし、その文字列の後続にブランクを入れないでください。たとえば、次のCONNECT文は失敗します。

... 
char oracleid[10] = "/    ";
... 
EXEC SQL CONNECT :oracleid; 

AUTO_CONNECTプリコンパイラ・オプション

AUTO_CONNECT=YESで、最初の実行SQL文を処理するときにアプリケーションがまだデータベースに接続されていない場合、次のユーザーIDを使用して接続が試行されます。

CLUSTER$<username>

usernameは現行のオペレーティング・システムのユーザー名またはタスク名、CLUSTER$usernameは有効なOracleユーザーIDです。AUTO_CONNECTのデフォルト値はNOです。

AUTO_CONNECT=NOの場合、Oracleに接続するにはプログラムでCONNECT文を使用する必要があります。

SYSDBAまたはSYSOPERシステム権限

SYSDBAまたはSYSOPERシステム権限でログインするには、次のオプション文字列を他のすべての句の後に追加します。

[IN { SYSDBA | SYSOPER } MODE]

次に例を示します。

EXEC SQL CONNECT ... IN SYSDBA MODE ;

このオプションには次の制限があります。

  • プリコンパイラのAUTO_CONNECT=YESオプション設定を使用する場合、このオプションは使用できません。

  • CONNECT文にALTER AUTHORIZATIONキーワードを使用している場合、このオプションは使用できません。