【问题标题】:upgrading 10 g to 11g checklist将 10 g 升级到 11g 清单
【发布时间】:2012-06-08 08:18:39
【问题描述】:

10g平台上有大量的存储过程。 (近 500 个 SP) 每个 SP 可能有循环、获取等。

想请教一下有没有很酷的方法来控制所有当前运行在10g上的SP,并保证它在11g上运行。

我有一个 10 g 的开发服务器 1,另一个开发服务器是 11 g。 我可以用它们来证明上面的提议。

例如,我知道在 10g 上,如果您使用循环,并且在循环期间更新语句不会影响循环数据,而是 11g。 我可能需要考虑更多的情况。有什么好主意请告诉我,否则我会手动一一检查,时间很多,有时人为控制可能很弱。

重要说明:据说如果你从一个或多个表中选择一些数据,并且如果你在循环中使用它,那么在de loop期间,如果你在循环case之间更新和提交,它会影响选择的数据cursor.(@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 的任何替代建议?

【问题讨论】:

  • 您真的应该为您的应用程序提供一个测试套件
  • 如果您发布了一个在 10g 和 11g 中表现不同的测试用例示例,我们可能会提供帮助。从您的解释中不清楚您在描述什么问题。
  • 我放在上面。请参阅添加的注释。

标签: oracle oracle11g oracle10g upgrade


【解决方案1】:

最近我已经迁移到 Oracle 11g。面临一些前所未有的问题。我为此写了一篇博文。看看http://learncodewrite.blogspot.in/2017/04/migrating-to-oracle-11g-from-oracle-10g.html?m=1

【讨论】:

    【解决方案2】:

    修复它;我在 sp 中添加了如下提示:

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

    【讨论】:

      【解决方案3】:

      我们在迁移过程中偶然发现的一件事是不应该在 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 将运行该语句 - 这是一个错误。

      此错误(错误 ID:6760937)已修复,并导致该语句(正确地)在 11.x 中失败

      【讨论】:

        【解决方案4】:

        基本的 PLSQL 结构应该完全相同。这里列出了一些陷阱:

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

        【讨论】:

        • 据说如果你从一个或多个表中选择一些数据,并且如果你在循环中使用它,那么在de loop期间,如果你在循环case之间更新和coomit,它会影响选择游标中的数据。(@11g)但这并没有发生@10g 版本。如果您听到类似的话,请纠正我...
        猜你喜欢
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-19
        • 2014-09-29
        • 1970-01-01
        • 2019-03-25
        • 2021-08-11
        相关资源
        最近更新 更多