• ベストアンサー

Pro*C桁うめについて

NUMBER(10,5) -- (aとする)と定義しているカラムをもつレコードに対して、 Pro*Cより追加、更新する場合に小数部を右0埋めしたく、 lpad(TABLENAME, a, '5', '0')というように処理しようとしたのですが、 ホスト変数aに値が設定されていない場合はnullのまま追加、更新しなければ ならなくなり方法に困っています。 何か良い方法がありましたらお願いします。(oracle8i)

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

  • ベストアンサー
  • paz777
  • ベストアンサー率47% (77/163)
回答No.4

#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)
回答No.5

こんにちわ。 #1/#2 のmuyoshid です。 >>また、0.55というデータをselectすると.55と取得するのはなぜでしょうか? > 正確な解答ではないのですが、整数部の[0]が表示されない事での不具合は > ないと個人的には思いますが如何ですか? については、不具合ではありません。 #2 に書いたように、書式を指定する事で小数点の左側の「0」を表示させる事 ができます。 > NUMBER型は0埋め値をみないのですか? NUMBER 型は、小数点以下の「0」は関係ありません。 0.5も、0.50 も0.5000 も内部的には同じ事です。

  • paz777
  • ベストアンサー率47% (77/163)
回答No.3

こんにちは。 更新元のデータがどこなのか(テーブル?ファイル?)分かりませんが 更新元のホスト変数を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関数を使用するなどで対応すれ ば良いように思います。 ではでは・・・

sting
質問者

お礼

なるほど、つまり更新、追加するほうでわざわざ0埋めする必要がないということですか・・。 NUMBER型は0埋め値をみないのですか? また、0.55というデータをselectすると.55と取得するのはなぜでしょうか?

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

こんにちわ。 #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 -------------------------------------------------

sting
質問者

補足

すみません、取り出したときにNULLかではなく、 ホスト変数がNULLであるかを判定し、 NULLであればNULL値をInsert/Updateし、NULLでなければ 小数部の右桁を0埋めしたいのです。

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

こんにちわ。 > lpad(TABLENAME.a, 5, '0')というように処理しようとしたのですが、 > ホスト変数aに値が設定されていない場合はnullのまま追加、更新しなければ > ならなくなり方法に困っています。 lpad(NVL(TABLENAME.a, 0), 5, '0') のように、lpad の前にNVL をすれば良いと思います。

sting
質問者

補足

書き方がまずかったと思います。 TABLENAME.aのホスト変数値がnull(arrに値無し、len=0の状態)の場合は NULLを、そうでなければ桁うめしたいのですが・・・。 上記だと値が0になりませんか?

関連するQ&A