• ベストアンサー

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

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

  • MySQL
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
回答No.1

MySQLでは、埋め込みSQLは未サポートのはずですが? プリプロセサ等は、提供されていません。 C言語なら、「C API」を使うことになると思います。

関連するQ&A

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

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

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

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

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

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

  • 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/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言語 埋め込み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 以上よろしくお願いいたします。

  • オラクルDB選択レコードの配列代入

    オラクル9.0にて、DB(xxxxxx)から選択したレコード項目(record) を、配列(group)に代入したいのですが、うまくいきません。 よろしくお願いします。 メイン(main) main char group[ ]; nSts = GetGroupIcids(nCountGroup); if (RT_NORMAL != nSts) { return (RT_ERROR); } レコード選択処理(GetGroupIcids) EXEC SQL INCLUDE sqlca; #include <stdio.h> #include <sys/types.h> #include "com/comdef.h" int GetGroupIcids(int nCount) { int nRtn = RT_NORMAL; int nIndex; EXEC SQL BEGIN DECLARE SECTION; char www_corp[14]; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE CUR1 CURSOR FOR SELECT record FROM XXXXXXXX; EXEC SQL OPEN CUR1; /*取得したカードIDを配列に代入*/ for (nIndex = 0; nIndex < nCount; nIndex++) { EXEC SQL FETCH CUR1 INTO :www_corp; group[nIndex]=www_corp; } EXEC SQL CLOSE CUR1; return (nRtn); }