• 締切済み

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桁したホスト変数で受け、更新や挿入時にはファイルレイアウト と同じ桁数で定義した別のホスト変数を定義しないといけないのでしょうか? それとも、根本的に間違った解釈をしているでしょうか? 宜しくご教授頂きたく存じます。

みんなの回答

回答No.1

NULL値の受け渡しには、標識変数を使います。

lamina
質問者

お礼

ご連絡ありがとうございました。 「標識変数」、利用する機会がありましたら、使ってみます。 説明不足ですみません。 文中の、「フィールド長に+1した長さの定義をして(NULL値が入るから)」は、+1した理由が、文字列の最後にNULLが入った状態で、ホスト変数に取り込むためという意味でした。 INSERT時に、+1したホスト変数をそのまま、VALUESに指定して実行するとエラーになります。しかし、+1しない(つまりDB定義と同じ桁数のホスト変数を別に定義して、実行すると正常に実行されるのです。 皆さんがどのようにされているかお聞きしたかったしだいです。 また何か、ございましたら、ご教授ください。 宜しくお願いします。

関連するQ&A

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

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

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

  • 【Transact-sql】 execの結果をoutputパラメータに持たせたい

    タイトルの通り、execの結果をoutputパラメータに持たせたいのですが、 どうすればご存知の方、ご教授お願いします。以下のように、count(*)の結果を持たせたいです。以下にサンプルコードを記載しました。 ---ストアドabc--- ( @aWork int output, @bWork int output, @cWork int output, @IDs varchar ) declare @Sql1 varchar(500) declare @Sql2 varchar(500) declare @Sql3 varchar(500) declare @IDs varchar(500) set = '1,2,3' set @Sql1 = 'select count(*) from a where id = ' + IDs -- @aWork = exec(@Sql1)としたい exec(@Sql1) set @Sql2 = 'select count(*) from b where id = ' + IDs -- @bWork = exec(@Sql2)としたい exec(@Sql2) set @Sql3 = 'select count(*) from c where id = ' + IDs -- @cWork = exec(@Sql3)としたい exec(@Sql3)

  • 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でテーブル名にバインド変数は使えますか?

    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 ;

  • 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)

  • ホスト言語でテーブル更新

    MySQL5.0で直接言語ではなくホスト言語で作ったデータベースを編集(更新)するにはどうすればいいですか? いま、データベースを作りテーブルもつくりました。 そこで、ホスト言語(C言語)でその作ったデータベースを編集(更新)しようと思うのですが、 main() { EXEC SQL BEGIN DECLARE SECTION;      :      :      : と、「.c」で保存したc言語のソースファイルがあります。 でも、作ったのはいいが、どうすればデータベースを 編集(更新)できるかわかりません。 教えてください。

    • ベストアンサー
    • MySQL
  • C言語 埋め込みSQL ecpg

    C言語の埋め込みSQLで質問です。 ご教示ください。初心者です。 【環境】 Windows7 64bit gcc:5.3.0 PostgreSQL:9.6.1 【pgcファイル】 #include <stdio.h> exec sql include sqlca; int main(char* argx[], char* argv[]){ exec sql begin declare section; char NAME[256]; char MAIL[256]; exec sql end declare section; exec sql connect to bookmark user dbuser; strcpy(NAME,argv[1]); strcpy(MAIL,argv[2]); exec sql insert into Name_list (name, mail) values (:NAME, :MAIL); exec sql commit; exec sql disconnect; return 0; } 【症状】 以下のコマンドを実行するとエラーが出ます。 -Iでインクルードしようとしています。 C:\cTest\c>ecpg name_list_db.pgc -I C:\postgresql\include ecpg: ファイル"-I"をオープンできませんでした: No such file or directory ecpg: ファイル"C:\postgresql\include"をオープンできませんでした: No such file or directory 一応Cファイルは生成されます。 強引にgccすると下記のエラーが出ます C:\cTest\c>gcc -o name_list_db name_list_db.c -I C:\postgresql\include -lecpg c:/mingw/bin/../lib/gcc/mingw32/5.3.0/../../../../mingw32/bin/ld.exe: cannot find -lecpg collect2.exe: error: ld returned 1 exit status どうすれば良いかご教示ください。 この辺のWebサイトを参考にしました。 http://se.cite.ehime-u.ac.jp/~aman/memo/SQL/ecpg.html 以上よろしくお願いいたします。

  • SQL文に変数を埋め込む場合の方法

    //config.php //$table = "TableName"; 1:require "config.php"; 2:$sql = "SELECT " . $fld . " AS genre, 3: COUNT(*) AS cnt FROM TableName GROUP BY " . 4:$fld; $res = mysql_query($sql, $conn) or die("Data抽出エラー"); 上記のソースを 2:$sql = "SELECT " . $fld . " AS genre, 3: COUNT(*) AS cnt FROM " . $table . " GROUP BY " . $fld; 4: $res = mysql_query($sql, $conn) or die("Data抽出エラー"); この様にして、config.phpより、テーブル名を変数として読み込みたいのですが、エラーになってしまいます。 3行目をどのように記述すればよいのでしょうか?

    • ベストアンサー
    • PHP
  • SQLストアドについて

    SQL超初心者です。 ストアド内でテーブル名を可変にしたいのですが以下のようなエラーメッセージが表示され でません。どなたか教えていただけませんか? <エラーメッセージ> テーブル変数 "@AA" を宣言してください。 ◆環境  sql Sever 2005 ◆コードは以下の通りです。 DECLARE @AA VARCHAR(50) DECLARE @HANTEI CHAR(5) DECLARE @FETCHTABLE1 CHAR(22) DECLARE @FETCHTABLE2 CHAR(22) SET @HANTEI = 'ABCDEF' SET @FETCHTABLE1 = 'DBO.USV_YOSAN' SET @FETCHTABLE2 = 'DBO.USV_JISEKI' BEGIN IF @HANTEI = 'ABCEDF' SET @AA= @FETCHTABLE2 SELECT * FROM @AA PRINT @AA END 以上 よろしくお願いいたします。