0

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を取得するための代替案はありますか?

4

4 に答える 4

2

移行中に遭遇したことの 1 つは、10.x で機能するはずのないクエリ (ただし、とにかく機能した) が 11.x では機能しなくなったことです。

これは、クエリにあいまいな列参照がある場合に発生します。

このようなもの:

SELECT name,
       f.some_col,
       b.other_col
FROM foo f, 
  JOIN bar b ON f.id = b.fid

nameが両方のテーブルに存在する場合、10.x はステートメントを実行しますが、これはバグでした。

このバグ (BugID: 6760937) は修正され、11.x で (当然のことながら) ステートメントが失敗します。

于 2012-06-05T13:05:14.620 に答える
1

基本的な PLSQL 構造はまったく同じように機能するはずです。いくつかの落とし穴を次に示します。

http://www.help2ora.com/index.php/2011/08/04/be-careful-when-migrating-difference-between-oracle-10g-and-11g/

于 2012-06-05T08:36:54.917 に答える
0

それを修正するには; 私は次のようにspにヒントを入れました:

SELECT / + full(m) / m.musterino、m.subeadi、m.kayitzamani

于 2012-06-12T08:09:16.080 に答える