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という関数を呼び出しているところで止まってしまうらしいです。
コンパイル、リンクまでは、何事もなくいったのですが、実行してみるとダメです。
なにが、おかしいのでしょうか?
No.2ベストアンサー
- 回答日時:
えとですね。
文字列は必ず、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);
}
No.3
- 回答日時:
>コンパイラによっては、Oracle8iは、使えないのでしょうか?
可能性はあります。
ForteCC は使ったことがないので何とも言えませんが。
使える方のコンパイラを使うことはできないのでしょうか。
ありがとうございました。
いろいろ親切に答えてくれまして・・・
いろいろ調査してみます。
また、なにかありましたら、よろしくお願いします。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- Excel(エクセル) EXCELの「接続」のSQLのコマンド文字列にて、セルから任意の数値を利用したい 2 2023/03/09 16:43
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQL文のエラー
-
SQL文を教えてください
-
SQLiteのREAL型について
-
Access VBAで行ラベルが定義さ...
-
SQLサーバで和暦から西暦に変換...
-
bcp in でエラー
-
Accessのマクロでモジュールを...
-
PL/SQLカーソルの2重FORループ...
-
キャッシュを使わずにSELECTを...
-
PL/SQLでSPOOLさせたいのですが...
-
ODBCリンクの際にACCESSでは読...
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
likeとsubstrの使いわけについて
-
Statement ignored というエラー
-
【Excel VBA】 WorksheetやRa...
-
今日の日付が入った行のデータ...
-
指定した年月までのデータを取...
-
sqlplusでヘッダーが付かない
-
エクセルVBAでUserFormを起動し...
-
Transact-SQLでストアードプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SSIS 変数の値をSQL実行タスク...
-
SQL文のエラー
-
SQLiteのREAL型について
-
百の位での四捨五入について
-
クエリファイルから外部のクエ...
-
SQL文を教えてください
-
sqlcmdの自動実行方法について
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
-
Accessの数値から時間に変換す...
-
ストアドプロシジャからストア...
-
VBA プロシージャの名前の取得
-
Statement ignored というエラー
-
sqlplusでヘッダーが付かない
-
全角空白のTRIMができない...
-
PL/SQLカーソルの2重FORループ...
-
キャッシュを使わずにSELECTを...
-
今日の日付が入った行のデータ...
-
ODBCリンクの際にACCESSでは読...
おすすめ情報