各項で、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';
ユーザー名およびパスワードをハードコードすることはお薦めしません。
Pro*C/C++のクライアント・アプリケーションでは、EXEC SQL CONNECT文を拡張し、実行時にユーザーのパスワードを変更できます。
この項では、様々なALTER AUTHORIZATION句の実行結果について説明します。
アプリケーションで次の文が発行されるとします。
EXEC SQL CONNECT ..; /* No ALTER AUTHORIZATION clause */
通常の接続が実行されます。予想される結果は次のとおりです。
アプリケーションが問題なく接続されます。
アプリケーションは接続できるが、パスワードに関する警告を受ける。この警告は、パスワードの期限は切れているが、まだログインできる猶予期間であることを示しています。この時点で、ユーザーは、アカウントがロックされる前にパスワードを変更するように求められます。
アプリケーションが接続に失敗します。次の原因が考えられます。
パスワードが間違っています。
アカウントが期限切れになっているか、またはロック状態です。
次のCONNECT文があるとします。
EXEC SQL CONNECT .. ALTER AUTHORIZATION :newpswd;
この文は、アプリケーションがアカウントのパスワードをnewpswd
で指定した値に変更することを示します。変更後は、user
/newpswd
で接続試行が実行されます。次の結果が予想されます。
アプリケーションは問題なく接続できる。
アプリケーションが接続に失敗します。次のどちらかの原因が考えられます。
なんらかの理由でパスワードを認識できませんでした。パスワードは元のままです。
アカウントがロックされています。パスワードは変更できません。
Oracle Net Servicesのドライバを使用して接続するには、tnsnames.ora
構成ファイルまたはOracle Namesで定義されているサービス名を使用します。
Oracle Namesを使用する場合、ネーム・サーバーは、ネットワーク定義データベースからサービス名を取得します。
Oracle Net Servicesの詳細は、『Oracle Net Services管理者ガイド』を参照してください。
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=YESで、最初の実行SQL文を処理するときにアプリケーションがまだデータベースに接続されていない場合、次のユーザーIDを使用して接続が試行されます。
CLUSTER$<username>
usernameは現行のオペレーティング・システムのユーザー名またはタスク名、CLUSTER$usernameは有効なOracleユーザーIDです。AUTO_CONNECTのデフォルト値はNOです。
AUTO_CONNECT=NOの場合、Oracleに接続するにはプログラムでCONNECT文を使用する必要があります。