DBMS_XMLQuery и SELECT FOR UPDATE - PullRequest
       0

DBMS_XMLQuery и SELECT FOR UPDATE

0 голосов
/ 25 июля 2011

У меня есть этот код 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;

Может ли кто-нибудь помочь мне, пожалуйста?

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Документация по 11g R2 предполагает с использованием DBMS_XMLGEN вместо.

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;
/
1 голос
/ 25 июля 2011

Я не играл с этим 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 выбранных строк и обновить индивидуально.

Более широкое описание ситуации может помочь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...