- - PR -
PL/SQLでの実行
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-04-21 10:14
PL/SQLで関数を2つつくり、1つ目の関数と2つ目の関数はselectの条件が少し違うだけで、ほぼ同じ関数です。
1つ目の関数でSELECT * BULK COLLECT INTO で検索するとデータはひっかかるのですが、 2つ目の関数だとなぜかひっかかりません。ひっかかる条件のデータはあります。 SQL文だけ実行したらひっかかるのですが・・・ なぜか2つ目の関数だけうまくいきません。コーディングには問題ないと思うのですが。。(1つ目の関数ではうまくいってるので) 原因として挙げられることってありますでしょうか。 Object Browserで実行しています。 |
|
投稿日時: 2006-04-21 10:32
上記内容だけですと、原因追求もできないと思うので
・PL/SQLのコード ・対象テーブル ・テーブルに含まれているデータ ・データの関連 などの情報を提示してみてはいかがでしょうか? |
|
投稿日時: 2006-04-21 10:38
1つ目の関数と2つ目の関数の実行は連続した処理ですか?2つ目の関数の実行前にselect先のテーブルへの更新処理などが入ったりはしていないでしょうか。
|
|
投稿日時: 2006-04-21 10:57
CREATE OR REPLACE FUNCTION Sample(
引数a IN XXXXXXX, 引数b IN XXXXXXX, 引数c IN XXXXXXX, 引数d IN XXXXXXX, 引数e IN XXXXXXX)RETURN NUMBER AS /*登録処理の関数*/ FUNCTION Insert(DB1 IN XXXXXXX) RETURN BOOLEAN IS BEGIN INSERT INTO DB1 ( XXXXXX, XXXXXX, ) VALUES ( DB1.XXXXXX, DB1.XXXXXX, ); RETURN TRUE; EXCEPTION WHEN OTHERS THEN RETURN FALSE; END Insert; /*1つめのファンクション*/ FUNCTION Func1 RETURN BOOLEAN IS TYPE blk_DB2_type IS TABLE OF G032%ROWTYPE INDEX BY BINARY_INTEGER; arrayDB2A blk_DB2_type; /* カーソル定義 */ CURSOR cusVI_DB3 IS SELECT aa, bb, cc FROM VI_DB3 WHERE aa = 引数a AND bb = 引数b AND cc = 高値; recDB3A cusVI_DB3%ROWTYPE; BEGIN OPEN cusVI_DB3; LOOP FETCH cusVI_DB3 INTO recDB3A; EXIT WHEN cusVI_DB3%NOTFOUND; SELECT DB2.* BULK COLLECT INTO arrayDB2A FROM DB2, DB4 WHERE XXXXXX = 引数.a AND XXXXXX = 引数.b AND XXXXXX = XXXXXXX AND XXXXXX = DB4.XXXXXXX AND XXXXXX = 高値;-ここの条件が2つ目の関数と違う IF arrayDB2A.COUNT <= 0 THEN RETURN TRUE; END IF; i := arrayG032A.FIRST; numMax := arrayG032A.LAST; /* arrayDB2Aで件数が取れたら登録値設定→登録処理関数Insertを呼び出す */ END IF; END LOOP; CLOSE cusVI_DB3; RETURN 0; EXCEPTION WHEN OTHERS THEN /* 戻り値セット*/ RETURN FALSE; END Func1; /*2つめのファンクション*/ FUNCTION Func2 RETURN BOOLEAN IS TYPE blk_DB2_type IS TABLE OF G032%ROWTYPE INDEX BY BINARY_INTEGER; arrayDB2B blk_DB2_type; /* カーソル定義 */ CURSOR cusVI_DB3 IS SELECT aa, bb, cc FROM VI_DB3 WHERE aa = 引数a AND bb = 引数b AND cc = 低値; recDB3B cusVI_DB3%ROWTYPE; BEGIN OPEN cusVI_DB3; LOOP FETCH cusVI_DB3 INTO recDB3B; EXIT WHEN cusVI_DB3%NOTFOUND; SELECT DB2.* BULK COLLECT INTO arrayDB2B FROM G032, G003 WHERE XXXXXX = 引数.a AND XXXXXX = 引数.b AND XXXXXX = XXXXXXX AND XXXXXX = DB4.XXXXXXX AND XXXXXX = 低値; --ここの条件が1つ目の関数と違う IF arrayDB2A.COUNT <= 0 THEN RETURN 0; END IF; i := arrayG032A.FIRST; numMax := arrayG032A.LAST; /* arrayDB2Bで件数が取れたら登録値設定→登録処理関数Insertを呼び出す */ END IF; END LOOP; CLOSE cusVI_DB3; RETURN 0; EXCEPTION WHEN OTHERS THEN /* 戻り値セット*/ RETURN -1; END Func2; /************************************************** * メイン処理 **************************************************/ BEGIN /* 1つめの関数 */ IF Func1() = FALSE THEN ROLLBACK; /* 戻り値セット */ RETURN -1; END IF; /* 2つめの関数 */ IF Func2() = FALSE THEN ROLLBACK; /* 戻り値セット */ RETURN -1; END IF; /* コミット */ COMMIT; /* 戻り値セット */ RETURN -1; END Sample; / 関数1と2では、カーソルの条件とselect BULK COLLECT intoの条件が違うだけです。 カーソルは件数が取れますが、select BULK COLLECT intoだと0件になります。 関数1ではうまくいきます。 |
|
投稿日時: 2006-04-21 11:03
すみません。訂正します。
関数2の IF arrayDB2A.COUNT <= 0 THEN RETURN 0; END IF; i := arrayG032A.FIRST; numMax := arrayG032A.LAST; <正しい> IF arrayDB2B.COUNT <= 0 THEN RETURN 0; END IF; i := arrayG032B.FIRST; numMax := arrayG032B.LAST; です。 A→B |
|
投稿日時: 2006-04-21 11:14
条件だけでなく取得先のテーブルも違ってるようですが・・。
関数1と関数2でそれぞれselectしているテーブルの内容をもう1度確認してはいかがでしょうか。 |
|
投稿日時: 2006-04-21 14:10
すみません!自己解決しました!
ありがとうございました!! |
1