【问题标题】:DBMS_XMLQuery and SELECT FOR UPDATEDBMS_XMLQuery 和 SELECT FOR UPDATE
【发布时间】:2011-07-24 20:44:47
【问题描述】:

我有这个 PL/SQL 代码:

qrs := 'CURSOR cur IS SELECT * FROM ' || table|| 
         ' WHERE ' || direction || '=0 AND rownum <= 2000 FOR UPDATE';
v_ctx := DBMS_XMLQuery.newContext(qrs);
DBMS_XMLQuery.GetXML(v_ctx);
DBMS_XMLQuery.closeContext(v_ctx);

,在获得 XML 后,我想更新选定的行:

EXECUTE IMMEDIATE 'UPDATE ' || table || 
        ' SET ' || direction || ' = 4 WHERE CURRENT OF ' || cur;

有人可以帮帮我吗?

【问题讨论】:

    标签: xml oracle plsql


    【解决方案1】:

    使用 DBMS_XMLGEN 代替 11g R2 suggests 的文档。

    create table so2in (id number, proc number, desc_ varchar2(20));
    
    insert into so2in values(100, 0, 'desc of 100');
    insert into so2in values(101, 0, 'desc of 101');
    insert into so2in values(102, 0, 'desc of 102');
    insert into so2in values(103, 0, 'desc of 103');
    insert into so2in values(104, 0, 'desc of 104');
    
    create table so2out(r1 clob, r2 xmltype);
    
    declare
      qryctx dbms_xmlgen.ctxhandle;
      cur sys_refcursor;
      r1 clob;
      r2 xmltype;
    begin
      open cur for
        select id, desc_ from so2in where proc = 0 and rownum <= 2 for update;
    
      qryctx := dbms_xmlgen.newcontext(cur);
      dbms_xmlgen.setrowtag(qryctx, 'Description');
      dbms_xmlgen.setrowsettag(qryctx, 'Descriptions');
    
      r1 := dbms_xmlgen.getxml(qryctx);
    
      update so2in set proc = 1 where proc = 0 and rownum <= 2;
    
      dbms_xmlgen.restartquery(qryctx);
    
      r2 := dbms_xmlgen.getxmltype(qryCtx);
    
      update so2in set proc = 1 where proc = 0 and rownum <= 2;
    
      insert into so2out values(r1, r2);
    
      dbms_xmlgen.closecontext(qryctx);
    
      commit;
    end;
    /
    

    【讨论】:

      【解决方案2】:

      我没有玩过这个 XML 的东西,但是

      EXECUTE IMMEDIATE 'UPDATE ' || table || 
              ' SET ' || direction || ' = 4 WHERE CURRENT OF ' || cur;
      

      cur 是光标的标识符,而不是局部变量的内容,因此它更可能使用

      EXECUTE IMMEDIATE 'UPDATE ' || table || 
              ' SET ' || direction || ' = 4 WHERE CURRENT OF cur';
      

      假设 cur 的上下文被保留,我怀疑它不会。首先,'CURRENT' 暗示一行,但您最多选择 2000 行。我认为您需要选择(最多)2000 行的标识符并单独更新。

      对情况进行更广泛的描述可能会有所帮助

      【讨论】:

      • 非常感谢您的回答。我想选择行并从中生成一个 xml,然后更新这些行的方向列。我想我不能用 DBMS_XMLQuery 做到这一点,因为我不能给 UPDATE 语句提供帮助。我尝试以其他方式解决我的问题。再见!
      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 2017-12-15
      • 2017-12-05
      • 2014-03-10
      相关资源
      最近更新 更多