• ベストアンサー

ProC 固定SQLでNULLってどう表現するの?

<テーブル> T1 C1 VARCHAR2(7) NOTNULL   C2 NUMBER(13)   C3 VARCHAR2(8) <プログラム> VARCHAR hT1_C1[7]; VARCHAR hT1_C2[13+1]; VARCHAR hT1_C3[8]; short iT1_C1; short iT1_C2; short iT1_C3; EXEC SQL INSERT INTO T1 ( T1.C1, T1.C2, T1.C3 ) VALUES ( :hT1_C1 INDICATOR :iT1_C1, TO_NUMBER(:hT1_C2), :hT1_C3 INDICATOR :iT1_C3 ) ; <事象> SQLエラー[-1485]が発生 <補足> C1、C2はNULL以外の値を設定。 C3はNULLを設定。 hT1_C3.arr = ""; hT1_C3.len = 0; iT1_C3 = -1; <質問> 1、NULLの設定方法が間違っているのでしょうか? 2、上記プログラムの「EXECSQL~」の部分を変更せずに解消する方法はあるのでしょうか? 3、SQLエラーコード「-1458」は、どのような場合に発生するのでしょうか? 以上、回答お願いいたします。

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

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

こんにちわ。 NULL をInsert する方法ですが、 strcpy(hT1_C3.arr, ""); hT1_C3.len = 0; iT1_C3 = -1; としておいて、Insert すればOk の筈です。 ※ hT1_C1, hT1_C3 変数についてですが、NULL 文字を入れるための 領域も併せて確保しておいた方が、扱いが楽になると思いますょ。 ユーザ登録 (無料) が必要ですが、OTN Japan にPDF 形式でマニュアル が公開されていますので、こちらからDownload されてはいかがでしょうか? 標識変数の使い方については、「Pro*C/C++ Precompiler プログラマーズ・ガイド」 に説明があります。

参考URL:
http://technet.oracle.co.jp/
mas_sama
質問者

お礼

