• 締切済み

何をつかえば・・・

カテゴリーが異なっていたらすみませんm(_ _)m 宜しくお願い致します。 ---------------------------------- EXEC SQL BEGIN DECLARE SECTION;  VARCHAR type[3]; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT data_type into :type FROM test_tbl WHERE name='test'; type.arr[type.len]='\0'; if(type.arr == '01'){ /* 処理Aへ */ }else{ /* 処理Bへ */ } --------------------------------------- 上記のようなプログラムがあります。 table_testのnameフィールドが'name'の date_typeフィールドの値を取得します。 取得したdate_typeフィールドの値が'01'なら 処理Aへ、'02'、'03'等なら処理Bを実行したいと 考えています。 ですが、上記の if(type.arr == '01'){ だとエラーが発生しています。 どのようにすればチェックすることができるでしょうか? ちなみに date_typeフィールドはかならずデータがはいっている。 nameはprimary keyの設定のため重複は存在しません。 DBはORACLE、言語はPro*Cです。 どうか宜しくお願い致します。m(_ _)m

みんなの回答

noname#4564
noname#4564
回答No.2

こちら↓が参考になると思います。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=514727
  • me_no_car
  • ベストアンサー率24% (22/90)
回答No.1

'01'、'02'など2バイト以上のものCでは 文字列として扱います。 if(type.arr == '01'){   ↓ if( strncmp((char *)type.arr,"01",type.len) == 0 ){ でいけると思います。

関連するQ&A

  • 判定処理について

    カテゴリーが異なっていたらすみませんm(_ _)m 宜しくお願い致します。 ---------------------------------- EXEC SQL BEGIN DECLARE SECTION;  VARCHAR type[3]; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT data_type into :type FROM test_tbl WHERE name='test'; type.arr[type.len]='\0'; if(type.arr == '01'){ /* 処理Aへ */ }else{ /* 処理Bへ */ } --------------------------------------- 上記のようなプログラムがあります。 table_testのnameフィールドが'name'の date_typeフィールドの値を取得します。 取得したdate_typeフィールドの値が'01'なら 処理Aへ、'02'、'03'等なら処理Bを実行したいと 考えています。 ですが、上記の if(type.arr == '01'){ だとエラーが発生しています。 どのようにすればチェックすることができるでしょうか? ちなみに date_typeフィールドはかならずデータがはいっている。 nameはprimary keyの設定のため重複は存在しません。 DBはORACLE、言語はPro*Cです。 どうか宜しくお願い致します。m(_ _)m

  • 関数の戻り値について

    ----test.c----------------- id="0001"; number = get_data(id); /* 関数の戻り値を取得したい */ if(strcmp(number, "01") == 0){ /* Aの処理へ */ }else{ /* Bの処理へ */ } ----test.pc---------------- int get_data(char* id){ EXEC SQL BEGIN DECLARE SECTION; VARCHAR tel_no[3]; VARCHAR id_no[5]; EXEC SQL END DECLARE SECTION; strcpy(id_no.arr,id); id_no.len=strlen(id_no.arr); EXEC SQL SELECT tel_number into :tel_no FROM test_tbl WHERE id=:id_no; tel_no.arr[tel_no.len]='\0'; /*取得したtel_noを返したい!!*/ } --------------------------- test.cで引数に"0001"を指定して、get_data関数を コールして、そのget_data関数で受け取った引数で test_tblを検索しtel_numberフィールドの値を test.cに返し、判断文で処理したいと考えています。 ちなみにtest_tblで引数の条件で合致するデータは 必ず1件のみとします。 どのように記述したらいいかわかりません。 アドバイスお願い致します。m(_ _)m

  • 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で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/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ソースにホスト変数を宣言したヘッダをインクルード方法

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

  • オラクル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); }

  • ORA-00904:無効な識別子の回避策について

    ■やりたいこと フェッチして取得したデータを条件にカウントした結果を取得したい。 ■事象 フェッチして取得したデータにダブルクウォートで囲まれている為、EXECUTE時にORA-00904が発生する。 ■教えて欲しいこと カーソルおよびフェッチ時にダブルクウォートを削除、またはシングルクウォートに変換をすることが可能でしょうか。または、他の方法でカウントを取得する方法がございますでしょうか。 サンプルコードを記載しておりますのでご確認、ご教授のほどよろしくお願いします。 ※※※の箇所が本事象発生箇所となります。 ■サンプルコード DECLARE V_EXEC_STRING VARCHAR2(2000); V_EXEC_COUNT NUMBER; CURSOR TESTCUR IS SELECT TEST_NAME,TEST_ID,TEST_DATE FROM TARGET_TBL WHERE TEST_NAME IN (SELECT tb1.TEST_NAME FROM (SELECT TEST_NAME FROM TARGET_TBL WHERE STATUS = '2') tb1 INNER JOIN READ_TBL tb2 ON(tb1.TEST_NAME = tb2.TEST_NAME)); --取得レコードを格納する変数定義 TESTREC TESTCUR%ROWTYPE; --処理開始 BEGIN --カーソルオープン OPEN TESTCUR; --ループ開始 LOOP --フェッチ 1行ずつデータ取得 FETCH TESTCUR INTO TESTREC; --レコードの最後でループを終了 EXIT WHEN TESTCUR%NOTFOUND; V_EXEC_STRING := ''; V_EXEC_STRING := V_EXEC_STRING || 'SELECT COUNT(*) FROM READ_TBL WHERE TEST_NAME = '|| TESTREC.TEST_NAME; ※※※上記TESTREC.TEST_NAMEに"AAAA"の形でデータが入るため、下記実行時にORAエラーが発生する。 EXECUTE IMMEDIATE V_EXEC_STRING INTO V_EXEC_COUNT; IF V_EXEC_COUNT = '1' THEN UPDATE TARGET_TBL SET TEST_ID = ( SELECT TEST_ID FROM READ_TBL WHERE TEST_NAME = TESTREC.TEST_NAME), TEST_DATE = ( SELECT TEST_DATE FROM READ_TBL WHERE TEST_NAME = TESTREC.TEST_NAME), STATUS = 10 WHERE TEST_NAME = TESTREC.TEST_NAME; END IF; IF V_EXEC_COUNT != '1' THEN UPDATE TARGET_TBL SET STATUS = 20 WHERE TEST_NAME = TESTREC.TEST_NAME; END IF; END LOOP; CLOSE TESTCUR; COMMIT; END; /

  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

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