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
是不是很奇怪?获得阿姆斯特丹的任何替代建议?