2

我使用创建了一个过程execute immediate,当我在此过程中调试并单步execute immediate执行时,它显示以下消息:

您的代码中发生了 Oracle 异常。如果代码包含异常处理程序,您可以继续单步执行该处理程序;否则,将显示错误消息,下一步将退出执行。

然后我取出查询,立即执行中的查询是:

update mstarea 
set '||v_temp_position||' = :pid 
where areacode = :pnewarea1 
connect by prior areacode = areaparent 
start with areacode in (:pnewarea1, :pnewarea2);

我尝试执行/编译该查询,它有这样的错误:

ORA-00933: SQL 命令未正确结束

connect by prior支持update? _

update mstarea这是我的程序,当它到达时,错误如下execute immediate

CREATE OR REPLACE procedure PROC1(pid in varchar2, pposition in varchar2, pnewarea1 in varchar2, pnewarea2 in varchar2)
is 
v_error_message varchar2(255);
v_temp_position varchar2(25 byte);
v_sql_statement varchar2(255);
n_count_role number;
cursor cuser is
    select userid from master.mstuser where id = pid; 
begin
    for cdata in cuser
    loop
        begin
            select count(role) into n_count_role from mstmapping where role = pposition;
            if n_count_role > 0 then
            begin
                ..........
                if pnewarea1 = 'ALL' then
                    ..........
                else
                    ..........
                    ------------------- update mstarea -------------------
                    if pposition in ('A', 'B') then
                        select 'AB' into v_temp_position from dual;
                    else
                        select pposition into v_temp_position from dual;
                    end if;
                    v_sql_statement := 'update mstarea set '||v_temp_position||' = :pid where areacode = :pnewarea1 connect by prior areacode = areaparent start with areacode in (:pnewarea1, :pnewarea2)';
                    execute immediate v_sql_statement using pid, pnewarea1, pnewarea1, pnewarea2; -- advice from @Rene
                    ------------------------------------------------------
                    ..........
                    end;
                end if;
            end;
            end if;
            exception
            when others then
            ..........
        rollback;
        end;
    commit;
    exit when cuser%notfound;
    end loop;
end;

我应该怎么做才能解决这个问题?

4

1 回答 1

1

放大这部分代码:

v_sql_statement := 'update mstarea 
                    set '||v_temp_position||' = :pid 
                    where areacode = :pnewarea1 
                    connect by prior areacode = areaparent 
                    start with areacode in (:pnewarea1, :pnewarea2)';

execute immediate v_sql_statement                         
using pid, pnewarea1, pnewarea2;

您的查询中有四个变量。尽管其中两个具有相同的名称,但您必须为每个位置提供一个值。要解决此问题,请使用 pnewarea1 两次:

execute immediate v_sql_statement                         
    using pid, pnewarea1, pnewarea1, pnewarea2;

- 编辑 - -

结论是update .. connect by priorOracle不支持。

于 2016-04-11T07:52:03.657 回答