<最終結果> プログラム正常に動作いたしました。 ありがとうございます。m(_ _)m 原因は、ホスト変数にデータを設定する処理にありました。 例>  strcpy(hT1_C3.arr,"");  hT1_C3.len = 123; /* ←文字列長の設定に誤りがあった */  iT1_C3 = -1; 上記の処理そのままではありませんが、 ホスト変数の領域を逸脱するような、 文字列長を設定していたため、 今回のようなエラーが発生していました(^^;

mas_sama
質問者

補足

<訂正> 補足欄の表記に誤りがありました。 (誤)hT1_C3.arr = "" (正)strcpy(hT1_C3.arr, ""); <リファレンスより抜粋> ORA-01458 可変長文字列の長さが無効です。 原因:可変長文字列をバインドまたは定義していますが、    バッファ長が必要最低限の長さより小さくなっています。 処置:バッファ・サイズを大きくするか、他のデータ型を使用してください。 <疑問> 「可変長文字列の長さ」は、おそらく「hT1_C3.len」だと思うのですが、 「バッファ長」、「バッファサイズ」とはなんのことなのでしょう?(^^; <結果> ご指摘の方法でNULLをINSERTできるのですが、 やはりINSERTするデータによっては「ORA-01458」が発生するようです。 引き続き調査をしたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • madman
  • ベストアンサー率24% (612/2465)
回答No.2

VARCHAR hT1_C3[8]; は展開すると struct { int len char arr[8]; } ; になります。 そのまま代入しちゃダメです。 せめて hT1_C3.arr[0] = 0x00; とでもしましょう。

mas_sama
質問者

お礼

無事解決いたしました。 ありがとうございます。m(_ _)m 結果の詳細はmuyoshidさんへのお礼の欄をご覧下さい。

mas_sama
質問者

補足

<訂正> 補足欄の表記に誤りがありました。 (誤)hT1_C3.arr = "" (正)strcpy(hT1_C3.arr, ""); <結果> ご指摘の通りです。 hT1_C3.arr = "";    ↓ hT1_C3.arr = "\0";    ↓ hT1_C3.arr = 0x00;    ↓ hT1_C3.arr = Null; Nullポインタを代入しているように見えてしまいますね(^^; C言語の経験が浅いため省略して表記したため、 誤った表記になっていました。

全文を見る
すると、全ての回答が全文表示されます。
  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

"" じゃなくて 直接 Null と入れるのだと思います。 hT1_C3.arr =Null;

mas_sama
質問者

お礼

無事解決いたしました。 ありがとうございます。m(_ _)m 結果の詳細はmuyoshidさんへのお礼の欄をご覧下さい。

mas_sama
質問者

補足

<訂正> 補足欄の表記に誤りがありました。 (誤)hT1_C3.arr = "" (正)strcpy(hT1_C3.arr, ""); <結果> ご指摘の通りです。 hT1_C3.arr = "";    ↓ hT1_C3.arr = "\0";    ↓ hT1_C3.arr = 0x00;    ↓ hT1_C3.arr = Null; Nullポインタを代入しているように見えてしまいますね(^^; C言語の経験が浅いため省略して表記したため、 誤った表記になっていました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQLを教えてください

    下記表があり、列1のデータを列2,列3に分割する方法を 教えてください 表 :t_test 列0:管理No t_test_no VARCHAR2(7) NOT NULL PRIMARY KEY 列1:値(文字) *.**×10の乗数 t_test_data VARCHAR2(20) 列2:値(数値) 列1の「*.**」の部分 t_test_suu NUMBER(3,2) 列3:値(数値) 列1の「10の乗数」の部分 t_test_jousuu NUMBER(1,0) データ例 列0, 列1, 列2, 列3 A000001, 1.20×1, 1.2, 0 A000002, Null, Null, Null A000003, 1.23×100, 1.23, 2 A000004, 0.20×10000, 0.2, 4 A000005, 0.00×10, 0, 1 (補)列1に値がない場合もある

  • NOTNULL制約について

    MYSQL ver4.0.20a 下記のようにNOTNULL制約を付けてテーブルを作成するのですが、 デフォルト値が勝手に設定されてしまいます。 CREATE TABLE TEST_01 ( NO int(8) NOT NULL auto_increment, STATUS int(1) NOT NULL, TOUROKUBI date NOT NULL, MEMO varchar(200) NOT NULL, PRIMARY KEY (NO) INT型だと 0 varchar型だと '' date型だと 0000-00-00 インサートの時に値がNULLの場合、SQLエラーを返してほしいのですが、 デフォルト値が設定されている為、登録されてしまいます。 本当はNOTNULL制約で、DBにチェックを任せたいのですが・・・ どなたかご存知の方、教えてください。 お願いします。

    • ベストアンサー
    • MySQL
  • SQL文を教えてください

    下記表があり、列0のデータを条件に, 列1,列2,列3の値を更新する方法を教えてください 表 :t_test 列0:管理No t_test_no VARCHAR2(7) NOT NULL PRIMARY KEY 列1:値(文字) t_test_data VARCHAR2(20) 列2:値(数値) t_test_suu NUMBER(3,2) 列3:値(数値) t_test_jousuu NUMBER(1,0) データ例 列0, 列1, 列2, 列3 A000001, abc, 1.2, 0 A000002, Null, Null, Null A000003, a1b2c3, 1.23, 2 A000004, opqrstuv, 0.2, 4 A000005, あいう, 0, 1 列0 条件のデータは必ず既存するものとする つまり、更新(update)処理

  • SQLにプログラムが反映されないのは何故

    XAMPP Version: 1.8.2 です。   Xamsのデータベースをデータベースから削除した後  SQLから、以下2個プログラムを入力しました。  すると、削除したにも関わらず、エラーが出て プログラムが反映されません。  Xamsを削除後、再起動したらまたXamsのデータベースが 再構築されます。  私は作成した記憶はありません。  すでに存在しているので、作成しする必要は ないのか、よくわかりません!?  皆様どう思われますか!?  以下入力したプログラムです。 ---------------------------------------------------------------- CREATE DATABASE xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default '' , org varchar(50) not null default '', addr varchar(80) not null default'', tel varchar(20) default '', mail varchar(40) default '', course varchar(30) default '', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; エラー 実行したSQL: DATABASEクリスマスを作成します。 のMySQLのメッセージ:ドキュメント #1007 - データベース'クリスマス'を作成できません、データベースが存在している -------------------------------------------------- CREATE DATABASE if not exists xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default '' , org varchar(50) not null default '', addr varchar(80) not null default'', tel varchar(20) default '', mail varchar(40) default '', course varchar(30) default '', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; エラー 実行したSQL: TABLE xmastranを(CREATE book_idのINT NOT NULL AUTO_INCREMENT、 名VARCHAR(30)NOT NULL DEFAULT''を、 orgのVARCHAR(50)NOT NULL DEFAULT''を、 addrはVARCHAR(80)NOT NULL DEFAULT''を、 電話VARCHAR(20)DEFAULT''を、 メールVARCHAR(40)DEFAULT''を、 もちろんVARCHAR(30)DEFAULT''を、 numsはINTEGERのデフォルトは0、 PRIMARY KEY(book_id) )ENGINE = MYISAM DEFAULT CHARSET= utf8を; のMySQLのメッセージ:ドキュメント #1050 - テーブル 'xmastran'は既に存在します。 ------------------------------------------------------------------- 以上よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 列の桁数変更の方法 (oracle 8i)

    oracle 8.1.7 を使用 下表の列2を下記のように変更したいのですが 方法(SQLplusにて)が分かりません、 ご教示くださいますようよろしくお願いいたします (変更前)列2:T_MIX_PTN VARCHAR2(1) NOT NULL (変更後)列2:T_MIX_PTN VARCHAR2(3) NOT NULL 表 :T_MIX ---------------------------------------- 列1:T_MIX_CD VARCHAR2(4) NOT NULL 列2:T_MIX_PTN VARCHAR2(1) NOT NULL 列3:T_MIX_CNT NUMBER(1,0) NOT NULL 列4:T_MIX_GCD1 VARCHAR2(6) NOT NULL 列5:T_MIX_GRATE1 NUMBER(4,1) NOT NULL 列6:T_MIX_GCD2 VARCHAR2(6) NOT NULL 列7:T_MIX_GRATE2 NUMBER(4,1) NOT NULL

  • 副問合せ 続(Oracle SQL)

    問題:NATION表とINVENTION表より人口密度(人口/面積)が100以下の国で、発明事項がある国の国コードを表示する。 方法1:主問合せでNATION表を利用する 方がうまくいきません。 私の考えた下記SQL文では実行結果が80件返ってしまいます。 答えは方法2と同じ5件ですがどこが悪いのでしょうか? 回答のほどよろしくお願い致します。 方法1:主問合せでNATION表を利用する SELECT CODE FROM NATION WHERE (POPULATION / AREA) <=ANY(SELECT 100 FROM INVENTION) SELECT CODE FROM NATION WHERE POPULATION / AREA < 100;(上と同じ意味) INVENTION表の副問合せがうまくできていないので5件出力できない? 方法2:主問合せでINVENTION表を利用する SELECT DISTINCT NATION_CODE FROM INVENTION WHERE NATION_CODE = ANY(SELECT CODE FROM NATION WHERE 100 >= POPULATION / AREA) NATION_CODE ----------- 107 136 142 154 157 各表の構造はこのようになります。 SQL> DESCRIBE INVENTION 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- INVENTION NOT NULL VARCHAR2(30) INVENTOR VARCHAR2(30) YEAR NUMBER(4) NATION_CODE NUMBER(4) SQL> DESCRIBE NATION 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

  • updateについて

    下記、SQLコマンドを実行するとMERTINの歩合給がSMITHのSALに格納されません。実行後、NULLが入ってしまいます。 ちゃんとemp表のMERTINのCOMMには値が入っているのになぜ実行結果がうまくいかないのでしょうか? 回答のほどよろしくお願い致します。 update w_emp set sal = (select comm from emp where ename = 'MERTIN') where sal < 1000 SQL> select * from w_emp; DEPTNO EMPNO ENAME JOB SAL 20 7902 FORD ANALYST 3000 20 7369 SMITH CLERK 10行が選択されました。 SQL> desc w_emp; 名前 NULL? 型 DEPTNO NOT NULL NUMBER(2) EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) SAL NUMBER(7,2) SQL> desc emp; 名前 NULL? 型 EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • PL/SQLって?

    今日からPL/SQLの本を読み始めたド素人です。。。 ありえない質問かもしれませんがどなたか助けてください! 今SQL*Plusに参考本の通り以下のコードを記述したところ エラーが発生してしまいました。 通常のSQL文とは違い普通にSQL*Plus上にコーディングするだけでは うまく機能しないのですか? それとも何か設定が必要だったりするのでしょうか? 参考本には特にそのような記述もなくサイトなどから調べても 自分ひとりではどうも解決できません。 ご協力よろしくお願いします! SQL> PROCEDURE PROC_A( 2 a IN NUMBER 3 b IN NUMBER, 4 c OUT NUMBER) 5 /  ↓  エラー内容  ↓ PROCEDURE PROC_A( * 行1でエラーが発生しました。: ORA-00900: SQL文が無効です。

  • T-SQL パラメータがNULLの場合条件含めず

    お世話になります。 SQL Server での T-SQLのWhere句のパラメータがNullであった場合に これをWhere句から除外したいのですが・・・ 今まで、こういう場合には、SQL文をプログラム上で作成してそのSQL文を ソースにしてきたのですが、動作速度や汎用性を考えてストアドプロシジャーを使用するのが今後の為と思いこちらで質問させていただきました。 例えば・・・条件のところから WHERE     IF @パラメータ1 Is Not Null         (dbo.TEST.A =< @パラメータ1) AND     IF @パラメータ2 Is Not Null         (dbo.TEST.B =< @パラメータ2) AND このように記述してみたのですが、WHEREが記述された後ではダメなようで・・・次に WHERE     CASE         WHEN @パラメータ1Is Not Null THEN (dbo.TEST.A = @パラメータ1) AND         WHEN @パラメータ2Is Not Null THEN (dbo.TEST.B = @パラメータ2) AND     END 上記にように記述してもやはりエラーが。 WHERE句の後にパラメータを評価し、WHERE句に含めるか、 含めないか記述するにはどうすればいいでしょうか? 初歩的な事かもしれませんが、何卒よろしくお願いいたします。

  • グループ関数の結果について

    以下、SQLコマンドを入力するとレコードが選択されない結果になってしまいます。areaの平均より高いものが出力されるはずなのですが何故でしょうか? / 1 select nation,area 2 from nation 3 group by nation, area 4* having area > avg(area) SQL> / レコードが選択されませんでした。 SQL> desc nation; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)