小弟请教各位,下面是我写的一个存储过程。
目的:通过输入参数var1和var2 ,向Test表中动态update或者insert一条记录。(如果Test表中的a字段存在值等于var1的记录,则update操作,否则insert操作)
具体代码如下:
create or replace procedure mergeTest(var1 in number,var2 in varchar)
AS
v_a number(10);
v_b varchar2(20);
begin
v_a := var1;
v_b := var2;
merge into Test t1
using (select v_a as a,v_b as b from dual) t2
on (t1.a = t2.a)
when matched then
update set t1.b = t1.b
when not matched then
insert (t1.a,t1.b) values(t2.a,t2.b);
commit;
end mergeTest;在单步调试过程中,执行到 merge into Test t1 时,pl/sql 处于executing 状态,无法继续调试。pl/sql 处于假死状态,不能直接关闭调试窗口。只能直接结束pl/sql的进程。
不知那里出了问题。请高手赐教,小弟不甚感激。

解决方案 »

  1.   


    以下代码测试通过:
    CREATE OR REPLACE PROCEDURE MERGETEST(VAR1 IN NUMBER, VAR2 IN VARCHAR2) AS
      V_A NUMBER(10);
      V_B VARCHAR2(20);
    BEGIN
      V_A := VAR1;
      V_B := VAR2;
      MERGE INTO TEST T1
      USING (SELECT V_A AS A, V_B AS B FROM DUAL) T2
      ON (T1.A = T2.A)
       WHEN MATCHED THEN
        UPDATE SET T1.B = T2.B
      WHEN NOT MATCHED THEN
        INSERT (T1.A, T1.B) VALUES (T2.A, T2.B);
      COMMIT;
    END MERGETEST;
    /
      

  2.   

    1楼的朋友,十分感谢。
    我已经发现自己的错误,真是粗心。
    update set t1.b = t1.b  应该改成 update set t1.b = t2.b但调试时执行到 merge into Test t1 时,依然出现原来的情况:pl/sql 处于executing 状态,无法继续调试。请教高手,是何原因啊??
      

  3.   

    可能是你的调试工具的问题,我的pl/sql deverlope 7.1.5.1398可以调试的
      

  4.   

    是不是这个表正在被其他的SESSION执行DML操作?这样会造成锁表。
      

  5.   

    谢谢3楼的朋友。
    我已经重新安装了pl/sql 7.0 Version 。 
    出现了很奇怪的问题:
    在第一次调试该过程时,可以成功。但是在多运行几次,就还是老问题:
    merge into 这行一直处于executing状态,无法继续调试。不知道是不是Test表建的有问题:
    create table Test
    (
    a number(10),
    b varchar2(20)
    )
    或者是:
    merge into 对用户有权限方面的要求。另外,我安装的是oracle10g 服务器端。 
      

  6.   

    4楼的朋友,
    我在调试运行该过程中,没有其它session进行DML操作的。
    当前只有一个normal 用户的session 。并且,没用对该Test表进行任何别的DML操作。