Skip to Main Content

Japanese

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Pro*Cで「EXEC SQL AT」句のエラーについて

899187Nov 9 2011 — edited Nov 13 2011
お世話になります。
Pro*CでのEXEC SQL AT句について、複数ユーザをログインして、ユーザを切り替え(?)しようと
したとき、記述の仕方によって、エラーになるケースとならないケースとあって、困っています。

下に示すソースコードの要点を説明しますと、「_select_usr」という関数で操作しようとするユーザを
切り替えしています。
この関数を用いて、1回目((1)と示す箇所)は正常に明示出来ますが、2回目((2)と示す箇所)は
次のエラーメッセージが出ます。

ORACLE ERROR msg => SQL-02122: データベースへ接続でのOPENまたはPREPAREが無効です。

そこで、(2)の箇所をコメントにして、(3)で示す箇所の記述を有効、つまり「_select_usr」関数の
呼び出しを無効にし、EXEC SQL AT句を直に書き込んで実行すると、正常に別のユーザを明示して
くれます。

要は、関数を用いて、ユーザの切り替えが出来る様にしたいのですが、正常に実行出来る方法が
ありましたら、ご教示頂きたく存じます。

よろしくお願い致します。

-------------------------------------------------------------------------------
【環境仕様】

クライアントOS : Windows7 Professional SP1
Oracle : Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 (Linuxサーバ)
開発ツール : Microsoft Visual Studio 2005 Version 8.0.50727.42
Microsoft .NET Framework Version 2.0.50727 SP2
Microsoft Visual C++ 2005
Pro*C/C++(PC) : Pro*C/C++: Release 10.2.0.1.0
-------------------------------------------------------------------------------
【ソースコード】

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "sqlca.h"
#include "sqlda.h"


void* db_error_handler_ptr();
extern void truncate_blank(char *a);

static char *current_dbn;

static FILE *fp;

static void _connect( char* uid, char* pwd, char* host, char* dbn )
{
EXEC SQL CONNECT :uid IDENTIFIED BY :pwd AT :dbn USING :host;

fprintf(fp, "connect scima[%s] sqlcode[%d]\n", uid, sqlca.sqlcode );
}

void _disconnect(char *dbn)
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL AT :dbn ROLLBACK WORK RELEASE;

fprintf(fp, "disconnect dbn[%s] sqlcode[%d]\n", dbn, sqlca.sqlcode );
}

void ora_sql_error(char *file, int line)
{
char buf[512], *all_msg;
int buf_len, msg_len;

if (sqlca.sqlcode == -1405) {
return;
} else {
buf_len = sizeof(buf);
sqlglm(buf, &buf_len, &msg_len);
buf[msg_len] = '\0';

fprintf(fp, "ORACLE ERROR msg => %s\n", buf );
}
}

static int selectusr( char* dbn, char* uid )
{
int rtn;
char u[56];


EXEC SQL AT :dbn SELECT USER INTO :u FROM DUAL;

rtn = 1;
if (sqlca.sqlcode != 0) {
if (sqlca.sqlcode == -1012) {
rtn = -1;
}
ora_sql_error(__FILE__, __LINE__);
} else {
rtn = 0;
truncate_blank(u);
strcpy( uid, u );

fprintf(fp, "select scima[%s]\n", uid );

}

return( rtn );
}

void main()
{
char* uid1="UID1";
char* pwd1="PWD1";
char* name1="orcl";
char* db_name1="DB1";

char* uid2="UID2";
char* pwd2="PWD2";
char* name2="orcl";
char* db_name2="DB2";

char u[56];

fp = fopen("***.txt", "w");
if( !fp ) exit( 1 );

connect( uid1, pwd1, name1, dbname1 );
connect( uid2, pwd2, name2, dbname2 );

/*** (1) ↓ ***/
if( selectusr( db_name1, u )!=0 ){
exit( 1 );
}
fprintf( fp, "current scima(1) : [%s] \n", u );
/*** (1) ↑ ***/

/*** (2) ↓ ***/
if( selectusr( db_name2, u )!=0 ){
exit( 1 );
}
fprintf( fp, "current scima(2) : [%s] \n", u );
/*** (2) ↑ ***/

/*** (3) ↓ ***/
EXEC SQL AT :db_name2 SELECT USER INTO :u FROM DUAL;
if (sqlca.sqlcode != 0) {
if (sqlca.sqlcode == -1012) {
}
ora_sql_error(__FILE__, __LINE__);
exit( 1 );
} else {
truncate_blank(u);
fprintf( fp, "current scima(3) : [%s] \n", u );
}
/*** (3) ↑ ***/

disconnect(dbname1);
disconnect(dbname2);

if(fp) fclose(fp);
}
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Dec 11 2011
Added on Nov 9 2011
2 comments
1,907 views