- PR -

PL/SQLでの実行

1
投稿者投稿内容
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 2006-04-21 10:14
PL/SQLで関数を2つつくり、1つ目の関数と2つ目の関数はselectの条件が少し違うだけで、ほぼ同じ関数です。
1つ目の関数でSELECT * BULK COLLECT INTO で検索するとデータはひっかかるのですが、
2つ目の関数だとなぜかひっかかりません。ひっかかる条件のデータはあります。
SQL文だけ実行したらひっかかるのですが・・・
なぜか2つ目の関数だけうまくいきません。コーディングには問題ないと思うのですが。。(1つ目の関数ではうまくいってるので)
原因として挙げられることってありますでしょうか。
Object Browserで実行しています。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-04-21 10:32
上記内容だけですと、原因追求もできないと思うので
・PL/SQLのコード
・対象テーブル
・テーブルに含まれているデータ
・データの関連
などの情報を提示してみてはいかがでしょうか?
Penguin
会議室デビュー日: 2006/03/01
投稿数: 13
投稿日時: 2006-04-21 10:38
1つ目の関数と2つ目の関数の実行は連続した処理ですか?2つ目の関数の実行前にselect先のテーブルへの更新処理などが入ったりはしていないでしょうか。
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 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ではうまくいきます。
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 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
Penguin
会議室デビュー日: 2006/03/01
投稿数: 13
投稿日時: 2006-04-21 11:14
条件だけでなく取得先のテーブルも違ってるようですが・・。
関数1と関数2でそれぞれselectしているテーブルの内容をもう1度確認してはいかがでしょうか。
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 2006-04-21 14:10
すみません!自己解決しました!
ありがとうございました!!
1

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