- PR -

ストアドプロシージャで1行のデータを部分コピーする場合

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/04/11
投稿数: 2
投稿日時: 2006-04-11 19:44
使用DB オラクル10g
ストアドプロシージャで質問があります。
現在、仕訳関係のプログラムを作成しており、出金データと入金データを
フラグ列(入金か出金かというフラグ値)を設けて1つのテーブルで管理
するという仕様のもとでプログラムを組んでおります。
1行の列構成を簡単に示すと
・行ナンバー
・金種
・入出金フラグ
・金額
・客先
・申請日
・計上日
(上記以外にも多数の列があります)
といったものです。
行ナンバーの列をキーとしており、この列には、シーケンスオブジェクトを使用せずに
プログラム上で算出した数値を使用しております。
そこで、質問なのですが、
まず最初に出金データが作成されます(入出金フラグが"出金"となるデータを作成)。
次に、入金されたときに入金データを作成するのですが、
基本的には、出金データの単に入出金フラグの列を"入金"としたものを作成したいのが
まずひとつで、2つめに入金額が出金額と違う金額のものも作成したいのです。

例)出金データを以下のように作成
行ナンバー|金種|入出金フラグ| 金額 |  申請日  |  計上日  |
------------------------------------------------------------
       1|雑費|     出金| 2000| 06-04-01| 06-04-30|

パターン1 入金データを作成
行ナンバー|金種|入出金フラグ| 金額 |  申請日  |  計上日  |
------------------------------------------------------------
       2|雑費|     出金| 2000| 06-04-01| 06-04-30|

パターン2 今回の入金額が1000円だった場合
行ナンバー|金種|入出金フラグ| 金額 |  申請日  |  計上日  |
------------------------------------------------------------
       2|雑費|     出金| 1000| 06-04-01| 06-04-30|

といったデータを作成(INSERT)したいのですが、
ある1行のデータをそのままコピーしてINSERTを行う場合
INSERT INTO 表名 (列名, 列名) SELECT (列名, 列名) FROM 表名 WHERE 行ナンバー = 1
というSQLで行えるというのは調べてわかりましたが、しかし
これですと、行ナンバーの部分も同じ 1 として作成されるため
重複キーエラーが発生してしまいます。
これを重複キーエラーが発生しないようにするにはどうすればよいのでしょうか?
また、1部の列のデータが違うだけでほかの列のデータは一緒というデータを作成(INSERT)したい場合は、どのようなSQLを組めばできるのでしょうか?
現在、コピーする列分の変数を作成して、SELECT INTO により、該当データを取得後、
取得した変数を用いてINSERTを行っております。ただ、実際データをコピーする列の数
が52列ありますので見た目がものすごい物となっているのが現状です。
実際に組んでいる方法
(列名を下記のようにします。
行ナンバー/ROW_NUM
金種/MONEY_KIND
入出金フラグ/IO_FLG 0を出金,1を入金とします
金額/MONEY
申請日/YMD_1
計上日/YMD_2
)
SELECT
MONEY_KIND, MONEY, YMD_1, YDM_2
INTO
MK, MNY, YMD1, YMD2
FROM
TBL
WHERE
ROW_NO = 1
AND
IO_FLG = 0; --出金

パターン1の場合
INSERT INTO TBL
(ROW_NO, MONEY_KIND, IO_FLG, MONEY, YMD_1, YMD_2)
VALUES
(2, MK, 1(入金), MNY, YMD1, YMD2);

パターン2の場合
INSERT INTO TBL
(ROW_NO, MONEY_KIND, IO_FLG, MONEY, YMD_1, YMD_2)
VALUES
(2, MK, 1(入金), 1000, YMD1, YMD2);

このように組み実際にこれで動作はしておりますが、この方法よりもっと
簡単な方法があればと思い質問させていただいた次第です。
どうかよろしくお願いします。

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-04-11 19:46 ]
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2006-04-12 09:31
INSERT INTO 表名 ・・・ SELECT ・・・ FROM 表名 WHERE ・・・
という句で、列名を列挙するつもりなら、
INSERT INTO 表名 (列名1,列名2,列名3 ・・・) SELECT (2, ,列名2,列名3 ・・・) FROM ・・・
というような書き方ができると思います。(行ナンバーを "2"と直接指定)
或いは、"2"の部分を "列名1 + 1"のように置き換えたり、自作したファンクションを入れることも可能。現実には 行ナンバーの発番にシーケンスを使用しないのであれば、ファンクションを使うしかないかと思います。(ファンクションで何かしらの発番ロジックを組まないと重複の可能性があるので)
でも結局は挿入元/挿入先の列名を全て列挙することになるので、現行のやり方と比較してそれほど大きな軽減にはならないように思いますが・・・
未記入
会議室デビュー日: 2006/04/11
投稿数: 2
投稿日時: 2006-04-13 17:35
返答が遅れてしまい申し訳ございませんでした。
行ナンバーのところをファンクションで算出することにより
INSERT INTO ---- SELECT ----
で行えるようになりました。
列名をすべて列挙することに関しては仕方がないことですが、
1つのSQLで済ませられることができました。
おかげで助かりました。ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)