【问题标题】:Is UPDATE and CONNECT BY supported?是否支持 UPDATE 和 CONNECT BY?
【发布时间】:2016-04-11 02:30:46
【问题描述】:

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

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

然后我取出查询,execute immediate中的查询是:

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

我尝试执行/编译该查询,但出现如下错误:

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

update 是否支持 connect by prior

这是我的程序,当到达execute immediate时,错误低于update mstarea

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;

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

【问题讨论】:

标签: oracle stored-procedures sql-update execute-immediate


【解决方案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 prior在Oracle中不受支持。

【讨论】:

  • 哦,好的,感谢@Rene 的建议,我已经添加了该参数,但仍然有同样的错误。是来自声明吗?还是什么?
  • 没有实际错误很难给出答案。拿起查询并在其中运行 SQLplus。
  • 好的@Rene,当我取出那个查询时,错误消息是:ORA-00933: SQL command not properly ended我错了吗?
  • pid、pnewarea1、pnewarea1、pnewarea2 的值是多少?它们都有价值吗?如果不是,那可能是你的问题。
  • 也许问题是:是否支持先前的更新和连接?
猜你喜欢
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2014-12-12
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多