• ベストアンサー

Cソースにホスト変数を宣言したヘッダをインクルード方法

C言語ソースにホスト変数を宣言したヘッダをインクルードする記述を教えてください。下記の記述をしたのですが、エラーになります。 EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; #include "../host_header.h" EXEC SQL END DECLARE SECTION;

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> ファイルが無いとエラーになってしまいました。。。。 質問に ../host_header.h とあったので、ソースファイルがあるひとつ上に host_header.h があると思ったのですが、実際にファイルはあるのですか?

akinosuke
質問者

お礼

できました。ヘッダーファイルがソースの上の別ディレクトリにあったため、 エラーとなっていました。ありがとうございます。

その他の回答 (2)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

EXEC SQL BEGIN DECLARE SECTION ~ END は、SQL のプリプロセッサが 解釈するところなので、Cのディレクティブを理解できないんじゃないで しょうか? こんな感じじゃ駄目なのかな? EXEC SQL BEGIN DECLARE SECTION; EXEC SQL INCLUDE '../host_header.h' EXEC SQL END DECLARE SECTION; # やったことはないので、自信はないです (^^;

akinosuke
質問者

補足

回答ありがとうございます。ただ、やってみたのですが、ファイルが無いとエラーになってしまいました。。。。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

C言語というより、ある種のSQLプリプロセッサだろうと思いますが。 環境やエラーの内容について書いて頂いた方が的確な回答が出ると思います。 とりあえず、C言語(Cプリプロセッサ)のインクルード文としては、 上記の記述で普通は大丈夫です。ただし、ディレクトリを書き込むのではなく、 ソース中では #include "host_header.h" のようにして、コンパイルオプション(UNIXのCなら-Iなど)でインクルード ファイルのディレクトリを指定するのが、より一般的です。

akinosuke
質問者

補足

#include "host_header.h" と記述したのですが、下記のエラーメッセージが出ます。 エラーメッセージは”SQL0008N ホスト変数宣言で見つかった字句 "#" が無効です。” OSはNTです。

