Pro*C NUMBER型でホスト変数を使用してINSERTする方法

このQ&Aのポイント
  • プログラムでPro*Cを使用して、NUMBER型のカラムにホスト変数を使用してINSERTする方法を知りたいです。
  • テーブルのカラム定義やプログラムのコードを示し、カラムC2の型が16桁のNUMBERであるため、ホスト変数hC2の型をどのように定義すればよいか教えてください。
  • ファイルから読み込んだデータをホスト変数hC1、hC2に代入し、INSERTする方法についても教えてください。
回答を見る
  • ベストアンサー

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の型を何で定義したら良いのか わかりません。 (ちなみに、ファイルはテキストで読込みます) 何か良い方法があるのでしょうか?

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 Insert 後にホスト言語側で、取得したデータの演算を行う必要が無いので あれば、char 型変数でOk です。 心配であれば、Insert する時にValues 節の中で、TO_NUMBER されては いかがでしょうか?

mas_sama
質問者

お礼

教えていただいた通りにできました。 ありがとうございます。^^

mas_sama
質問者

補足

おんなじコトをいま考えてました ^^; あと、ValuesのところでTO_NUMBER()するのであれば、 きっとVERCHAR型でも平気ですね^^ 早速試してみます ^^

関連するQ&A

  • 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のプログラムで、テーブル名とカラム名をパラメータで 受け取って、ホスト変数(バインド変数?)に代入して、 それぞれ、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 ;

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

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

  • COBOLソースに記述するホスト変数を使用したSELECT INSER

    COBOLソースに記述するホスト変数を使用したSELECT INSERT分に関する質問です。 COBOLのソースに下記のようなSQL分を記述した際、どのような制御でホスト変数にはどのような値が代入されるのでしょうか? SELECT MAX(columnA) INTO :H1010:H2020 FROM A_TABLE WHERE …(以下抽出条件) ※H1010及びH2020はホスト変数定義しているものとします。 SELECTを行った項目数とINTO句にて指定した変数の数が異なる場合、エラーとなる記憶があります。 また、複数のホスト変数を使用する場合、カンマ区切りが必要だった記憶もあります。 実際に実行したところ、エラー等無く実行されました。結果を見るとH1010には値が代入され、H2020は初期値のままでした。 どのような制御でこの結果になっているのでしょうか? 参考までに、DBMSは「symfoware」です。 もしご存知の方がいらっしゃいましたら、ご教授頂けると助かります。よろしくお願いします。

  • 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;  }

  • C側で得た変数をC++の変数に流し込みたいです。

    C側で得た変数をC++の変数に流し込みたいです。 現在、C++で 次のように、 入力ストリームから1行分の文字列を読み込んで、 読み込んだ文字列を「cmd」に流し込んだ際に、 cmdに代入された文字列が「get」であると、 他のファイルで定義されている「doget」という関数が 実行されるようになっています。 ----------- std::string cmd; std::getline(cin, cmd); void nod::execute(const std::string& cmd) { std::stringstream ss(cmd); std::string command; ss >> command; if (command == "get") { std::string key = "baseball" ; std::string val = stand.doget(key); } } ----------- これを、 以下のように、 (1) C言語側にある「a」という変数にある値を C++側のkeyに流しこんで、 (2) また、C側にあるsign配列内の文字列を C++側の「cmd」に代入したいと思っています。 C側 --------- /* C側の「a」配列の値を、上記C++側の「key」に代入したい */ char a[] = "www.gehohogetest.jp"; /* 上記C++側の「cmd」変数に、C側の配列で定義されている"get"という文字列を代入したい */ char sign[]= "get"; --------- その場合、C側とC+側をどう記述すれば、 希望を叶えることが出来るでしょうか。 アドバイスいただけるとありがたいです。 以上どうぞ宜しくお願い致します。

  • 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 で 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ではエラーになるのでしょうか?

  • Pro*C コンパイルエラー

    procコマンドにてコンパイルを行った時に、下記のエラーが出てしまいます。何故でしょうか? 原因の分かる方、誰か教えて下さい。 Pro*C/C++: Release 9.2.0.1.0 - Production on 土 Apr 16 15:19:06 2005 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 行0、列0でエラーが発生しました。ファイルtest001.pc PCC-F-02102, Cプリプロセッサ処理を実行中に致命エラーが発生しました。 行1661、列2でエラーが発生しました。ファイルtest001.pc 1661 } 1661 .1 1661 PCC-S-02014, 記号"<eof>"が見つかりました。 次のうちの1つが入るとき: ; { } , = : ( ) [ ] * ? | & < > + - / % ~ ! . # @ ^ *= /= %= += -= <<= >>= &&= ||= ^= ~= := | & == != <= >= << >> ++ -- -> ... .. <> ** => an identifier, a string, a numeric constant, a sql string, misc. punctuation, newline, define, elif, else, endif, error, if, ifdef, ifndef, include, line, pragma, undef, exec, sql, begin, end, var, type, oracle, an immediate preprocessor command, a C token, exec sql, exec sql include, exec sql var, exec sql begin, exec sql end, end-exec, exec sql type, exec oracle, exec oracle else, exec oracle endif, exec oracle begin, a sql hint, create, function, package, procedure, trigger, or, replace, a C++ token,

  • Pro*Cの構文エラー

    コンパイル時に、下記のエラーが出て困っています。 誰か教えて下さい。 Pro*C/C++: Release 9.2.0.1.0 - Production on 土 Apr 16 15:19:06 2005 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 行0、列0でエラーが発生しました。ファイルtest001.pc PCC-F-02102, Cプリプロセッサ処理を実行中に致命エラーが発生しました。 行1661、列2でエラーが発生しました。ファイルtest001.pc 1661 } 1661 .1 1661 PCC-S-02014, 記号"<eof>"が見つかりました。 次のうちの1つが入るとき: ; { } , = : ( ) [ ] * ? | & < > + - / % ~ ! . # @ ^ *= /= %= += -= <<= >>= &&= ||= ^= ~= := | & == != <= >= << >> ++ -- -> ... .. <> ** => an identifier, a string, a numeric constant, a sql string, misc. punctuation, newline, define, elif, else, endif, error, if, ifdef, ifndef, include, line, pragma, undef, exec, sql, begin, end, var, type, oracle, an immediate preprocessor command, a C token, exec sql, exec sql include, exec sql var, exec sql begin, exec sql end, end-exec, exec sql type, exec oracle, exec oracle else, exec oracle endif, exec oracle begin, a sql hint, create, function, package, procedure, trigger, or, replace, a C++ token,