2012-06-04 39 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