将10克升级到11克清单

时间:2012-06-04 08:17:51

标签: oracle oracle10g oracle11g major-upgrade

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

我想问你是否有一种很酷的方法可以控制当前在10g上运行的所有SP,并保证它可以在11g上运行。

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

例如,我知道如果使用循环,则在10 g上,并且在循环期间,update语句不会影响循环数据,但会影响11g。 我可能需要考虑更多的案例。请告诉我你是否有任何明智的想法,否则我会手动逐一检查它们,这是很多时间,有时候人为控制可能会很弱。

重要说明:据说如果从一个或多个表中选择一些数据,并且如果在循环中使用它,那么在de循环期间,如果在循环情况之间更新和提交,则会影响所选数据。游标。(@ 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 个答案:

答案 0 :(得分:2)

我们在迁移期间偶然发现的一件事是那些不应该在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中失败

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

  

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

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

答案 3 :(得分:0)

最近我完成了向Oracle 11g的迁移。面对前所未有的几个问题。我写了一篇博文。看看http://learncodewrite.blogspot.in/2017/04/migrating-to-oracle-11g-from-oracle-10g.html?m=1