Вам нужно сделать execute immediate
, если вы хотите сделать DML, используя динамическое имя таблицы в PL / SQL.Подстановочные строки (& TABLENAME) не меняют это.
DECLARE
TABLENAME VARCHAR2(255) := 'ACCOUNT';
FIELD_POSITION VARCHAR2(255) := 'c2';
BEGIN
execute immediate 'update ' || TABLENAME || ' T1 set T1.xmlrecord = updatexml(T1.xmlrecord,''/row/' || FIELD_POSITION || '/text()'', dbms_random.string(''A'',10) )';
DBMS_OUTPUT.PUT_LINE(CHR(10)||'*******COLUMN UPDATED AS REQUESTED*******');
END;
/
РЕДАКТИРОВАТЬ: О, ваш запрос Xpath неверен.Это ничего не соответствует, поэтому updatexml
ничего не заменяет в xml.Вы просто хотите /row/c2/text()
вместо /ACCOUNT/row/preserve[position()=c2]/text()
.Вот пример:
-- sample data
with t1 as (select xmltype('<row id="10043210281964" xml:space="preserve"><c1>11365650</c1><c2>6970</c2><c3>AAAAAAAA</c3></row>') as xmlrecord from dual)
select
updatexml(T1.xmlrecord,'/ACCOUNT/row/preserve[position()=c2]/text()', dbms_random.string('A',10) ) first_way,
updatexml(T1.xmlrecord,'/row/c2/text()', dbms_random.string('A',10) ) second_way
from t1;
Я обновил блок pl / sql выше, чтобы получить рабочий запрос xpath - попробуйте еще раз.