C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

PL/SQLでデータが無いのにデータが返却される

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■85992 / inTopicNo.1)  PL/SQLでデータが無いのにデータが返却される
  
□投稿者/ k3user (20回)-(2017/12/07(Thu) 15:16:53)

分類:[データベース全般] 

PL/SQLにて不可解な現象に悩まされています。
以下のようなテーブルとPL/SQLがあり
TEST_TABLEを外部から指定したパラメータで検索し、
データの有無でInsert処理を行っているのですが、
SELECTの部分でデータが無いにもかかわらず(何度もパラメータは確認しました。)
データが取得されていまいエラー処理に走ってしまいます。
「ROWVERSION」という項目名を疑ってみたのですが、関係は無いはずです。
何かまずい部分があるのでしょうか...

補足事項
・SQLを直接実行するとデータはない
・実行の度にROWVERSIONの値がインクリメントされている。(テーブル内に存在しない値)
・使用しているバージョンはORACLE12C

TEST_TABLEの定義

KONYUBMNCD                     CHAR(3) NOT NULL,
GYOSYACD                       CHAR(6) NOT NULL,
KOJINO                         CHAR(8) NOT NULL,
KEIYAKUKIKANSTR                CHAR(8) NOT NULL,
TankaCd                        CHAR(3) DEFAULT ' ',
ROWVERSION                     NUMBER(38,0) DEFAULT 0,


PL/SQL処理抜粋

wvExists			INTEGER;	
wvNewRowversion		NUMBER;			

wvExists := 1;
wvNewRowversion := NULL;

BEGIN
	SELECT ROWVERSION
	INTO   wvNewRowversion
	FROM   ItakuTankaMst
	WHERE  KonyuBmnCd      = パラメータ1
	AND    GyosyaCd        = パラメータ2
	AND    KojiNo          = パラメータ3
	AND    KeiyakuKikanStr = パラメータ4
	AND    TankaCd         = パラメータ5
	FOR UPDATE NOWAIT
	;
EXCEPTION
	WHEN NO_DATA_FOUND THEN		
		wvExists := 0;
END;

	IF wvExists = 1 THEN
		prErrMsg := '他のユーザーより登録されました。処理を中止します。' ;
		RAISE ERR_EXCLUSIVE;
	ELSE
		テストテーブルのinsert処理
	END IF;

引用返信 編集キー/
■85993 / inTopicNo.2)  Re[1]: PL/SQLでデータが無いのにデータが返却される
□投稿者/ 魔界の仮面弁士 (1498回)-(2017/12/07(Thu) 16:26:22)
2017/12/07(Thu) 16:26:53 編集(投稿者)

No85992 (k3user さん) に返信
> SELECTの部分でデータが無いにもかかわらず(何度もパラメータは確認しました。)
> データが取得されていまいエラー処理に走ってしまいます。

過去、似たような質問があった際には、
 (1) 接続先サーバーが間違っていた
 (2) データベース側のバグによるもので、パッチ適用で改善した
というものがありました。念のため、上記を疑ってみてください。


> ・SQLを直接実行するとデータはない
同一トランザクション内で確認されていますか?


> ・実行の度にROWVERSIONの値がインクリメントされている。(テーブル内に存在しない値)
テーブル内に存在しないということは、擬似列でしょうか。

その値が増加するというということは、その直前の何か(たとえばトリガー)によって、
更新処理が行われているという可能性はありませんか?

とはいえ、12c で ROWVERSION という名前は聞いたことが無いですね…。
(SQL Server ならばありますが)
Oracle なら ROWID というものがありますが、あれはインクリメントという感じではないですし。

https://technet.microsoft.com/ja-jp/library/ms182776.aspx
https://www.shift-the-oracle.com/sql/column/rowid.html
引用返信 編集キー/
■85994 / inTopicNo.3)  Re[1]: PL/SQLでデータが無いのにデータが返却される
□投稿者/ furu (146回)-(2017/12/07(Thu) 16:29:02)
No85992 (k3user さん) に返信
> 「ROWVERSION」という項目名を疑ってみたのですが、関係は無いはずです。

ORACLEには「ROWVERSION」というものは無いようですが
「ROWVERSION」は何なんですか?

これを他のに変えても駄目ですか?


引用返信 編集キー/
■85995 / inTopicNo.4)  Re[2]: PL/SQLでデータが無いのにデータが返却される
□投稿者/ k3user (21回)-(2017/12/07(Thu) 17:56:27)
魔界の仮面弁士さん

返信ありがとうございます。

> (1) 接続先サーバーが間違っていた
現在、同一構成のサーバが複数あるので、念のため
TEST_TABLEの名前を変えて(TEST_TABLE2という名前に変更して指定の接続先サーバしか存在しない)ためしてみました。

>その値が増加するというということは、その直前の何か(たとえばトリガー)によって、
>更新処理が行われているという可能性はありませんか?
これの可能性が高いので、現在ソースコードを調査中です。
ですが、テーブル名称自体を変更したので、別の処理で更新処理がされているということは無いと思います。

