10gプラットフォームにはたくさんのストアドプロシージャがあります。(ほぼ500 SP)各SPには、ループ、フェッチなどがある場合があります。
現在10gで動作しているすべてのSPを制御し、11gで動作することを保証するクールな方法があるかどうかをお聞きしたいと思います。
私は10gの開発サーバー1を持っており、他の開発サーバーは11gです。私はそれらの両方を使用して、上記の提案を証言することができます。
たとえば、ループを使用する場合は10 gで、ループ中にupdateステートメントはループデータに影響を与えませんが、11gに影響を与えることを私は知っています。私が考慮しなければならないケースがもっとあるかもしれません。素晴らしいアイデアがあれば教えてください。そうでない場合は、手動で1つずつチェックします。時間がかかり、人間のコントロールが弱い場合があります。
重要な注意:1つまたは複数のテーブルからデータを選択し、それをループで使用する場合、ループ中に更新してループケース間でコミットすると、カーソル内の選択されたデータに影響すると言われています。( @ 11g)しかし、これは@10gバージョンでは発生しませんでした。そのようなことを聞いたら訂正してください。
例のケース;
CREATE TABLE vty_musteri(
musterino NUMBER NOT NULL,
subeadi VARCHAR2(61),
kayitzamani VARCHAR2(20)
);
INSERT INTO vty_musteri (musterino, subeadi, kayitzamani )
VALUES (12345, 'AMSTERDAM', '05/30/2012 15:11:13');
COMMIT;
CREATE UNIQUE INDEX vty_musteri_idx ON vty_musteri (musterino);
SELECT * FROM vty_musteri;
CREATE OR REPLACE PROCEDURE krd_upd_silseomusteri_sp(RC1 in out SYS_REFCURSOR) AS
v_musterino NUMBER := 12345;
BEGIN
OPEN RC1 FOR
SELECT m.musterino, m.subeadi, m.kayitzamani
FROM vty_musteri m
WHERE m.musterino = v_musterino;
update vty_musteri
set subeadi = 'PORTO',
kayitzamani = (SELECT TO_CHAR(SYSDATE, 'MM/DD/YYYY HH24:MI:SS')
FROM dual)
where musterino = v_musterino;
COMMIT;
結局、PLSQLでこのテストを実行します。
DECLARE
--test
vRecTip SYS_REFCURSOR;
TYPE vRecTipK IS RECORD(
musterino NUMBER,
subeadi VARCHAR2(61),
kayitzamani VARCHAR2(20)
);
v_SeoTip vRecTipK;
BEGIN
krd_upd_silseomusteri_sp(rc1 => vRecTip);
IF vRecTip%ISOPEN THEN
LOOP
FETCH vRecTip
INTO v_SeoTip;
EXIT WHEN vRecTip%NOTFOUND;
dbms_output.put_line('The Value : ' || v_SeoTip.musterino || ' - ' || v_SeoTip.subeadi || ' - ' || v_SeoTip.kayitzamani);
END LOOP;
END IF;
COMMIT;
END;
END;
これを10gで実行すると、AMSTERDAMが表示されますが、11GではPORTOです。
それを修正するには; 私は次のようにspにヒントを入れました:
SELECT /*+ full(m)*/ m.musterino, m.subeadi, m.kayitzamani
変じゃない?AMSTERDAMを取得するための代替案はありますか?