アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。

Oracle11gで開発しています。
初歩の初歩の質問なのですが。

下記のように複数のレコードをまとめて、
INSERT先のテーブル(レコードを1個に)に入れ込むまでの処理です。

全てNUMBER型のテーブル列で、NOT NULL制御を施しています。
そのようにすれば、明示的にNULLは無くなり、「0」がデフォルトになると思ったのですが、
「tb_trn_aa_day_r.tx_00」はNULLのままでした。

初期化の「tb_trn_aa_day_r := null;」がまずいのでしょうか?
ちなみに、tb_trn_aa_day_r.tx_00~tx_23に「0」をセットしてもなぜか、NULLとなり、
「tb_trn_aa_day_r.tx_sum」が全てNULLとなってしまいます。

初期j化はどのようにすべきでしょうか?
よろしくお願いします。

/* Aデータ初期化 */
tb_trn_aa_day_r := null;

IF c_aa_data_r.hour = '00' THEN
tb_trn_aa_day_r.tx_00 := TO_NUMBER2(c_aa_data_r.tx);
ELSIF c_aa_data_r.hour = '01' THEN
tb_trn_aa_day_r.tx_01 := TO_NUMBER2(c_aa_data_r.tx);
ELSIF c_aa_data_r.hour = '02' THEN
tb_trn_aa_day_r.tx_02 := TO_NUMBER2(c_aa_data_r.tx);
ELSIF c_aa_data_r.hour = '03' THEN
tb_trn_aa_day_r.tx_03 := TO_NUMBER2(c_aa_data_r.tx);
.....
ELSIF c_aa_data_r.hour = '23' THEN
tb_trn_aa_day_r.tx_23 := TO_NUMBER2(c_aa_data_r.tx);
END IF;

dbms_output.put_line(tb_trn_aa_day_r.tx_00);
/* 集計データ */
tb_trn_aa_day_r.tx_sum := TO_NUMBER2(tb_trn_aa_day_r.tx_sum) + TO_NUMBER2(c_aa_data_r.tx);
/* INSERT処理 */



CREATE OR REPLACE function SYNONIM.TO_NUMBER2(str varchar2) return number
is
begin
return to_number(str);
exception when others then
dbms_output.put_line('TO_NUMBER2 error: ' || SQLERRM);
return 0;
end;
/

A 回答 (1件)

tb_trn_aa_day_r の定義が分からないと、正しい回答は出来ないような気がします・・・



>全てNUMBER型のテーブル列で、NOT NULL制御を施しています。
とありますが、仮に tb_trn_aa_day_r が、テーブル%ROWTYPE だとしても各カラムの制約は引き継がれません。
そこを勘違いされているのかもしれません。

また、
>ちなみに、tb_trn_aa_day_r.tx_00~tx_23に「0」をセットしても
とありますが、これはどのようにセットして確認したのでしょうか?
TO_NUMBER2ですが、strにどんな値が来たときにexceptionブロックに飛ぶことを期待していますか?
空文字やNULLの場合は、exceptionは発生しないのでNULLが返りますよ。
    • good
    • 0
この回答へのお礼

すみません。だいぶ遅れました。
ありがとうございます。

お礼日時:2013/04/10 18:02

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

このQ&Aを見た人はこんなQ&Aも見ています

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