電子書籍の厳選無料作品が豊富!

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

A 回答 (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]コマンドで表示する形式も指定できますし・・・
ここは少しグレーです・・・

ではでは・・・
    • good
    • 0

こんにちわ。


#1/#2 のmuyoshid です。
>>また、0.55というデータをselectすると.55と取得するのはなぜでしょうか?
> 正確な解答ではないのですが、整数部の[0]が表示されない事での不具合は
> ないと個人的には思いますが如何ですか?
については、不具合ではありません。
#2 に書いたように、書式を指定する事で小数点の左側の「0」を表示させる事
ができます。

> NUMBER型は0埋め値をみないのですか?
NUMBER 型は、小数点以下の「0」は関係ありません。
0.5も、0.50 も0.5000 も内部的には同じ事です。
    • good
    • 0

こんにちは。



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

ではでは・・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/01/16 16:06

こんにちわ。


#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埋めしたいのです。

補足日時:2003/01/16 09:19
    • good
    • 0

こんにちわ。



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

この回答への補足

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

補足日時:2003/01/15 21:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す