関連するQ&A

  • PRO*Cでテーブル名にバインド変数は使えますか?

    PRO*Cのプログラムで、テーブル名とカラム名をパラメータで 受け取って、ホスト変数(バインド変数?)に代入して、 それぞれ、SELECT文等で使用できますか? PL/SQLなら出来るでしょうか? EXEC SQL BEGIN DECLARE SECTION; varchar t_name[64]; /* テーブル名 */ varchar col_name[64]; /* カラム名 */ EXEC SQL END DECLARE SECTION; /* 中略 パラメータの値をホスト変数に代入する処理を行う */ ↓以下のように出来ますか? SELECT :col_name FROM :t_name ;

  • ROWID型の宣言について(Pro*C)

    (Oracle9i) Pro*Cにて、ROWIDを使用したSELECT&INSERTをしたいのですが、 ホスト変数をROWID型で宣言しようとするとエラーになります。 [PCC-S-02201, 記号"rowid"が見つかりました。 次のうちの1つが入るとき~] 宣言の仕方は以下の通りです。  EXEC SQL BEGIN DECLARE SECTION;   rowid fetch_ROWID;   short fetch_ROWID_ind;  EXEC SQL END DECLARE SECTION; ROWIDという型はORACLEにあるので、なぜプリコンパイルが通らないのか 分かりません。 どなたかお分かりになる方がいらっしゃいましたらよろしくお願いいします。 ちなみに以下のような使い方をしようとしていますので、参考までに 載せておきます。  EXEC SQL DECLARE C_XXX CURSOR FOR   SELECT ・・・,ROWID FROM XXX FOR UPDATE ・・・  EXEC SQL OPEN C_XXX;  EXEC SQL WHENEVER NOT FOUND DO break;  while(1){   EXEC SQL FETCH C_XXX INTO    ・・・,    :fetch_ROWID:fetch_ROWID_ind;   EXEC SQL    UPDATE XXX    SET ・・・    WHERE ROWID=:fetch_ROWID:fetch_ROWID_ind;  }

  • EXEC SQL INSERT時のホスト変数に関して

    いつもお世話になります。今回は静的SQLに関して質問です。 次のファイルがあるとします(DB2使用)。 ■レイアウト FILEA フィールド 桁数 属性 1. FLD010 5 A 2. FLD020 7 A 3. FLD030 1 A ■プログラム(簡略) EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; struct DEF_FILE_A { char fld010[6]; char fld020[8]; char fld030[2]; } a; EXEC SQL DECLARE c1 CURSOR FOR SELECT FLD010, FLD020, FLD030 FROM XXXXXX EXEC SQL OPEN c1; EXEC SQL FETCH c1 INTO :a.fld010, a.fld020, a.fld030; (中略) EXEC SQL CLOSE c1; 問題なのはSQLコーディング上のホスト変数に関してです。 上記のstruct DEF_FILE_Aの記述のように、実際のファイルの フィールド長に+1した長さの定義をして(NULL値が入るから)記述しています。これにより、fld010~fld030の値には正しい結果が、 FETCHで入ってきています。 ところが同じように、このファイルに挿入する場合に 下記のように記述しました。 EXEC SQL INSERT INTO XXXXXX(FLD010, FLD020, FLD030) VALUES ( :a.fld010, :a.fld020, :a.fld030 ); を、実行しますと、SQLCODEには-433(Value is too long)が 入ってきて、INSERTされません。別に実行時にエラーで落ちたりはしませんが、結果として何も挿入されません。 試しに、ファイルレイアウトと同じ桁数の別のホスト変数を 定義して試してみました。結果はOKでした。 皆さんにお聞きしたいのは、SQLの記述では、入力時は +1桁したホスト変数で受け、更新や挿入時にはファイルレイアウト と同じ桁数で定義した別のホスト変数を定義しないといけないのでしょうか? それとも、根本的に間違った解釈をしているでしょうか? 宜しくご教授頂きたく存じます。

  • Pro*cのバインド変数をカンマ区切りで指定できますか?

    Pro*cのバインド変数で下記のようなwhere句のinでカンマ区切りを指定することはできないのでしょうか? Oracle9iです。 適当な書き方で申し訳ありませんがよろしくお願いします。 ------------------------ EXEC SQL BEGIN DECLARE SECTION; const char *bindAAA; EXEC SQL END DECLARE SECTION; // bindAAAバインド変数に'1,2,3'という具合に格納 ↓のSQLを実行したい select * from AAA where BBB in (:bindAAA)

  • Pro*C NUMBER型のカラムにホスト変数を使用してINSERTしたいとき

    テーブルの定義 ----------------------------------------- TableName ColmunName 型    Length ----------------------------------------- T1     C1     VERCHAR2 20       C2     NUMBER  16(0) ----------------------------------------- プログラム <stdio.h> <string.h> <sqlca.h> void main(void){   char statement[1024 + 1];   /* ホスト変数定義 */   EXEC SQL BEGIN DECLARE SECTION;     VERCHAR hC1;     <?????> hC2;             ← ココです(^^;   /* INSERT文の定義 */   strcpy(statement, "INSERT INTO T1 (C1,C2) VALUES (?,?)");   EXEC SQL PREPARE S1 FROM :statement;    /* メイン(ループ) */   while(1)     hC1 (ファイルから読込んだ値を代入)     hC2 (ファイルから読込んだ値を代入)     EXEC SQL EXECUTE S1 USING :hC1, :hC2;   } } <質問> 上記のテーブルに、あるファイルから読込んだデータを、 ホスト変数hC1、hC2に代入して、 INSERTしたいのですが、 カラムC2の型がNUMBERの16桁のため、 ホスト変数hC2の型を何で定義したら良いのか わかりません。 (ちなみに、ファイルはテキストで読込みます) 何か良い方法があるのでしょうか?

  • Pro c/c++ でホスト変数の後に.lenとか.arrの意味は?

    お世話になっています。 早速ですが ----------------略--------------- EXEC SQL BEGIN DECLAR SECTION VARCHAR A[2]; EXEC SQL END DECLAR SECTION A.len = sprintf( (char*)A.arr, "%s", B ) ---------------------------------------- 上記のようなソースがあったとき.lenと.arrは何の役割を果たしている のでしょうか?よくわからくて困っています。 わかる方がいらしたら、どうかご教授ください。

  • C言語でヘッダファイルにグローバル変数を宣言する

    main.hに static int a; と記述し、main.cで #include "main.h" [省略] a=10; のように使用して、-Wallをつけてコンパイルすると、main.cで使用しているにも関わらず、 'a' defined but not used という警告が表示されます。 同様に、関数においても、ヘッダファイルでstaticをつけると ‘~’ declared ‘static’ but never defined と警告されます。 静的グローバル変数などは、ソースファイル内で宣言しなければいけないのでしょうか?ヘッダファイル内で宣言しても警告が出ないような方法はありますか?

  • CでSQLのテーブルを読む

    SQLのテーブルがあります。 レコードを1行ずつ読むソースを教えてください。 データベースはさっぱり分かりません。 create table mytable (  name text,  age int ); このテーブルからint型のageを列挙したいと思います。 intを読むわけですから EXEC SQL BEGIN DECLARE SECTION; int i; EXEC SQL END DECLARE SECTION; が必要ですよね。あとはさっぱり分かりません。

  • pro*c で pl/sql に変数を渡すとora-01458発生

    oracle初心者です。よろしくお願いします。 oracleのバージョンは 10.1.0.2.0 開発言語はpro*c pl/sql です。 テキストファイルを処理するAPを作成しています。 ディレクトリオブジェクト名を、pro*cからpl/sqlを呼び出す際に変数として渡していますが、実行するとora-01458エラーが発生してしまいます。 pro*cのコーディングは以下の通りです。 EXEC SQL BEGIN DECLARE SECTION; char Pass[50+1]; char Txtnm[20+1]; int nStatus; VARCHAR vErrMsg[100+1]; VARCHAR vErrCode[10+1]; EXEC SQL END DECLARE SECTION; ZeroMemory( Pass, sizeof( Pass ) ); strcpy( Pass, "DIR_A" ); ZeroMemory( Txtnm, sizeof( Txtnm) ); strcpy( Txtnm, "TEST.txt" ); EXEC SQL EXECUTE BEGIN  proc9999( :Pass, :Txtnm, :nStatus, :vErrMsg, :vErrCode ); END; END-EXEC; しかし、このpl/sqlをsqlplusから下記の内容で実行すると正常に動作します。 DECLARE in_file_dir VARCHAR2(255) :='DIR_A'; in_file_name VARCHAR2(255) :='TEST.txt'; io_sts number; io_msg VARCHAR2(255); io_msgcd VARCHAR2(10); BEGIN PROC9999( in_file_dir, in_file_name, io_sts, io_msg, io_msgcd ); END; 同じことをしていると思うのですが何故pro*cではエラーになるのでしょうか?

  • T-SQLでのテキスト型変数の宣言方法

    何方かT-SQL(MS-SQL Server7.0)でのテキスト型変数の宣言方法をご存知の方がおられたらご教授下さい。 以下で宣言した場合は、エラーになりました。 DECLARE @case_history VARCHAR(255) 宜しくお願いします。