- ベストアンサー
Oracleに接続時にコアをはいて終了してしまうエラーの原因と対処法
- Unix(soralis)でOracleに接続する際にコアをはいて終了してしまうエラーが発生しています。
- Pro*Cでプリコンパイラをリンクして実行すると「セグメント例外 (コアダンプしました)」となって止まる問題が発生しています。
- エラーの原因は、Oracleへの接続時に呼び出されるsqloxt関数で止まってしまうことです。コンパイルやリンクは正常に行われますが、実行時にエラーが発生します。解決策としては、sqloxt関数を確認し、適切なパラメータを設定する必要があります。
- みんなの回答 (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); --------- とまあ、これをやれば動くはずです。
その他の回答 (2)
>コンパイラによっては、Oracle8iは、使えないのでしょうか? 可能性はあります。 ForteCC は使ったことがないので何とも言えませんが。 使える方のコンパイラを使うことはできないのでしょうか。
お礼
ありがとうございました。 いろいろ親切に答えてくれまして・・・ いろいろ調査してみます。 また、なにかありましたら、よろしくお願いします。
- natural
- ベストアンサー率37% (419/1115)
Pro*C&Oracle未経験ですが・・・。(^_^; 参考URLをご覧下さい。
補足
ありがとうございます。 ソースを変更してみましたが、現象は変わりませんでした。 もしかしたら、コンパイラの方が影響してるのかもしれません。 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); }