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という関数を呼び出しているところで止まってしまうらしいです。
コンパイル、リンクまでは、何事もなくいったのですが、実行してみるとダメです。
なにが、おかしいのでしょうか?

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qアクセスの日付/時刻型で標準型を選択した場合のXX/XX/XX 00:00:00の時刻部分が表示されない

アクセスデータベースについてお教え下さい。

アクセスデータベースのフィールドを日付/時刻型のGeneral Date(標準)に設定した場合、たとえば、2002/02/25 00:00:00と入力すると、00:00:00の部分が省略されてしまいますが(00:00:00でないと表示されるのですが)、00:00:00を表示させるには、どのようにしたらよろしいでしょうか

環境は:Windows2000上でAccess2000を使用しています。

Aベストアンサー

プロパティを標準→yyyy/mm/dd hh:nn:ss
と入力してください。
何かあれば補足して下さい。

QSQL文の後についてる「:;」ってなに?

select * from xxtable:; とか、最後にくっつけるモノにはなにか意味が?
わたしは、別にくっつけないで、「そりゃF5~」ってやってるんですけど。
SQLコマンド文を考える時に参考にしてる本には、特に書いてないのです。
やるからには、意味を知っておきたい気分って程度です。よろしく。

Aベストアンサー

 もう少し説明を付け加えます。
 SQL PLUSでは、SQL文が入力後に改行コードを受け取ってもSQLの実行を行いません。つまり、SQL文が複数行に分かれて記述されている事を前提に動いているからです。SQL PLUSは、「;」を読みこんだ時に初めてSQL文が終了した事が分かるので、今まで入力されてきたSQL文を解釈して実行します。

QSQLとPL/SQLの違いなど

いま会社でPL/SQLのシステムを構築する話が持ち上がっているのですが
SQLとPL/SQLでどのような違いがあるのかがいまいち分かりません。
あと、PL/SQLの開発システムを導入しようとするときに
どのようなソフトを入れればよいのかも、よく分かっていない始末です。

単純な質問なのかもしれませんが、わかる方よろしくお願いします。

Aベストアンサー

>SQLとPL/SQLでどのような違いがあるのかがいまいち分かりません。

簡単に言いますとBASICに似た構文のプログラムをオラクル(DBMS)がSQLと同じレベルで処理してくれるものです。
他のデータベースで言うところのストアドプロシージャと同じですからロードはオラクル内に格納されオラクル内で実行されます。


>あと、PL/SQLの開発システムを導入しようとするときにどのようなソフトを入れればよいのかも、よく分かっていない始末です。

サーバにオラクルがインストールされていれば何もいらないと思います。
もちろん開発はテキストエディタになってしまいますが。

QSQL研修で使うSQLツール

会社からSQLを新人たちに教えるように言われておりまして、教育環境の構築に悩んでおります。10人、2日間くらいの研修です。

ポイントは、
・低コストであること。(無料が望ましい)
・SQL方言をなるべく使用しないで行う。
・グラフィカルなSQL実行ツールは使わず、SQLをガリガリ書かせる。

とりあえず、こんな感じです。
皆それぞれの現場でそれぞれのRDBMSを使っておりますので、なるべく標準(標準ってなんだ?)で行きたいと思っています。

現在は、
・PostgreSQLを私のマシンにインストールする。
・各クライアントにPostgreSQLのODBCドライバをインストール

かなぁと思っていますが、その先のSQLをガリガリ書くSQLツールは何がいいか迷ってます。ValueSQLというツールが良さそうなんで検討していますが、皆さんなら上記環境をどのように構築しますか?

Aベストアンサー

>・PostgreSQLを私のマシンにインストールする。
>・各クライアントにPostgreSQLのODBCドライバをインストール
自分だったらこんなことせずに各PCに個々にPostgreSQLをインストールさせる。
後はコマンドプロンプトから直接やらせる。
って感じですかね。
そのPostgreSQLのインストールと初期設定も新人にやらせて覚えさせる。

QPL/SQLでのSQL文法

こんにちは。教えてください。
PL/SQLを使うのが初めで戸惑っています。
まず、PROCEDUREで
===========================
BEGIN

SELECT NAME FROM TABLE1 WHERE NAME='tanaka';

END;
/
===========================
このように書いて実行させようとすると、「コンパイルエラー」
「INTO句はこのSELECT文に入ります」というエラーが出ます。
SQLの文法的には間違ってないと思うのですが、INTO句とはこれいかに??

ネットでPL/SQLで検索かけて調べたのですがあまりにも初歩すぎて
わかりませんでした。
PL/SQLやORACLEのメーリングリストでお勧めがありましたら教えてください。
よろしくお願いいたします。

Aベストアンサー

コーディング例です。

**************************************************
*非ループ処理の例
**************************************************
.CREATE OR REPLACE PROCEDURE JOB1
.IS
.
.  w_NAME1  CHAR(10);
.
.BEGIN
.
.  SELECT NAME1 INTO w_NAME1 FROM TABLE1
.  WHERE TBL1_KEY = 'tanaka';
.
.  UPDATE TABLE2 SET NAME2 = w_NAME1
.  WHERE TBL2_KEY =  'tanaka';
.
.  COMMIT;
.
.EXCEPTION
.  WHEN OTHERS THEN
.    ROLLBACK;
.END;
./
**************************************************
*ループ処理の例
**************************************************
.CREATE OR REPLACE PROCEDURE JOB2
.IS
.
.  w_TABLE1 TABLE1%ROWTYPE;
.
.  CURSOR  c_TABLE1 IS
.  SELECT  NAME1
.  FROM   TABLE1
.  ORDER BY NAME1;
.
.BEGIN
.
.  OPEN c_TABLE1;
.
.  LOOP

.    FETCH
.      c_TABLE1
.    INTO
.      w_TABLE1;
.    EXIT WHEN c_TABLE1%NOTFOUND;
.
.    UPDATE TABLE2 SET NAME2 = w_TABLE1.w_NAME1
.    WHERE TBL2_KEY = w_TABLE1.w_TBL1_KEY;
.
.  END LOOP;
.
.  CLOSE c_TABLE1;
.
.  COMMIT;
.
.EXCEPTION
.  WHEN OTHERS THEN
.    ROLLBACK;
.END;
./

先頭のピリオドは無視してください。どこかにミスがあったらごめんなさい。

コーディング例です。

**************************************************
*非ループ処理の例
**************************************************
.CREATE OR REPLACE PROCEDURE JOB1
.IS
.
.  w_NAME1  CHAR(10);
.
.BEGIN
.
.  SELECT NAME1 INTO w_NAME1 FROM TABLE1
.  WHERE TBL1_KEY = 'tanaka';
.
.  UPDATE TABLE2 SET NAME2 = w_NAME1
.  WHERE TBL2_KEY =  'tanaka';
.
.  COMMIT;
.
.EXCEPTION
.  WHEN OTHERS THEN
.    ROLLBAC...続きを読む


人気Q&Aランキング

おすすめ情報