![](/img/trans.png)
[英]DBMS_XMLQUERY vs DBMS_XMLGEN: Any replacement for DBMS_XMLQUERY.seterrortag(sqlcontext, 'Any_Tag_Name')
[英]DBMS_XMLQuery and SELECT FOR UPDATE
我有這個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的東西
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行的標識符並單獨更新。
更廣泛的情況描述可能會有所幫助
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;
/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.