- ベストアンサー
Pro*C桁うめについて
NUMBER(10,5) -- (aとする)と定義しているカラムをもつレコードに対して、 Pro*Cより追加、更新する場合に小数部を右0埋めしたく、 lpad(TABLENAME, a, '5', '0')というように処理しようとしたのですが、 ホスト変数aに値が設定されていない場合はnullのまま追加、更新しなければ ならなくなり方法に困っています。 何か良い方法がありましたらお願いします。(oracle8i)
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#3 です。 う~ん、説明が悪かったようです。すいません。 小数点以下の右0埋めはやらなくても良いという事なんですけど・・・ >NUMBER型は0埋め値をみないのですか? お手元にORACLEのマニュアルはありますでしょうか? 「Oracle8 Server 概要」のマニュアルに「NUMBERデータ型」の項目に 「内部数値形式」がありOracle上での数値格納方法が記述されています。 そこに「Oracleは先行ゼロと後続ゼロを格納しません」との記述があります。 従って[0.55]や[.55]や[0.55000]や[000.55000]でも結果として格納される ものは同じと言うことになります。 もしテストできるのであればsqlplusで以下のsqlを実行してみてください。 1.UPDATE TABLENAME SET a = TO_NUMBER('.55'); 2.UPDATE TABLENAME SET a = TO_NUMBER('0.55'); 3.UPDATE TABLENAME SET a = TO_NUMBER('.55000'); 4.UPDATE TABLENAME SET a = TO_NUMBER('0.55000'); 結果として全て同じになると思います。 >また、0.55というデータをselectすると.55と取得するのはなぜでしょうか? 正確な解答ではないのですが、整数部の[0]が表示されない事での不具合は ないと個人的には思いますが如何ですか? これまた個人的にPro*C 内でSELECTする時にOracleがNUMBER型であればホスト 変数はint型やdouble型など数値型で受け取るの気がします。 その場合に整数部の[0]って意識しないような気がしますが、どうなんですか? sqlplusであれば[COLUMN]コマンドで表示する形式も指定できますし・・・ ここは少しグレーです・・・ ではでは・・・
その他の回答 (4)
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 #1/#2 のmuyoshid です。 >>また、0.55というデータをselectすると.55と取得するのはなぜでしょうか? > 正確な解答ではないのですが、整数部の[0]が表示されない事での不具合は > ないと個人的には思いますが如何ですか? については、不具合ではありません。 #2 に書いたように、書式を指定する事で小数点の左側の「0」を表示させる事 ができます。 > NUMBER型は0埋め値をみないのですか? NUMBER 型は、小数点以下の「0」は関係ありません。 0.5も、0.50 も0.5000 も内部的には同じ事です。
- paz777
- ベストアンサー率47% (77/163)
こんにちは。 更新元のデータがどこなのか(テーブル?ファイル?)分かりませんが 更新元のホスト変数をVARCHAR2として更新すれば良いのではないかと 思います。 例) ホスト変数定義 VARCHAR2 HOST_A [17]; /* S9999999999.99999形式 */ ホスト変数の初期化 memset(HOST_A.arr,NULL,sizeof(HOST_A.arr)); HOST_A.len = 0; 更新元発生データがテーブルであれば・・・ SELECT TO_CHAR(MOTO_A,'S0000000000.00000') INTO :HOST_A FROM MOTO_TABLE; ----------------------------------------------------------- [MOTO_A]の値:123.5 [HOST_A]の値:arr '+0000000123.50000' len 17 ----------------------------------------------------------- [MOTO_A]の値:NULL [HOST_A]の値:arr '\0(NULL)' len 0 ----------------------------------------------------------- この時、[MOTO_A]がNullであれば、[HOST_A]は初期化した時のままです。 FETCHする時は、FETCHの前に必ず初期化してください。 初期化しない状態でNullを受けてもホスト変数の値は以前のままです。 更新するときはTO_NUMBER関数を使用します。 (UPDATEする時) SET a = TO_NUMBER(:HOST_A,'S0000000000.00000') これでどうでしょうか? 追伸: NUMBER型にデータを格納するときに値が'5.5'であれ、'5.50000'であれ 結果は同じだと思います。 つまり、わざわざ右0埋めしなくても良いように思いますよ。 表記上の問題でテーブルから取り出すときにCOLUMNで定義するとか、 muyoshidさんの書かれている通りTO_CHAR関数を使用するなどで対応すれ ば良いように思います。 ではでは・・・
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 #1 のmuyoshid です。 > TABLENAME.aのホスト変数値がnull(arrに値無し、len=0の状態)の場合は > NULLを、そうでなければ桁うめしたいのですが・・・。 すみません。 1つ確認させて下さい。 「Number 型の項目 (a) の少数部を右0埋めする」との事ですが、 以下のように、書式を指定して取り出すのではダメなのでしょうか? ------------------------------------------------- SQL> desc test 名前 NULL? 型 -------- -------- ----------------- ID NUMBER(4) DT NUMBER(10,5) SQL> select * from test; ID DT ---------- ---------- 1 3.14 2 100 3 .999 4 SQL> select id, dt, to_char(dt, '99990.99999') from test; ID DT TO_CHAR(DT,' ---------- ---------- ------------ 1 3.14 3.14000 2 100 100.00000 3 .999 0.99900 4 -------------------------------------------------
補足
すみません、取り出したときにNULLかではなく、 ホスト変数がNULLであるかを判定し、 NULLであればNULL値をInsert/Updateし、NULLでなければ 小数部の右桁を0埋めしたいのです。
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 > lpad(TABLENAME.a, 5, '0')というように処理しようとしたのですが、 > ホスト変数aに値が設定されていない場合はnullのまま追加、更新しなければ > ならなくなり方法に困っています。 lpad(NVL(TABLENAME.a, 0), 5, '0') のように、lpad の前にNVL をすれば良いと思います。
補足
書き方がまずかったと思います。 TABLENAME.aのホスト変数値がnull(arrに値無し、len=0の状態)の場合は NULLを、そうでなければ桁うめしたいのですが・・・。 上記だと値が0になりませんか?
お礼
なるほど、つまり更新、追加するほうでわざわざ0埋めする必要がないということですか・・。 NUMBER型は0埋め値をみないのですか? また、0.55というデータをselectすると.55と取得するのはなぜでしょうか?