0

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

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

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

例如,我知道在 10 g 上,如果您使用循环,并且在循环期间更新语句不会影响循环数据,但会影响 11g。我可能需要考虑更多的情况。如果您有什么高明的想法请告诉我,否则我会手动逐个检查它们,这需要很多时间,有时人为控制可能会很弱。

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

是不是很奇怪?获得阿姆斯特丹的任何替代建议?

4

4 回答 4

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 将运行该语句 - 这是一个错误。

此错误 (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 回答
0

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

于 2017-04-02T04:43:22.117 回答