2012-06-04 38 views
0

10g平台上有大量的存储过程。 (差不多500个SP) 每个SP可能有循环,提取等。升级10 g到11g清单

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

我有一个10克的开发服务器1,另一个开发服务器是11克。 我可以使用他们两个来证明上述建议。

举例来说,我知道如果你使用循环,在10g的时候,在循环期间更新语句不会影响循环数据,但是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中,你会看到阿姆斯特丹运行它,但11G,这是波尔图。

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

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

难道不是很奇怪吗?任何取代AMSTERDAM的选择?

+0

为什么关闭:(... – theklc

+0

你真的应该为你的应用程序有一个测试套件 – steve

+1

如果你发布了一个在10g和11g中表现不同的测试用例的例子,我们可能会做一些事情来帮助你。从你的解释中我们不清楚你描述的是什么问题 –

回答

1

基本PLSQL结构应该完全一样。一些陷阱这里列出:我们在迁移过程中偶然发现

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

+0

据说如果你从一个或多个表中选择一些数据,并且如果你在一个循环中使用它,那么在循环过程中,如果你更新和循环的情况下,它会影响光标所选的数据。(@ 11g)但是,这并没有发生@ 10g版本,请纠正我,如果你听到这样的话... – theklc

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中会跑的声明 - 这是一个错误。

这个bug(错误ID:6760937)固定,使语句(理所当然)无法在11.x的

0

为了解决这个问题;我把一个提示在SP如下所示:

SELECT/+满(米)/m.musterino,m.subeadi,米。kayitzamani