View with Instead of Trigger - ORA-01031
I am having trouble with a form based on a view that uses an instead of trigger.
When I attempt to update a complex view that uses instead of triggers in an APEX form, I get the following message:
ORA-20001: Error in DML: p_rowid=21388, ... ORA-01031: insufficient privileges
The view works correctly when updates are executed from SQL Plus.
The view "VW" is based on several tables in the application schema "X", which is parsed by APEX, and several tables in another schema "Z". I have explicitly granted select permission on the tables in schema "Z" to schema "X", but this doesn't resolve the error.
Any idea how to fix this problem? From reading other posts, it sounds like the only issue should be explicit grants on the tables in other schemas. I do not attempt to update the tables in schema "Z", and do not have update permissions to those tables.
Sinerely, Justin
Justin,
you might try to grant the views to the FLOWS_xxxxx user, which performs the Apex processes.
Dik Dral
Similar Messages
-
Issue in Invoking an Updatable View with Instead of Trigger
Hi,
I am trying to insert a record using Updatable View with Instead of Trigger. When i try to save the data, i get the below error:
java.sql.SQLException: ORA-01403: no data found
ORA-06512: at line 1
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:457)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:405)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:889)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:476)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:204)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:540)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:213)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1075)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1466)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3752)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3887)
at oracle.jdbc.driver.OracleCallableStatement.executeUpdate(OracleCallableStatement.java:9323)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1508)
at weblogic.jdbc.wrapper.PreparedStatement.executeUpdate(PreparedStatement.java:172)
at oracle.jbo.server.OracleSQLBuilderImpl.doEntityDML(OracleSQLBuilderImpl.java:432)
at oracle.jbo.server.EntityImpl.doDMLWithLOBs(EntityImpl.java:8566)
Can someone help me resolve this issue?
Also it would be great if you can share Sample codes for Invoking an updatable view with instead of trigger on Save/commit.
Regards,
JeevanAs a trigger is executed in the db and not in your app it's really hard to help as you did not give any useful information.
Have you read this blog http://stegemanoracle.blogspot.com/2006/03/using-updatable-views-with-adf.html ?
Timo
Edited by: Timo Hahn on 22.09.2011 09:15
And my friend google also found http://technology.amis.nl/blog/1447/adf-business-components-resfresh-after-insertupdate-and-instead-of-triggers -
How to create ADF BC components like EO from "View with INSTEAD OF trigger
I have a "View with INSTEAD OF trigger" on a external schema. is it possible to create ADF EO on top of this view in my local schema?. If possible, then is it possible to insert/update that external table using ADF standard data controls and Application module?. I'm trying to see if it's possible with standard ADF controls without calling pl/sql API to insert/update that external table. any ideas are appreciated.
Regards,
Suryahttp://stegemanoracle.wordpress.com/2006/03/15/using-updatable-views-with-adf/
-
ADF BC: Creating updatable VO based upon DB View with "instead of" trigger
Hello all,
I have got an interesting issue. I have an Oracle DB view that is used to hide some complexity in the underlying DB design (it does some unions). This view is updatable because we have created an "instead of" update trigger to update the correct table when a row is updated. This is working fine in SQL.
Next, we have created an ADF Entity object based upon the view, specifying an appropriate PK for the DB View. Then, we have created an updatable VO based upon the EO. All well and good so far. The issue we have is in trying to commit changes to the DB - because the ADF BC framework is trying to lock the row to update (using SELECT ... FOR UPDATE), it's not working because of ORA-02014 - cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.
This leads me to thinking about overridding doSelect() on the EO as hinted here http://radio.weblogs.com/0118231/stories/2005/07/28/differenceBetweenViewObjectSelectAndEntityDoselectMethod.html
As a temporary test, we have over-ridden the EO's doSelect to call super.doSelect(false) and it does work, although we will have lost update issues as detailed in Steve's article.
My questions:
1). Is overriding doSelect() the correct thing here? Perhaps there is a better way of handling this problem? I do have a base EO class from which all of the EO's extend, so adding this behavior should be straightforward.
2). Does anyone have example doSelect implementation? I am thinking of overriding doSelect for my EO and calling super.doSelect (lock=false), but then I need to deal with some possible exceptions, no?
Kind regards,
JohnHi John,
I have exactly the same issue as you experienced back in January. I have a complex data modelling requirement which requires the need to pivot rows into columns using ROW_NUMBER() and PARTITION clauses. To hide the complexity from the middle tier, I have created a database view and appropriate INSTEAD OF triggers and mapped my EO to the view. I have overriden the lock() method on the EO implementation class (to avoid ORA-02014) and would like to try the same solution you used with the pl/sql call to lock the record.
My question is, how did you manage the release of the lock if the transaction was not rolled back or committed by your application i.e. if the user closed the browser for instance.
In my naivity, I would like to think that the BC4J framework would release any locks for the database session when it found the servlet session to be terminated however my concern is that the lock would persist and cause complications.
Any assistance greatly appreciated (if you would be willing to supply your lock() method and pl/sql procedure logic I would be even more grateful!).
Many thanks,
Dave
London -
View with instead of trigger still not updatable
Hi everybody,
could somebody explain how to make this view updatable?
I have the following log:
CREATE OR REPLACE FORCE VIEW BRS_V_VERPLICHTINGEN
(VERPLICHTING_NR
,ONTSTAANSJAAR
,OMSCHRIJVING
,DATUM_VERANTWOORDING
,OBJECT_NR
,OBJECT_NAAM
,CDG_CODE
,TMA_CODE
,CREATED_BY
,CREATION_DATE
,LAST_UPDATED_BY
,LAST_UPDATE_DATE)
AS SELECT vw_brs_verplichting.verplichting_nr
, vw_brs_verplichting.ontstaansjaar
, nvl( brs_verplichtingen.omschrijving, vw_brs_verplichting.verplichting_oms
, vw_brs_verplichting.datum_verantwoording
, vw_brs_verplichting.object_nr
, vw_brs_verplichting.object_naam
, brs_verplichtingen.cdg_code
, brs_verplichtingen.tma_code
, brs_verplichtingen.created_by
, brs_verplichtingen.creation_date
, brs_verplichtingen.last_updated_by
, brs_verplichtingen.last_update_date
FROM vw_brs_verplichting
, brs_verplichtingen
WHERE vw_brs_verplichting.vervallen_code = 'N'
AND vw_brs_verplichting.verplichting_nr = brs_verplichtingen.verplichting_nr
AND vw_brs_verplichting.ontstaansjaar = brs_verplichtingen.ontstaansjaar
View created
CREATE OR REPLACE TRIGGER BRS_VVG_IRU
INSTEAD OF UPDATE
ON BRS_V_VERPLICHTINGEN
BEGIN
brs_vvg_pck.instead_of_row_update( :new.verplichting_nr
, :new.ontstaansjaar
, :new.omschrijving
, :new.cdg_code
, :new.tma_code
END ;
Trigger created
SELECT COLUMN_NAME
, INSERTABLE
, UPDATABLE
, DELETABLE
FROM USER_UPDATABLE_COLUMNS
WHERE TABLE_NAME = 'BRS_V_VERPLICHTINGEN'
COLUMN_NAME INSERTABLE UPDATABLE DELETABLE
VERPLICHTING_NR YES YES YES
ONTSTAANSJAAR YES YES YES
OMSCHRIJVING NO NO NO
DATUM_VERANTWOORDING YES YES YES
OBJECT_NR YES YES YES
OBJECT_NAAM NO YES NO
CDG_CODE NO YES NO
TMA_CODE NO YES NO
CREATED_BY NO YES NO
CREATION_DATE NO YES NO
LAST_UPDATED_BY NO YES NO
LAST_UPDATE_DATE NO YES NO
12 rows selected
But that one column still isn't updatable... however because i'm using an INSTEAD OF UDPATE trigger they should all be updatable, shouldn't they?
I'm using the 10g database...
Hope someone can help...
Regards,
RobertJustin,
you might try to grant the views to the FLOWS_xxxxx user, which performs the Apex processes.
Dik Dral -
Form with view having instead-of-trigger gives FRM-40501 and ORA-02014
I created a data-entry from with a 'view' as datas-source block. This view gives crosstab query results with a data from a single base-table but it is complex and uses decode and aggregate funciton 'max' just to create group by in a crosstab query. I have created a instead of trigger on this view to update or insert a record in base table. A test to update base table works fine at SQl prompt. A test to insert at SQL shows '1 row created' but in fact when I query the database, it does not show newly inserted row. Also, when I compile and run this form, I get FRM-40501 and ORA-02014. Help!!!
I know that DML operations on a view with DECODE, aggregate functions or group by can not be performed but I thought the "instead of" trigger on the view to update the base table should eleminate this restriction and hence pusued further but now stuck!
BTW: I can post details of base table, view, and instead of trigger, if you want to see them to further decipher the problem. Just let me know. Thanks!
VERSIONS: Forms in developer suite v10.1.2.0.2 on Windows XP 64 bit desktop - ; Backend database: 9.2.0.8 on Windows 2003 EE server
Edited by: user8647268 on Aug 19, 2009 1:19 PM
Edited by: user8647268 on Aug 19, 2009 1:25 PMI just forgot to ask you one question: In my experience with forms, I have captured before_value and after_value and implemented logic based on results many times. This form I am working on is kinda first multi-record form where I have a tabular page with date and about 7 other columns forming a grid of cells, which users wanted. Each line is a record from a view. I tried relying on forms to do DML on underlying table and since the underlying table is a paritioned table, I ran into FRM-40509 and ORA-00936, where returning ROWID becomes problematic. I found a note 167550.1 which says to set Key mode to 'Updateable' or 'Non-Updateable' but not 'Unique' or 'Automatic' as a solution #1. Solution#1 failed i.e. the errors persisted. The note also says in that case, implement Solution #2, which is to write explicit trigger to do each of the DML on view. Here I run into kinda problem: In a tabular form with say 31 records each row having 7 cells which is like capturing 217 before values..that is too many. Addressing them with ':old.xxx' or ':new.xxx' which works in instead of trigger, does not work in trigger inside forms. Without checking these before and after values, it inserts rows with nulls for empty cells where we wnated it to skip and do nothing. So iam looking for a way to capture before value using some kinda standard form mechanism..Do you have any suggestions! (Sorry for long explanation but that is the only way to do it..)
-
"Refresh after" insert fails for DB-View with INSTEAD OF Triggers
Hi,
I have a database view with INSTEAD OF triggers defined for INSERT, UPDATE, DELETE.
For some EO attributes the refresh after insert and update is defined.
Posting to database fails.
According to Database 9.2 Manual and a previous thread (BC4J and Updatable Views the RETURNING clause is not allowed for database views with INSTEAD OF triggers.
Is there a workaround so the refresh after is done, but without the RETURNING feature?
I only need to refresh some values. The PK i can set in the create method of the EO so refresh via a additional SELECT would be possible.
If not Feature Request:
Add the possibility to do the "refresh after ..." with a 2nd SELECT using the PK instead of using the RETURNING clause.
Of course then it is not possible to set the PK in the database trigger. PK has to be set in the create method of the EO.
Thanks,
Markus
GEMS ITHi Markus,
Turning on the stack trace (-Djbo.debugout put=Console - in the Project/runner) did help and I should have done it sooner. Turns out that when I constructed my EO based upon a database view - I should have left out the PKs of the base tables.
In my case, I am using an "Instead Of Trigger" to populate a multi-table arrangement (parent - child - grandChild - greatGrandChild relationship) where all base tables are using dbSequence/dbTriggers.
Final analysis - I would like to see BC4J handle this situation. I do not want to use View-Links and I should * not * have to resort to stored procedures and BC4J/doDML. If I construct a DB View this is participating in an parent - child - grandChild - greatGrandChild relationship that are using dbSequence/dbTriggers, then BC4J should be smart enough to construct VO knowing that I want to do insert, update, delete, selects - based upon this structure.
Thanks Markus,
Bill G... -
ApEx 4.1.1: update record in a view with 'instead of update' trigger
I created a form against a view. The view is complex enough which prevents direct updates. To incorporate the update logic I created an 'instead of update' trigger on the view. When I open up the form, do changes, and click 'Apply Changes' button I am getting the following exception
ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.
I understand that the standard 'Automatic Row Processing' process is trying to lock the record before updating using a cursor like
select *
from my_view
for update
and fails. Is it possible to bypass this locking while using the standard APEX processes?
I think I can create a custom PL/SQL process which would execute the UPDATE statement (at least, it works in SQL*Plus), but I would like to know if I can use a standard ApEx functionality for this.Hello,
Sorry for delay.
I had found a feedback about trigger issue when restore SQL Database from a BACPAC file. Microsoft said the fixed will be available in the next major release of DacFx.
Feedback:
SQL Azure fires a trigger when restoring from bacpac
You can refer to the workarounds in the feedback. For example, if there is small amount of triggers on the database, you can try to remove the triggers and then recreate when restore from bacpac file.
Regards,
Fanny Liu
Fanny Liu
TechNet Community Support -
Issue with instead of trigger on a view
Gurus,
I have an issue with an instead of trigger on a view. The trigger is listed below. The insert and update seem to be working fine but the delete section is not.
From the application, we have a screen on which we attach images. We trigger of an insert and update when we attach images. We are using hibernate as our object relational mapping tool.
We have added some logging into the delete section but that portion of the trigger does not seem to be executing at all.
Please advise.
Thanks
Hari
CREATE OR REPLACE TRIGGER trg_vw_result_image_uid
INSTEAD OF
INSERT OR DELETE OR UPDATE
ON vw_result_image
REFERENCING NEW AS NEW OLD AS OLD
DECLARE
v_cnt number(38);
v_cnt_old number(38);
v_err_msg VARCHAR2 (250);
BEGIN
-- v_rslt_id number(38);
-- v_cnt number(38);
select count(1) into v_cnt from result_image_master
where RSLT_IMAGE_ID = :new.RSLT_IMAGE_ID;
--select count(1) into v_cnt from result_image_master
-- where ACC_BLKBR_ID = :new.ACC_BLKBR_ID
-- and upper(RSLT_IMAGE_NM) = upper(:new.RSLT_IMAGE_NM);
select count(1) into v_cnt_old from result_image_master
where RSLT_IMAGE_ID = :old.RSLT_IMAGE_ID;
insert into t2( TEXT_VAL, DT1, seq1)
values (' before v_cnt', sysdate, t6.NEXTVAL);
--if v_cnt = 0
--****INSERTING
IF INSERTING
THEN
insert into t2( TEXT_VAL, DT1, seq1)
values (' v_cnt is 0 and inserting into result_image_master', sysdate, t6.NEXTVAL);
insert into t2( TEXT_VAL, DT1, seq1)
values (' inserted bb id :'||:new.ACC_BLKBR_ID, sysdate, t6.NEXTVAL);
insert into result_image_master (
RSLT_IMAGE_ID
,RSLT_IMAGE_HBR_VER
,RSLT_IMAGE_TYPE_ID
,RSLT_IMAGE_NM
,RSLT_IMAGE_LABEL
,RSLT_IMAGE_SEQ
,RSLT_SHOW_ON_RPT
,RSLT_SLIDE_NO
,RSLT_CELL_NO
,RSLT_X_COORD
,RSLT_Y_COORD
,ACC_BLKBR_ID
,CREATED_BY
,DATE_CREATED
,MODIFIED_BY
,DATE_MODIFIED
values (
:new.RSLT_IMAGE_ID
,:new.RSLT_IMAGE_HBR_VER
,:new.RSLT_IMAGE_TYPE_ID
,:new.RSLT_IMAGE_NM
,:new.RSLT_IMAGE_LABEL
,:new.RSLT_IMAGE_SEQ
,:new.RSLT_SHOW_ON_RPT
,:new.RSLT_SLIDE_NO
,:new.RSLT_CELL_NO
,:new.RSLT_X_COORD
,:new.RSLT_Y_COORD
,:new.ACC_BLKBR_ID
,:new.CREATED_BY
,:new.DATE_CREATED
,:new.MODIFIED_BY
,:new.DATE_MODIFIED
insert into result_image_blob (
RSLT_IMAGE_ID
,rslt_image_blob
values (
:new.RSLT_IMAGE_ID
,:new.rslt_image_blob
--****UPDATING
ELSIF UPDATING
-- v_cnt > 0 --
THEN
insert into t2( TEXT_VAL, DT1, seq1)
values (' updating result_image_master', sysdate, t6.nextval);
insert into t2( TEXT_VAL, DT1, seq1)
values (' updating bb id :'||:new.ACC_BLKBR_ID, sysdate, t6.nextval);
update result_image_master
set RSLT_IMAGE_HBR_VER = RSLT_IMAGE_HBR_VER + 1
,RSLT_IMAGE_TYPE_ID = :new.RSLT_IMAGE_TYPE_ID
,RSLT_IMAGE_NM = :new.RSLT_IMAGE_NM
,RSLT_IMAGE_LABEL = :new.RSLT_IMAGE_LABEL
,RSLT_IMAGE_SEQ = :new.RSLT_IMAGE_SEQ
,RSLT_SHOW_ON_RPT = :new.RSLT_SHOW_ON_RPT
,RSLT_SLIDE_NO = :new.RSLT_SLIDE_NO
,RSLT_CELL_NO = :new.RSLT_CELL_NO
,RSLT_X_COORD = :new.RSLT_X_COORD
,RSLT_Y_COORD = :new.RSLT_Y_COORD
,ACC_BLKBR_ID = :new.ACC_BLKBR_ID
,MODIFIED_BY = :new.MODIFIED_BY
,DATE_MODIFIED = :new.DATE_MODIFIED
where RSLT_IMAGE_ID = :new.RSLT_IMAGE_ID;
update result_image_blob
set rslt_image_blob = :new.rslt_image_blob
where RSLT_IMAGE_ID = :new.RSLT_IMAGE_ID;
END IF;
IF DELETING OR v_cnt_old > 0
THEN
insert into t2( TEXT_VAL, DT1, seq1) values (' deleting rows ...', sysdate, t6.NEXTVAL);
DELETE from result_image_blob where RSLT_IMAGE_ID = :old.RSLT_IMAGE_ID;
insert into t2( TEXT_VAL, DT1, seq1) values ('deleting result_image_blob : '||:old.RSLT_IMAGE_ID , sysdate, t6.NEXTVAL);
DELETE from result_image_master where RSLT_IMAGE_ID = :old.RSLT_IMAGE_ID;
insert into t2( TEXT_VAL, DT1, seq1) values ('deleting result_image_master : '||:old.RSLT_IMAGE_ID , sysdate, t6.NEXTVAL);
END IF;
EXCEPTION
WHEN OTHERS THEN
v_err_msg := SQLERRM;
insert into t2( TEXT_VAL, DT1, seq1) values (v_err_msg, sysdate, t6.nextval);
END;
Edited by: bhanujh on Sep 13, 2010 7:55 AMbhanujh wrote:
The error msg that we are getting is
09/08/2010 4:02:09 PM: Unable to save the results :: Could not execute JDBC batch updateSorry, we don't recognize this message as any valid Oracle error.
:p -
View-Update in forms with Instead-Of trigger
I has created a view and an Instead-Of trigger on that view.
Now, I want to update this view in FORMS 6. I am unable to update this view and getting error FRM-40602.
Is there any way to update this view updatable in FORMS6 or FORMS6 has not this feature?Hi,
This has been acknowledged by Oracle as bug earlier. The work-around for this is as follows:
1. Create table 1
2. Create table 2
3. Create view
4. Create instead of insert trigger on view
5. Create instead of update trigger on view
6. Now, in the forms, go to the Block property
7. Look for the 'Key mode' property. By default it is 'Automatic'. Set it to Updateable (If your database design supports updating primary keys) or Unique (preferable).
8. Now run the form. It should work.
All the best.
Sunil Kumar G S -
Big Problem with Instead Of Trigger
I have following problem: I created my own user-table where I want to store some
attributes like user-foto etc... This table I join with the HTMLDB
wwv_flow_fnd_user (I gave myself the select grant on it) in a view
On the view I created an INSTEAD-OF-Trigger for DELETE-Operations where I delete
only my user-table. But when I execute it it gives me an
ORA-01031: insufficient privileges
I can not understand it.
<pre>
===========================================================
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 27 05:28:13 2005
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> DROP TABLE my_users
2 ;
Table dropped.
SQL> CREATE TABLE my_users AS
2 SELECT user_id
3 FROM flows_020000.wwv_flow_fnd_user
4 ;
Table created.
SQL> ALTER TABLE my_users ADD my_attr VARCHAR2(10);
Table altered.
SQL> ALTER TABLE my_users ADD CONSTRAINT pk_my_users PRIMARY KEY( user_id );
Table altered.
SQL> CREATE OR REPLACE VIEW v_my_users
2 AS
3 SELECT u2.user_id,
4 u.user_name,
5 u.first_name,
6 u.last_name,
7 u2.my_attr
8 FROM flows_020000.wwv_flow_fnd_user u,
9 my_users u2
10 WHERE u2.user_id = u.user_id
11 ;
View created.
SQL> CREATE OR REPLACE TRIGGER trg_del_v_my_users
2 INSTEAD OF DELETE ON v_my_users
3 FOR EACH ROW
4 BEGIN
5 DELETE my_users
6 WHERE user_id = :OLD.user_id
7 ;
8 END;
9 /
Trigger created.
SQL> DELETE v_my_users WHERE 1=2
2 ;
DELETE v_my_users WHERE 1=2
ERROR at line 1:
ORA-01031: insufficient privileges
===========================================================
</pre>
And: If there is no PK on table my_users I got not error!
Can anybody explain it?
And: How can I include my listings in the forum with courier font?Is the primary key in this table referencing any table(s) in other schema? How should this work?
Look at the script above:
ALTER TABLE my_users ADD CONSTRAINT pk_my_users PRIMARY KEY( user_id );
Bye,
Rumburak -
BULK INSERT into View w/ Instead Of Trigger - DML ERROR LOGGING Issue
Oracle 10.2.0.4
I cannot figure out why I cannot get bulk insert errors to aggregate and allow the insert to continue when bulk inserting into a view with an Instead of Trigger. Whether I use LOG ERRORS clause or I use SQL%BULK_EXCEPTIONS, the insert works until it hits the first exception and then exits.
Here's what I'm doing:
1. I'm bulk inserting into a view with an Instead of Trigger on it that performs the actual updating on the underlying table. This table is a child table with a foreign key constraint to a reference table containing the primary key. In the Instead of Trigger, it attempts to insert a record into the child table and I get the following exception: +5:37:55 ORA-02291: integrity constraint (FK_TEST_TABLE) violated - parent key not found+, which is expected, but the error should be logged in the table and the rest of the inserts should complete. Instead the bulk insert exits.
2. If I change this to bulk insert into the underlying table directly, it works, all errors get put into the error logging table and the insert completes all non-exception records.
Here's the "test" procedure I created to test my scenario:
View: V_TEST_TABLE
Underlying Table: TEST_TABLE
PROCEDURE BulkTest
IS
TYPE remDataType IS TABLE of v_TEST_TABLE%ROWTYPE INDEX BY BINARY_INTEGER;
varRemData remDataType;
begin
select /*+ DRIVING_SITE(r)*/ *
BULK COLLECT INTO varRemData
from TEST_TABLE@REMOTE_LINK
where effectiveday < to_date('06/16/2012 04','mm/dd/yyyy hh24')
and terminationday > to_date('06/14/2012 04','mm/dd/yyyy hh24');
BEGIN
FORALL idx IN varRemData.FIRST .. varRemData.LAST
INSERT INTO v_TEST_TABLE VALUES varRemData(idx) LOG ERRORS INTO dbcompare.ERR$_TEST_TABLE ('INSERT') REJECT LIMIT UNLIMITED;
EXCEPTION WHEN others THEN
DBMS_OUTPUT.put_line('ErrorCode: '||SQLCODE);
END;
COMMIT;
end;
I've reviewed Oracle's documentation on both DML logging tools and neither has any restrictions (at least that I can see) that would prevent this from working correctly.
Any help would be appreciated....
Thanks,
SteveThanks, obviously this is my first post, I'm desperate to figure out why this won't work....
This code I sent is only a test proc to try and troubleshoot the issue, the others with the debug statement is only to capture the insert failing and not aggregating the errors, that won't be in the real proc.....
Thanks,
Steve -
Storing XML using XSU, object VIEW and INSTEAD OF trigger
Here is the point:
I've got 2 tables which are linked:
CREATE TABLE dept (
deptno NUMBER PRIMARY KEY,
deptname VARCHAR2(20)
CREATE TABLE emp (
empno NUMBER PRIMARY KEY,
empname VARCHAR2(20),
deptno NUMBER REFERENCES dept(deptno)
I've got the following message, which I want to insert in the tables using XSU (I already have a PL/SQL stored procedure which work perfectly for insertion into 1 table, using DBMS_XMLSave.insertXML or xmlgen.insertXML):
<DEPT>
<DEPTNO>10</DEPTNO>
<DEPTNAME>IT</DEPTNAME>
<EMP>
<EMPNO>1</EMPNO>
<EMPNAME>John</EMPNAME>
</EMP>
<EMP>
<EMPNO>1</EMPNO>
<EMPNAME>Phil</EMPNAME>
</EMP>
</DEPT>
So I've created the following object:
CREATE TYPE emp_t AS OBJECT
empno NUMBER,
empname VARCHAR2(20)
CREATE TYPE emplist_t AS TABLE OF emp_t;
CREATE TYPE dept_t AS OBJECT
deptno NUMBER,
deptname VARCHAR2(20),
emplist emplist_t
Now I understand that I should create an object VIEW and an INSTEAD OF trigger (That's what I read many times),
but I don't know how to structure the view and the trigger.
Could you help? (Example of a similar context, piece of code)
Thanks a lot
MarionHi John,
I have exactly the same issue as you experienced back in January. I have a complex data modelling requirement which requires the need to pivot rows into columns using ROW_NUMBER() and PARTITION clauses. To hide the complexity from the middle tier, I have created a database view and appropriate INSTEAD OF triggers and mapped my EO to the view. I have overriden the lock() method on the EO implementation class (to avoid ORA-02014) and would like to try the same solution you used with the pl/sql call to lock the record.
My question is, how did you manage the release of the lock if the transaction was not rolled back or committed by your application i.e. if the user closed the browser for instance.
In my naivity, I would like to think that the BC4J framework would release any locks for the database session when it found the servlet session to be terminated however my concern is that the lock would persist and cause complications.
Any assistance greatly appreciated (if you would be willing to supply your lock() method and pl/sql procedure logic I would be even more grateful!).
Many thanks,
Dave
London -
Hi !
In my application I have two tables
tabA(col_A1,col_A2,col_A3) and tabB(col_B1,col_B2)I created a view
CREATE OR REPLACE VIEW vt
AS SELECT col_A1, col_A2, col_A3, col_B1, col_B2
FROM tabA A
LEFT OUTER JOIN tabB B
ON ( A.ol_Achar = B.col_Bchar
OR 'A'||A.ol_Achar = B.col_Bchar ); and an instead of trigger
CREATE OR REPLACE TRIGGER vt_upd
INSTEAD OF UPDATE ON vt
BEGIN
UPDATE tabA
SET col_A3 = :NEW.col_A3
WHERE col_A1 = :NEW.col_A1;
END;
/And now there are very strange behaviours on an update statement I've tried:
UPDATE vt SET col_A3=1 where col_A1=2;1.) If I try it on an Oracle instance version 10.2.0.1.0 it's OK, the update (and hence the instead of triggers) does the right thing.
2.) If I try it on an Oracle instance version 9.2.0.7.0 I get an error:
ORA-01031: insufficient privileges3.) If I change the the definition to:
CREATE OR REPLACE VIEW vt
AS SELECT col_A1, col_A2, col_A3, col_B1, col_B2
FROM tabA A
LEFT OUTER JOIN tabB B
ON A.ol_Achar = B.col_Bchar;the update will work on 9.2.0.7.0 as well.
Any idea why there are such troubles ?
Thanks for any help,
HeinzDon't have 9.2.0.7 at hand and your view definition is a bit screwed. But what I tried was
michaels> create table taba(col_a1 varchar2(5),col_a2 varchar2(5),col_a3 varchar2(5))
Table created.
michaels> create table tabb(col_b1 varchar2(5),col_b2 varchar2(5))
Table created.
michaels> create or replace view vt
as
select col_a1, col_a2, col_a3, col_b1, col_b2
from taba a left outer join tabb b
on (a.col_a1 = b.col_b1 or 'A' || a.col_a2 = b.col_b2)
View created.
michaels> create or replace trigger vt_upd
instead of update
on vt
begin
update taba
set col_a3 = :new.col_a3
where col_a1 = :new.col_a1;
end vt_upd;
Trigger created.
michaels> update vt
set col_a3 = 1
where col_a1 = 2
0 rows updated.
michaels> select * from v$version
BANNER
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
PL/SQL Release 9.2.0.8.0 - Production
CORE 9.2.0.8.0 Production
TNS for HPUX: Version 9.2.0.8.0 - Production
NLSRTL Version 9.2.0.8.0 - Production Maybe time to upgrade? -
BUG? VIEWS with INSTEAD OF triggers are updatable????
When I try to update the view created with the PL/SQL code from
below, with an infobus data form generated by JDev wizards , i
ontain this error "ORA-22816: unsupported feature with RETURNING
clause"
Below this text are an plus80 sql text file, producing the same
error and creating the database environment required.
It creates :
.-2 tables,
.-2 sequences
.-a joined view of this 2 tables
.-an "instead of insert" trigger on the view
Demostrating the correctness of this code there are a
normal insert alone, and a pl/sql block producing the same kind
error from plus80.
If you generate the form to edit this view, it produces the same
error when trying to do an insert, that the error produced by
this sql file.
--------------------------------------------cut here
drop sequence suf_seq;
CREATE SEQUENCE SUF_SEQ
NOMAXVALUE
NOMINVALUE
NOCYCLE
NOCACHE
drop sequence fam_seq;
CREATE SEQUENCE FAM_SEQ
NOMAXVALUE
NOMINVALUE
NOCYCLE
NOCACHE
DROP TABLE SUBFAMILIAS CASCADE CONSTRAINTS;
CREATE TABLE FAMILIAS
(ID NUMBER(6,0) NOT NULL
,DESCRIPCION VARCHAR2(50) NOT NULL
,ACTIVO NUMBER(38)
,USERALTA VARCHAR2(15)
,FECHAALTA DATE
,USERMOD VARCHAR2(15)
,FECHAMOD DATE
DROP TABLE FAMILIAS CASCADE CONSTRAINTS;
CREATE TABLE SUBFAMILIAS
(ID NUMBER(6,0) NOT NULL
,FAM_ID NUMBER(6,0)
,DESCRIPCION VARCHAR2(50) NOT NULL
,ACTIVO NUMBER(38)
,USERALTA VARCHAR2(15)
,FECHAALTA DATE
,USERMOD VARCHAR2(15)
,FECHAMOD DATE
set serveroutput on;
create or replace view test ( fam_id , suf_id , fam_descripcion
,suf_descripcion) as
Select fam.id,suf.id,fam.descripcion,suf.descripcion
from familias fam,subfamilias suf
where fam.id=suf.fam_id;
CREATE OR REPLACE TRIGGER test_insert
INSTEAD OF INSERT
ON test
declare
auxFam_Id familias.id%type;
auxSuf_Id subfamilias.id%type;
begin
select fam_seq.nextval,suf_seq.nextval into
auxFam_id,auxSuf_id from dual;
insert into familias(id,descripcion) values
(auxFam_id,:NEW.fam_descripcion);
insert into subfamilias(id,fam_id,descripcion)
values(auxSuf_Id,auxFam_id,:NEW.suf_descripcion);
end;
show errors;
/* here is a non returning insert everything works ok */
insert into test(fam_descripcion,suf_descripcion) values
('familia test 1','subfamilia test1');
declare
aux RowId;
-- aux subfamilias.id%type;
begin
insert into test(fam_descripcion,suf_descripcion) values
('Familia test 2','Subfamilia test 2') returning RowId into aux;
dbms_output.put_line(aux);
--select * from subfamilias;
--delete from subfamilias;
end;
-------------------------cut here
nullAre INSTEAD OF triggers the only way to insert/update
information from a form using a view that combines
fields from two different tables? My goal is to try
to get away from using so many triggers and contain
as much as I can within HTML DB. Is this really the
only way?While you might be intimidated by the seeming complexity of an instead-of trigger, in the long run you'll be glad to dug in and did it the right way. The instead-of trigger is a thing of beauty where databases are concerned.
One thing to be careful about: when you attach a trigger to a view and recompile the view, if it has 'CREATE OR REPLACE' in the definition, any triggers defined for the view will be lost. All your hard work creating that elegant trigger could be gone in a keystroke.
Either use 'CREATE' without the 'OR REPLACE' or save a copy in your script repository or someplace safe so you can recreate it the event that it 'goes away' unexpectedly.
As always, this is only my experience. Your mileage may vary. Perhaps you're smarter than me and have a nice trick you'd like to share for preserving such things in a more elegant way??
Earl
Maybe you are looking for
-
Replication of Materials and services from R/3 to SRM
Hello, I would like to get some advice about replicating materials and services from R/3 46C to SRM 5.0. I replicated the objects succesfully in Development and the Test environment but now i have to do it in a Productive environment. We use about 40
-
Can not login the WebCenter Discussions Admin console
Hi I have installed the oracle web center 11.1.1.2 and 11.1.1.3 patch and have the weblgic admin/wls_services server running successfully. after create two new users in the embed weblogic i can login the webcenter discussion. The two test users can p
-
Migration Assistant not working with OS X Lion via Wireless Network?
Anybody know how to assist me here? Basically, I have two iMacs on seperate floors of my home. They are newer models (both purchased last year) and I have upgraded both of them to Lion and just ran a system update on both of them to ensure they are
-
Photoshop CS6. Save for Web Problem - Don't remember folder location
Hi! Found one more problem with Save For Web in Photoshop CS6. Example: 1. New Document 2. Choose - Save for web 3. In dialog window Photoshop CS6 offer to save in - os My Document Folder 4. Ok, every time I don't really need to save in os folders -
-
Good Morning. I've got a question on how to combine subnets. I have 3 small closed networks, all utilzing a ip range of 192.168.1.xxx These networks have no "outside" connectivity to the world and are located in 3 seperate physical locations. To allo