>とはいえ、12c で ROWVERSION という名前は聞いたことが無いですね…。
「ROWVERSION」という名前に特に意味はなく排他制御フラグ的な意味合いで使用しています。
「ROWVERSION」という名前がだめかも知れないと思い念のため別名にしてみましたが、だめでした。


引用返信 編集キー/
■85996 / inTopicNo.5)  Re[3]: PL/SQLでデータが無いのにデータが返却される
□投稿者/ k3user (22回)-(2017/12/07(Thu) 17:59:47)
furuさん
返信ありがとうございます。


>ORACLEには「ROWVERSION」というものは無いようですが
>「ROWVERSION」は何なんですか?
「ROWVERSION」という名前に特に意味はなく役割としては排他制御フラグとして使用しています。

・select時にROWVERSIONを取得
・更新時にROWVERSIONを比較して異なればエラー


>これを他のに変えても駄目ですか?

該当のテーブルを「TEST_TABLE」から「TEST_TABLE2」に変更し
さらに「ROWVERSION」を「HAITAFLG」に変更して試してみたのですが、
結果は同じでした。




引用返信 編集キー/
■85997 / inTopicNo.6)  Re[3]: PL/SQLでデータが無いのにデータが返却される
□投稿者/ 魔界の仮面弁士 (1499回)-(2017/12/07(Thu) 18:05:11)
2017/12/07(Thu) 18:05:53 編集(投稿者)

No85995 (k3user さん) に返信
> 「ROWVERSION」という名前に特に意味はなく排他制御フラグ的な意味合いで使用しています。

ん?これって物理列ですか?それともパラメーター?

物理列なのであれば、該当テーブルに FOR EACH ROW 指定なトリガーを
仕掛けておき、更新履歴を別テーブルに残して追跡してみるとか。
https://www.shift-the-oracle.com/trigger/dml-trigger.html
引用返信 編集キー/
■85998 / inTopicNo.7)  Re[4]: PL/SQLでデータが無いのにデータが返却される
□投稿者/ k3user (24回)-(2017/12/07(Thu) 18:25:24)
魔界の仮面弁士さん
申し訳ございません。説明が不足していました。
物理列です。実際は以下の定義です。

CREATE TABLE JS01.TEST_TABLE2
(
    KONYUBMNCD                     CHAR(3) NOT NULL,
    GYOSYACD                       CHAR(6) NOT NULL,
    KOJINO                         CHAR(8) NOT NULL,
    KEIYAKUKIKANSTR                CHAR(8) NOT NULL,
    KEIYAKUKIKANEND                CHAR(8) DEFAULT ' ',
    SYOTEINAIJIKAN                 NUMBER(3,2) DEFAULT 0,
    TANKACD                        CHAR(3) NOT NULL,
    ITAKUKINMUCD                   CHAR(1) DEFAULT ' ',
    ITAKUSYOKUSYUCD                CHAR(2) DEFAULT ' ',
    JIKANTANKA                     NUMBER(5,0) DEFAULT 0,
    ADDYMD                         CHAR(8) DEFAULT ' ',
    ADDTIME                        CHAR(8) DEFAULT ' ',
    ADDTANCD                       CHAR(6) DEFAULT ' ',
    UPDYMD                         CHAR(8) DEFAULT ' ',
    UPDTIME                        CHAR(8) DEFAULT ' ',
    UPDTANCD                       CHAR(6) DEFAULT ' ',
    UPDPGID                        CHAR(8) DEFAULT ' ',
    HAITAFLG                       NUMBER(38,0) DEFAULT 0,
    CONSTRAINT TEST_TABLE2_IX1 PRIMARY KEY (KONYUBMNCD, GYOSYACD, KOJINO, KEIYAKUKIKANSTR, TANKACD) USING INDEX
        PCTFREE 10
        INITRANS 2
        MAXTRANS 255
        TABLESPACE JS01IND_02
        STORAGE(INITIAL 328K NEXT 328K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 BUFFER_POOL DEFAULT)
        LOGGING
)
PCTFREE 10
MAXTRANS 255
TABLESPACE JS01_02
STORAGE(INITIAL 472K NEXT 472K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 BUFFER_POOL DEFAULT)
NOCACHE
LOGGING
/
COMMENT ON TABLE JS01.TEST_TABLE2 IS 'テスト用テーブル2'
/

引用返信 編集キー/
■86000 / inTopicNo.8)  Re[5]: PL/SQLでデータが無いのにデータが返却される
□投稿者/ k3user (25回)-(2017/12/07(Thu) 19:10:37)
回答を頂いた皆様

詳しく調査した所、PL/SQL内のプログラムで問題があることがわかりました。
掲載したプログラム以外の部分でループと条件分岐に不備がありました。
試しにループと条件分岐を変更した所、問題なく処理が行われました。

この度はご迷惑をおかけしてしまい誠に申し訳ございませんでした。



解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