プロが教えるわが家の防犯対策術!

Pro*Cで、自動作成された、プリコンパイラをリンクして実行すると、「セグメント例外 (コアダンプしました)」となって止まってしまう。
Pro*Cのリストは以下のとおりでうs。

#include<sqlca.h>
main()
{
chara[20],b[20];

strcpy(a,"XX");
strcpy(b,"XX");
printf("test start\n");

EXEC SQL WHENEVER SQLERROR GOTO sql_error;
EXEC SQL CONNECT :a IDENTIFIED BY :b;

return(0);

sql_error:
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
printf("error\n");
return(1);
}

どうやら、Oracleへ接続してるところで、sqloxtという関数を呼び出しているところで止まってしまうらしいです。
コンパイル、リンクまでは、何事もなくいったのですが、実行してみるとダメです。
なにが、おかしいのでしょうか?

A 回答 (3件)

 えとですね。



 文字列は必ず、EXEC SQL BEGIN DECLARE SECTION; 内でホスト変数として宣言しなければいけません。
 なぜなら、通常の変数と違い、ホスト変数は実は構造体になっており、文字列の長さを設定するところがあるからです。
 今回の件は、通常の文字列を「構造体として」読もうとしているため、アクセスできない領域に無理矢理アクセスしようとしてコアダンプを吐いて止まってしまっています。

 また、このとき注意すべき点としては、文字列の長さを表す変数には、プログラマー(つまり Kannazuki さん自身)が自分で長さを設定しなければならないことでしょう。これが間違っているとオラクルはエラーを返します。

 具体的にはこうやります。

----------
char a[20], b[20];
   ↓
EXEC SQL BEGIN DECLARE SECTION;
varchar a[20], b[20];
EXEC SQL END DECLARE SECTION;

---------
strcpy(a,"XX");
strcpy(b,"XX");
   ↓
strcpy(a.arr, "XX");
a.len=strlen(a.arr);
strcpy(b.arr, "XX");
b.len=strlen(b.arr);
---------

 とまあ、これをやれば動くはずです。

この回答への補足

ありがとうございます。
ソースを変更してみましたが、現象は変わりませんでした。
もしかしたら、コンパイラの方が影響してるのかもしれません。
gccコンパイラでコンパイルしたら、以前のソースでも問題なく動作しました。
ForteCC(CC)コンパイラでコンパイルしたら、コアをはいて異常終了してしまいました。
コンパイラによっては、Oracle8iは、使えないのでしょうか?

ソースは、以下のように変更しましてみました。

#include<sqlca.h>
EXEC SQL BEGIN DECLARE SECTION;
varchar a[20], b[20];
EXEC SQL END DECLARE SECTION;

main()
{

strcpy(a.arr, "seqpos");
a.len=strlen(a.arr);
strcpy(b.arr, "seqpos");
b.len=strlen(b.arr);

EXEC SQL WHENEVER SQLERROR GOTO sql_error;
EXEC SQL CONNECT :a IDENTIFIED BY :b;

return(0);

sql_error:
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
printf("error\n");
return(1);
}

補足日時:2001/09/25 19:21
    • good
    • 0

>コンパイラによっては、Oracle8iは、使えないのでしょうか?


 可能性はあります。
 ForteCC は使ったことがないので何とも言えませんが。
 使える方のコンパイラを使うことはできないのでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございました。
いろいろ親切に答えてくれまして・・・
いろいろ調査してみます。
また、なにかありましたら、よろしくお願いします。

お礼日時:2001/09/26 10:11

Pro*C&Oracle未経験ですが・・・。

(^_^;
参考URLをご覧下さい。

参考URL:http://ash.or.jp/ash/db/ora_c.htm
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!