<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Updating st_geometry in an Oracle 11g trigger - index maintenance raises ORA-29470 in Data Management Questions</title>
    <link>https://community.esri.com/t5/data-management-questions/updating-st-geometry-in-an-oracle-11g-trigger/m-p/86334#M5006</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;As described in &lt;/SPAN&gt;&lt;A href="http://www.davidlitchfield.com/blog/archives/00000023.htm"&gt;http://www.davidlitchfield.com/blog/archives/00000023.htm&lt;/A&gt;&lt;BR /&gt;&lt;SPAN style="font-style:italic;"&gt;"For Oracle 11g, Oracle has introduced some security changes to the DBMS_SQL package&lt;BR /&gt;...&lt;BR /&gt;A third change to DBMS_SQL is checking the user ID executing the query and the user ID of the person that parsed the query. If the two don't match an error is generated:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;ORA-29470: Effective userid or roles are not the same as when cursor was parsed&lt;/STRONG&gt;".&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;It seems that mainenance of a spatial index on a st_geometry column uses dbms_sql, and that updating of a st_geometry column in a trigger raises this error.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;One workaround is to set security back to 10g levels by setting the initialization parameter _dbms_sql_security_level = 0 but this is not acceptable.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Apart from getting ESRI to revisit index maintenance, has anyone another workaround?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My application allows entry of an applications for one or more services - in the simple test I have tried to devise they are rubbish bin services as in my part of Sydney - red (general rubbish), yellow (recyclable materials), green (green garden waste). The system creates an application record for each requested service, but the point geometries are arranged around the centroid of the relevant land parcel so that in a map viewer they are not exactly coincident. An operator can drag a point onto another land parcel in a map editor if the original application was found to be wrong and my trigger tries to move the points for any related applications to again be arranged around the centroid of the new land parcel.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My test code is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- create a test table to hold rubbish bin applications; requests for different bin types from&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-- the one applicant will be arranged around the centroid of the applicant's land parcel (parcel and&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-- other details are omitted here for simplicity) so that in a map viewer they are not exactly coincident&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;drop table applications;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;create table applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; (objectid&amp;nbsp; number(5,0) not null,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; point_shape&amp;nbsp; sde.st_geometry,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; application_number nvarchar2(20),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; application_type nvarchar2(20));&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- insert applications for three different bin types from one applicant&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;insert into applications values (1,sde.st_point(100,100,0),'A1','GREEN');&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;insert into applications values (2,sde.st_point(105,100,0),'A1','RED');&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;insert into applications values (3,sde.st_point(100,105,0),'A1','YELLOW');&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;commit;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- add indexes and constraints&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;alter table applications add constraint app_pk primary key (objectid) using index;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;alter table applications add constraint app_uk unique (application_number,application_type) using index;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;create index app_idx0 on applications(point_shape) indextype is sde.st_spatial_index&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; parameters('st_grids=10, 0, 0 st_srid=0');&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- now in the map viewer/editor, an application found to be linked to the wrong land parcel can be moved&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-- by dragging one of the bin points to the correct land parcel; we need a trigger to move related&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-- bin points as well&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;create or replace trigger app_u&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;for update&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;of point_shape&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;on applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;compound trigger&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; type num_tabtype&amp;nbsp;&amp;nbsp;&amp;nbsp; is table of number index by pls_integer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; type nvc20_tabtype&amp;nbsp;&amp;nbsp;&amp;nbsp; is table of nvarchar2(30) index by pls_integer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; type shape_tabtype&amp;nbsp;&amp;nbsp;&amp;nbsp; is table of sde.st_geometry index by pls_integer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; objectids&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num_tabtype;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; application_numbers&amp;nbsp;&amp;nbsp;&amp;nbsp; nvc20_tabtype;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; point_shapes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; shape_tabtype;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; client_info&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varchar2(64);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; j&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pls_integer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; -- cursor to find related applications whose positions will also need to be updated&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; cursor related_applications (p_application_number in nvarchar2, p_objectid in number) is&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objectid&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where application_number = p_application_number&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; and objectid &amp;lt;&amp;gt; p_objectid;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; rarec&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; related_applications%rowtype;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; ---------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; before each row is&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- check whether this update is the result of an application_point being dragged by a user,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- or the result of the statement part of this trigger&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbms_application_info.read_client_info(client_info);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if nvl(client_info,'null') &amp;lt;&amp;gt; 'after app_u trigger after upd stmt part' then&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- record details of the application being updated and the new application point&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objectids(nvl(objectids.last,0) + 1):= :old.objectid;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; application_numbers(nvl(application_numbers.last,0) + 1):= :old.application_number;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; point_shapes(nvl(point_shapes.last,0) + 1):= :new.point_shape;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end before each row;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; ---------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; after statement is&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- check whether this update is the result of an application_point being dragged by a user,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- or the result of the statement part of this trigger&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbms_application_info.read_client_info(client_info);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if nvl(client_info,'null') &amp;lt;&amp;gt; 'after app_u trigger after upd stmt part' then&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- this update is caused by a user moving an application point; process it&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- set some client info which can be tested to determine whether the update&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- is triggered by a user or by the 'after statement' part&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbms_application_info.set_client_info('after app_u trigger after upd stmt part');&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- loop through all updated applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in application_numbers.first..application_numbers.last loop&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- check for related applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j:= 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for rarec in related_applications (application_numbers(i), objectids(i)) loop&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- reposition the points near the moved point&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j:= j + 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update applications set point_shape =&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sde.st_point(sde.st_x(point_shapes(i))+mod(j,2)*5,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sde.st_y(point_shapes(i))+mod(j-1,2)*5,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sde.st_srid(point_shapes(i)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where objectid = rarec.objectid;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end loop;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end loop;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- clear the global application context&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbms_application_info.set_client_info(null);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end after statement;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;end app_u;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- check the data before update&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;column objectid heading "OBJECT|ID" format 9999&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;column application_number heading "APP|NUMBER" format a6&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;column application_type heading "APP|TYPE" format a6&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;column point heading "APP|POINT" format a50&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;select objectid, application_number, application_type, sde.st_astext(point_shape) point&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;from applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;order by 2,3;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/* output is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;OBJECT APP&amp;nbsp;&amp;nbsp;&amp;nbsp; APP&amp;nbsp;&amp;nbsp;&amp;nbsp; APP&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID NUMBER TYPE&amp;nbsp;&amp;nbsp; POINT&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;------ ------ ------ --------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GREEN&amp;nbsp; POINT&amp;nbsp; ( 100.00000000 100.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RED&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT&amp;nbsp; ( 105.00000000 100.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; YELLOW POINT&amp;nbsp; ( 100.00000000 105.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- try an update with the spatial index in place&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;begin dbms_application_info.set_client_info(null); end;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;update applications set point_shape = sde.st_point(200,200,sde.st_srid(point_shape))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;where objectid = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/* output is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;update applications set point_shape = sde.st_point(200,200,sde.st_srid(point_sha&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;pe))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ERROR at line 1:&lt;/SPAN&gt;&lt;BR /&gt;&lt;STRONG&gt;ORA-29877: failed in the execution of the ODCIINDEXUPDATE routine&lt;BR /&gt;ORA-29470: Effective userid or roles are not the same as when cursor was parsed&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-06512: at "SYS.DBMS_SQL", line 1350&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-06512: at "SDE.SPX_UTIL", line 1906&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-06512: at "SDE.ST_DOMAIN_METHODS", line 2112&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-06512: at "SDE.ST_DOMAIN_METHODS", line 2239&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-06512: at "WEBDATA.APP_U", line 59&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-04088: error during execution of trigger 'WEBDATA.APP_U'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- try an update without the spatial index&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;drop index app_idx0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;begin dbms_application_info.set_client_info(null); end;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;update applications set point_shape = sde.st_point(200,200,sde.st_srid(point_shape))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;where objectid = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/* output is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;1 row updated.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- check the data after the update&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;select objectid, application_number, application_type, sde.st_astext(point_shape) point&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;from applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;order by 2,3;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/* output is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;OBJECT APP&amp;nbsp;&amp;nbsp;&amp;nbsp; APP&amp;nbsp;&amp;nbsp;&amp;nbsp; APP&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID NUMBER TYPE&amp;nbsp;&amp;nbsp; POINT&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;------ ------ ------ --------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GREEN&amp;nbsp; POINT&amp;nbsp; ( 200.00000000 200.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RED&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT&amp;nbsp; ( 205.00000000 200.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; YELLOW POINT&amp;nbsp; ( 200.00000000 205.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- clean up&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;drop table applications;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sat, 23 Feb 2013 00:28:30 GMT</pubDate>
    <dc:creator>GeoffLau</dc:creator>
    <dc:date>2013-02-23T00:28:30Z</dc:date>
    <item>
      <title>Updating st_geometry in an Oracle 11g trigger - index maintenance raises ORA-29470</title>
      <link>https://community.esri.com/t5/data-management-questions/updating-st-geometry-in-an-oracle-11g-trigger/m-p/86334#M5006</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;As described in &lt;/SPAN&gt;&lt;A href="http://www.davidlitchfield.com/blog/archives/00000023.htm"&gt;http://www.davidlitchfield.com/blog/archives/00000023.htm&lt;/A&gt;&lt;BR /&gt;&lt;SPAN style="font-style:italic;"&gt;"For Oracle 11g, Oracle has introduced some security changes to the DBMS_SQL package&lt;BR /&gt;...&lt;BR /&gt;A third change to DBMS_SQL is checking the user ID executing the query and the user ID of the person that parsed the query. If the two don't match an error is generated:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;ORA-29470: Effective userid or roles are not the same as when cursor was parsed&lt;/STRONG&gt;".&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;It seems that mainenance of a spatial index on a st_geometry column uses dbms_sql, and that updating of a st_geometry column in a trigger raises this error.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;One workaround is to set security back to 10g levels by setting the initialization parameter _dbms_sql_security_level = 0 but this is not acceptable.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Apart from getting ESRI to revisit index maintenance, has anyone another workaround?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My application allows entry of an applications for one or more services - in the simple test I have tried to devise they are rubbish bin services as in my part of Sydney - red (general rubbish), yellow (recyclable materials), green (green garden waste). The system creates an application record for each requested service, but the point geometries are arranged around the centroid of the relevant land parcel so that in a map viewer they are not exactly coincident. An operator can drag a point onto another land parcel in a map editor if the original application was found to be wrong and my trigger tries to move the points for any related applications to again be arranged around the centroid of the new land parcel.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My test code is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- create a test table to hold rubbish bin applications; requests for different bin types from&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-- the one applicant will be arranged around the centroid of the applicant's land parcel (parcel and&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-- other details are omitted here for simplicity) so that in a map viewer they are not exactly coincident&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;drop table applications;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;create table applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; (objectid&amp;nbsp; number(5,0) not null,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; point_shape&amp;nbsp; sde.st_geometry,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; application_number nvarchar2(20),&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; application_type nvarchar2(20));&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- insert applications for three different bin types from one applicant&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;insert into applications values (1,sde.st_point(100,100,0),'A1','GREEN');&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;insert into applications values (2,sde.st_point(105,100,0),'A1','RED');&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;insert into applications values (3,sde.st_point(100,105,0),'A1','YELLOW');&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;commit;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- add indexes and constraints&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;alter table applications add constraint app_pk primary key (objectid) using index;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;alter table applications add constraint app_uk unique (application_number,application_type) using index;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;create index app_idx0 on applications(point_shape) indextype is sde.st_spatial_index&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; parameters('st_grids=10, 0, 0 st_srid=0');&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- now in the map viewer/editor, an application found to be linked to the wrong land parcel can be moved&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-- by dragging one of the bin points to the correct land parcel; we need a trigger to move related&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;-- bin points as well&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;create or replace trigger app_u&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;for update&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;of point_shape&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;on applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;compound trigger&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; type num_tabtype&amp;nbsp;&amp;nbsp;&amp;nbsp; is table of number index by pls_integer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; type nvc20_tabtype&amp;nbsp;&amp;nbsp;&amp;nbsp; is table of nvarchar2(30) index by pls_integer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; type shape_tabtype&amp;nbsp;&amp;nbsp;&amp;nbsp; is table of sde.st_geometry index by pls_integer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; objectids&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; num_tabtype;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; application_numbers&amp;nbsp;&amp;nbsp;&amp;nbsp; nvc20_tabtype;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; point_shapes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; shape_tabtype;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; client_info&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; varchar2(64);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; j&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pls_integer;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; -- cursor to find related applications whose positions will also need to be updated&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; cursor related_applications (p_application_number in nvarchar2, p_objectid in number) is&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objectid&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where application_number = p_application_number&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; and objectid &amp;lt;&amp;gt; p_objectid;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; rarec&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; related_applications%rowtype;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; ---------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; before each row is&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- check whether this update is the result of an application_point being dragged by a user,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- or the result of the statement part of this trigger&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbms_application_info.read_client_info(client_info);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if nvl(client_info,'null') &amp;lt;&amp;gt; 'after app_u trigger after upd stmt part' then&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- record details of the application being updated and the new application point&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objectids(nvl(objectids.last,0) + 1):= :old.objectid;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; application_numbers(nvl(application_numbers.last,0) + 1):= :old.application_number;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; point_shapes(nvl(point_shapes.last,0) + 1):= :new.point_shape;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end before each row;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; ---------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; after statement is&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- check whether this update is the result of an application_point being dragged by a user,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- or the result of the statement part of this trigger&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbms_application_info.read_client_info(client_info);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if nvl(client_info,'null') &amp;lt;&amp;gt; 'after app_u trigger after upd stmt part' then&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- this update is caused by a user moving an application point; process it&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- set some client info which can be tested to determine whether the update&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- is triggered by a user or by the 'after statement' part&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbms_application_info.set_client_info('after app_u trigger after upd stmt part');&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- loop through all updated applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in application_numbers.first..application_numbers.last loop&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- check for related applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j:= 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for rarec in related_applications (application_numbers(i), objectids(i)) loop&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- reposition the points near the moved point&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j:= j + 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update applications set point_shape =&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sde.st_point(sde.st_x(point_shapes(i))+mod(j,2)*5,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sde.st_y(point_shapes(i))+mod(j-1,2)*5,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sde.st_srid(point_shapes(i)))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where objectid = rarec.objectid;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end loop;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end loop;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- clear the global application context&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbms_application_info.set_client_info(null);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end if;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end after statement;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;end app_u;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- check the data before update&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;column objectid heading "OBJECT|ID" format 9999&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;column application_number heading "APP|NUMBER" format a6&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;column application_type heading "APP|TYPE" format a6&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;column point heading "APP|POINT" format a50&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;select objectid, application_number, application_type, sde.st_astext(point_shape) point&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;from applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;order by 2,3;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/* output is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;OBJECT APP&amp;nbsp;&amp;nbsp;&amp;nbsp; APP&amp;nbsp;&amp;nbsp;&amp;nbsp; APP&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID NUMBER TYPE&amp;nbsp;&amp;nbsp; POINT&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;------ ------ ------ --------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GREEN&amp;nbsp; POINT&amp;nbsp; ( 100.00000000 100.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RED&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT&amp;nbsp; ( 105.00000000 100.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; YELLOW POINT&amp;nbsp; ( 100.00000000 105.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- try an update with the spatial index in place&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;begin dbms_application_info.set_client_info(null); end;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;update applications set point_shape = sde.st_point(200,200,sde.st_srid(point_shape))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;where objectid = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/* output is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;update applications set point_shape = sde.st_point(200,200,sde.st_srid(point_sha&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;pe))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ERROR at line 1:&lt;/SPAN&gt;&lt;BR /&gt;&lt;STRONG&gt;ORA-29877: failed in the execution of the ODCIINDEXUPDATE routine&lt;BR /&gt;ORA-29470: Effective userid or roles are not the same as when cursor was parsed&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-06512: at "SYS.DBMS_SQL", line 1350&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-06512: at "SDE.SPX_UTIL", line 1906&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-06512: at "SDE.ST_DOMAIN_METHODS", line 2112&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-06512: at "SDE.ST_DOMAIN_METHODS", line 2239&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-06512: at "WEBDATA.APP_U", line 59&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ORA-04088: error during execution of trigger 'WEBDATA.APP_U'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- try an update without the spatial index&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;drop index app_idx0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;begin dbms_application_info.set_client_info(null); end;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;update applications set point_shape = sde.st_point(200,200,sde.st_srid(point_shape))&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;where objectid = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/* output is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;1 row updated.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- check the data after the update&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;select objectid, application_number, application_type, sde.st_astext(point_shape) point&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;from applications&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;order by 2,3;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/* output is:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;OBJECT APP&amp;nbsp;&amp;nbsp;&amp;nbsp; APP&amp;nbsp;&amp;nbsp;&amp;nbsp; APP&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID NUMBER TYPE&amp;nbsp;&amp;nbsp; POINT&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;------ ------ ------ --------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GREEN&amp;nbsp; POINT&amp;nbsp; ( 200.00000000 200.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RED&amp;nbsp;&amp;nbsp;&amp;nbsp; POINT&amp;nbsp; ( 205.00000000 200.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3 A1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; YELLOW POINT&amp;nbsp; ( 200.00000000 205.00000000)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;-- clean up&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;drop table applications;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 23 Feb 2013 00:28:30 GMT</pubDate>
      <guid>https://community.esri.com/t5/data-management-questions/updating-st-geometry-in-an-oracle-11g-trigger/m-p/86334#M5006</guid>
      <dc:creator>GeoffLau</dc:creator>
      <dc:date>2013-02-23T00:28:30Z</dc:date>
    </item>
    <item>
      <title>Re: Updating st_geometry in an Oracle 11g trigger - index maintenance raises ORA-29470</title>
      <link>https://community.esri.com/t5/data-management-questions/updating-st-geometry-in-an-oracle-11g-trigger/m-p/86335#M5007</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Just had this same problem in 2017...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Using oracle 11g&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I think it is related to using a compound trigger, I tried the "same" logic in a regular trigger and it worked, but we really need the compound trigger, hoping someone has a solution&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 02 Oct 2017 20:27:38 GMT</pubDate>
      <guid>https://community.esri.com/t5/data-management-questions/updating-st-geometry-in-an-oracle-11g-trigger/m-p/86335#M5007</guid>
      <dc:creator>SamuelAbati</dc:creator>
      <dc:date>2017-10-02T20:27:38Z</dc:date>
    </item>
    <item>
      <title>Re: Updating st_geometry in an Oracle 11g trigger - index maintenance raises ORA-29470</title>
      <link>https://community.esri.com/t5/data-management-questions/updating-st-geometry-in-an-oracle-11g-trigger/m-p/1253853#M44398</link>
      <description>&lt;P&gt;I'm having this problem in 2023, any idea on how to solve the&amp;nbsp;&lt;/P&gt;&lt;P&gt;ORA-29470: Effective userid or roles are not the same as when cursor was parsed ?&lt;/P&gt;</description>
      <pubDate>Wed, 01 Feb 2023 17:07:35 GMT</pubDate>
      <guid>https://community.esri.com/t5/data-management-questions/updating-st-geometry-in-an-oracle-11g-trigger/m-p/1253853#M44398</guid>
      <dc:creator>JorgeLuisYupanqui</dc:creator>
      <dc:date>2023-02-01T17:07:35Z</dc:date>
    </item>
    <item>
      <title>Re: Updating st_geometry in an Oracle 11g trigger - index maintenance raises ORA-29470</title>
      <link>https://community.esri.com/t5/data-management-questions/updating-st-geometry-in-an-oracle-11g-trigger/m-p/1253915#M44399</link>
      <description>&lt;P&gt;&lt;a href="https://community.esri.com/t5/user/viewprofilepage/user-id/648518"&gt;@JorgeLuisYupanqui&lt;/a&gt;&amp;nbsp; - there are many reasons for&amp;nbsp;&lt;SPAN&gt;&lt;STRONG&gt;ORA-29470&lt;/STRONG&gt; see here&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://support.esri.com/en/Search-Results#search?q=ORA-29470" target="_blank"&gt;Esri Support Search-Results&lt;/A&gt;&lt;/P&gt;&lt;P&gt;if you cannot find your issue there then please open a ticket with Esri Support to investigate your issue further.&lt;/P&gt;</description>
      <pubDate>Wed, 01 Feb 2023 16:21:33 GMT</pubDate>
      <guid>https://community.esri.com/t5/data-management-questions/updating-st-geometry-in-an-oracle-11g-trigger/m-p/1253915#M44399</guid>
      <dc:creator>MarceloMarques</dc:creator>
      <dc:date>2023-02-01T16:21:33Z</dc:date>
    </item>
  </channel>
</rss>

