Using user_tab_columns on the trigger
dear all
i need to use user_tab_columns on the trigger before delete
like ex
SELECT a.column_name
INTO l_col_name
FROM user_tab_columns a
WHERE a.table_name = 'EMPLOYEE' AND a.nullable = 'N';
this is not work because the query not retrieve column name but emp_no is not null , if any suggestion to solve this issue?
i need to use user_tab_columns on the trigger before
delete And what business case you are trying to solve?
Gints Plivna
http://www.gplivna.eu
Similar Messages
-
Error in Forms while creating the trigger- WHEN-CREATE-RECORD
Hello,
Right now I am using 11g client side and 10g database.
I am constantly getting an error while creating triggers in 11g.
I have created a sequence in SQL developer using the following code:
create sequence loc_id_sequence
start with 14;
After creating the sequence. I am trying to write the PL/SQL code in forms builder for the trigger WHEN-CREATE-RECORD
declare
loc_id number;
begin
loc_id := loc_id_sequence.nextval;
end;
But I have been getting the following error constantly. Can anyone please help me?
"Error 0 at line 5, column 4
SQL statement ignored".
Can anyone please tell me why I am getting that errorIn fact, even I thought there might be some problem with the connectivity with the 10g database and 11g client but the other DB related code works.
I just have the problem with using sequence for the trigger WHEN-CREATE-RECORD.
In fact I also tried using WHEN-NEW-RECORD-INSTANCE smart trigger instead of WHEN-CREATE-RECORD for the same sequence. But even that doesn't work.
Do u have any idea of what that error means?
"Error 0 at line 5, column 4
SQL statement ignored"
Edited by: Pooja 1985 on Feb 26, 2013 5:43 PM
Edited by: Pooja 1985 on Feb 26, 2013 5:44 PM -
Using PFI0 as a trigger and PFI1 as an input on PCI-5114
Hi,
I have a NI-5114, and I'm currently using PFI0 as the trigger, and reading out the two analog channels. I'd like to add a second digital input through the other PFI so I can simply test if something is on or off (already a digital signal). So, when PFI0 triggers, it digitizes the two inputs and reads whether or not PFI1 is on or off (no timing necessary). Is there a trick to get this done?
Thanks,
KarlHello Karl,
Since the PFI lines are generally used as triggers, we cannot read a PFI line unless you are specifically triggering off it. What you could do is as soon as you receive a trigger you can export a trigger of PFI1 which you could connect to one input of an external AND gate and second one is the signal you want to monitor. or can use another DIO DAQ device like USB-6501 to monitor the status of external digital signal.
Good Luck
NI-khil -
How to use ABAP Webservice to Trigger the start of BPMN
Hello,
My scenario is that i define a webservice in the SAP ECC system and import it in the process composer as the service interface. As to the start event, i set the above service interface and operation as the trigger service.
After then, i call this webservice in the user exit of a T-Code. However, the BPMN is not started by this webservice call.
Anyone can explain on this and tell me how to use the ABAP webservice as the starting event service interface?
Thanks in advance
ErickHi Erick,
When you develop a process model and use some arbitrary service interface in the message start event then this will be exposed on the Java / BPM system you deploed the process definition on.
That allows you to start the process via this web service once you know its endpoint.
So in case you want to start your process from the ABAP side you would need to call this endpoint on the Java side out of your ABAP system.
Simply calling the web service / code on your ABAP system and hoping that this will also invoke the Java stack won't work I AFAIK.
Best regards,
Martin -
i am using PCI-6033E IO card and i would like to send 5 volts (high logic ) to the trigger box. the trigger box will trigger the frame grabber card, that i am using for image acquisition.
Hello;
The first thing you need to figure out is the shape of the trigger pulse needed.
In case you just need a logic high TTL pulse, you can use one of the digital lines of your DAQ device.
In case you need a pulse train (multiple trigger pulses), you will need to configure one of the general purpose counters to accomplish that task.
You can find examples in both Labview and NI-DAQ showing how to program your DAQ board to accomplish both approaches.
Hope this helps.
Filipe A.
Applications Engineer
National Instruments -
Stop one Daq but without use the trigger
Hello everybody,
I have one while loop and in it I have my DAQ, one time I have start with the Data Aquisition I need stop it and re-configure it again, but it is indepently of the trigger and I can't stop the while loop either.
Is there some path to do it??
Thanks
Gonzalo De FranciscoDear Gonzalo
You are talking about pausing a while loop, right? If so, this post http://forums.ni.com/ni/board/message?board.id=170&message.id=10689&requireLogin=False could be helpful.
Best regards
Philipp Roessler -
How to get the table name in the trigger definition without hard coding.
CREATE TRIGGER db.mytablename
AFTER UPDATE,INSERT
AS
INSERT INTO table1(col1)
SELECT InsRec.col1
FROM
INSERTED Ins
--Below i am calling one sp for which i have to pass the table name
EXEC myspname 'tablename'
In the above trigger,presently i am hard coding the tablename
but is it possible to get the table name dynamically on which the trigger is defined in order to avoid hard coding the table nameI really liked your audit table concept. You inspired me to modify it so that, the entire recordset gets captured and added a couple of other fields. Wanted to share my end result.
USE [YourDB]
GO
/****** Object: Trigger [dbo].[iudt_AutoAuditChanges] Script Date: 10/18/2013 12:49:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[iudt_AutoAuditChanges]
ON [dbo].[YourTable]
AFTER INSERT,DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;
Declare @v_AuditID bigint
IF OBJECT_ID('dbo.AutoAudit','U') IS NULL BEGIN
CREATE TABLE [dbo].[AutoAudit]
( [AuditID] bigint identity,
[AuditDate] DateTime,
[AuditUserName] varchar(128),
[TableName] varchar(128) NULL,
[OldContent] XML NULL,
[NewContent] XML NULL
ALTER TABLE dbo.AutoAudit ADD CONSTRAINT
PK_AutoAudit PRIMARY KEY CLUSTERED
[AuditID]
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [idx_AutoAudit_TableName_AuditDate] ON [dbo].[AutoAudit]
( [TableName] ASC,
[AuditDate] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
END
Select * Into #AuditDeleted from deleted
Select * Into #AuditInserted from inserted
While (Select COUNT(*) from #AuditDeleted) > 0 OR (Select COUNT(*) from #AuditInserted) > 0
Begin
INSERT INTO [dbo].[AutoAudit]
( [AuditDate], [AuditUserName], [TableName], [OldContent], [NewContent])
SELECT
GETDATE(),
SUSER_NAME(),
[TableName]=object_name([parent_obj]),
[OldContent]=CAST((SELECT TOP 1 * FROM #AuditDeleted D FOR XML RAW) AS XML),
[NewContent]=CAST((SELECT TOP 1 * FROM #AuditInserted I FOR XML RAW) AS XML)
FROM sysobjects
WHERE
[xtype] = 'tr'
and [name] = OBJECT_NAME(@@PROCID)
Set @v_AuditID = SCOPE_IDENTITY()
Delete from AutoAudit
Where AuditID = @v_AuditID
AND Convert(varchar(max),oldContent) = Convert(varchar(max),NewContent)
Delete top(1) from #AuditDeleted
Delete top(1) from #AuditInserted
End
END -
Hi all,
I have a performance issue in the below code,where i am trying to insert the data from table_stg into target_tab and in parent_tab tables and then to child tables via cursor with bulk collect .the target_tab and parent_tab are huge tables and have a row wise trigger enabled on it .the trigger is mandatory . This timetaken for this block to execute is 5000 seconds.Now my requirement is to reduce it to 5 to 10 mins.
can someone please guide me here.Its bit urgent .Awaiting for your response.
declare
vmax_Value NUMBER(5);
vcnt number(10);
id_val number(20);
pc_id number(15);
vtable_nm VARCHAR2(100);
vstep_no VARCHAR2(10);
vsql_code VARCHAR2(10);
vsql_errm varchar2(200);
vtarget_starttime timestamp;
limit_in number :=10000;
idx number(10);
cursor stg_cursor is
select
DESCRIPTION,
SORT_CODE,
ACCOUNT_NUMBER,
to_number(to_char(CORRESPONDENCE_DATE,'DD')) crr_day,
to_char(CORRESPONDENCE_DATE,'MONTH') crr_month,
to_number(substr(to_char(CORRESPONDENCE_DATE,'DD-MON-YYYY'),8,4)) crr_year,
PARTY_ID,
GUID,
PAPERLESS_REF_IND,
PRODUCT_TYPE,
PRODUCT_BRAND,
PRODUCT_HELD_ID,
NOTIFICATION_PREF,
UNREAD_CORRES_PERIOD,
EMAIL_ID,
MOBILE_NUMBER,
TITLE,
SURNAME,
POSTCODE,
EVENT_TYPE,
PRIORITY_IND,
SUBJECT,
EXT_PRD_ID_TX,
EXT_PRD_HLD_ID_TX,
EXT_SYS_ID,
EXT_PTY_ID_TX,
ACCOUNT_TYPE_CD,
COM_PFR_TYP_TX,
COM_PFR_OPT_TX,
COM_PFR_RSN_CD
from table_stg;
type rec_type is table of stg_rec_type index by pls_integer;
v_rt_all_cols rec_type;
BEGIN
vstep_no := '0';
vmax_value := 0;
vtarget_starttime := systimestamp;
id_val := 0;
pc_id := 0;
success_flag := 0;
vstep_no := '1';
vtable_nm := 'before cursor';
OPEN stg_cursor;
vstep_no := '2';
vtable_nm := 'After cursor';
LOOP
vstep_no := '3';
vtable_nm := 'before fetch';
--loop
FETCH stg_cursor BULK COLLECT INTO v_rt_all_cols LIMIT limit_in;
vstep_no := '4';
vtable_nm := 'after fetch';
--EXIT WHEN v_rt_all_cols.COUNT = 0;
EXIT WHEN stg_cursor%NOTFOUND;
FOR i IN 1 .. v_rt_all_cols.COUNT
LOOP
dbms_output.put_line(upper(v_rt_all_cols(i).event_type));
if (upper(v_rt_all_cols(i).event_type) = upper('System_enforced')) then
vstep_no := '4.1';
vtable_nm := 'before seq sel';
select PC_SEQ.nextval into pc_id from dual;
vstep_no := '4.2';
vtable_nm := 'before insert corres';
INSERT INTO target1_tab
(ID,
PARTY_ID,
PRODUCT_BRAND,
SORT_CODE,
ACCOUNT_NUMBER,
EXT_PRD_ID_TX,
EXT_PRD_HLD_ID_TX,
EXT_SYS_ID,
EXT_PTY_ID_TX,
ACCOUNT_TYPE_CD,
COM_PFR_TYP_TX,
COM_PFR_OPT_TX,
COM_PFR_RSN_CD,
status)
VALUES
(pc_id,
v_rt_all_cols(i).party_id,
decode(v_rt_all_cols(i).product_brand,'LTB',2,'HLX',1,'HAL',1,'BOS',3,'VER',4,0),
v_rt_all_cols(i).sort_code,
'XXXX'||substr(trim(v_rt_all_cols(i).ACCOUNT_NUMBER),length(trim(v_rt_all_cols(i).ACCOUNT_NUMBER))-3,4),
v_rt_all_cols(i).EXT_PRD_ID_TX,
v_rt_all_cols(i).EXT_PRD_HLD_ID_TX,
v_rt_all_cols(i).EXT_SYS_ID,
v_rt_all_cols(i).EXT_PTY_ID_TX,
v_rt_all_cols(i).ACCOUNT_TYPE_CD,
v_rt_all_cols(i).COM_PFR_TYP_TX,
v_rt_all_cols(i).COM_PFR_OPT_TX,
v_rt_all_cols(i).COM_PFR_RSN_CD,
NULL);
vstep_no := '4.3';
vtable_nm := 'after insert corres';
else
select COM_SEQ.nextval into id_val from dual;
vstep_no := '6';
vtable_nm := 'before insertcomm';
if (upper(v_rt_all_cols(i).event_type) = upper('REMINDER')) then
vstep_no := '6.01';
vtable_nm := 'after if insertcomm';
insert into parent_tab
(ID ,
CTEM_CODE,
CHA_CODE,
CT_CODE,
CONTACT_POINT_ID,
SOURCE,
RECEIVED_DATE,
SEND_DATE,
RETRY_COUNT)
values
(id_val,
lower(v_rt_all_cols(i).event_type),
decode(v_rt_all_cols(i).product_brand,'LTB',2,'HLX',1,'HAL',1,'BOS',3,'VER',4,0),
'Email',
v_rt_all_cols(i).email_id,
'IADAREMINDER',
systimestamp,
systimestamp,
0);
else
vstep_no := '6.02';
vtable_nm := 'after else insertcomm';
insert into parent_tab
(ID ,
CTEM_CODE,
CHA_CODE,
CT_CODE,
CONTACT_POINT_ID,
SOURCE,
RECEIVED_DATE,
SEND_DATE,
RETRY_COUNT)
values
(id_val,
lower(v_rt_all_cols(i).event_type),
decode(v_rt_all_cols(i).product_brand,'LTB',2,'HLX',1,'HAL',1,'BOS',3,'VER',4,0),
'Email',
v_rt_all_cols(i).email_id,
'CORRESPONDENCE',
systimestamp,
systimestamp,
0);
END if;
vstep_no := '6.11';
vtable_nm := 'before chop';
if (v_rt_all_cols(i).ACCOUNT_NUMBER is not null) then
v_rt_all_cols(i).ACCOUNT_NUMBER := 'XXXX'||substr(trim(v_rt_all_cols(i).ACCOUNT_NUMBER),length(trim(v_rt_all_cols(i).ACCOUNT_NUMBER))-3,4);
insert into child_tab
(COM_ID,
KEY,
VALUE)
values
(id_val,
'IB.Correspondence.AccountNumberMasked',
v_rt_all_cols(i).ACCOUNT_NUMBER);
end if;
vstep_no := '6.1';
vtable_nm := 'before stateday';
if (v_rt_all_cols(i).crr_day is not null) then
insert into child_tab
(COM_ID,
KEY,
VALUE)
values
(id_val,
--'IB.Correspondence.Date.Day',
'IB.Crsp.Date.Day',
v_rt_all_cols(i).crr_day);
end if;
vstep_no := '6.2';
vtable_nm := 'before statemth';
if (v_rt_all_cols(i).crr_month is not null) then
insert into child_tab
(COM_ID,
KEY,
VALUE)
values
(id_val,
--'IB.Correspondence.Date.Month',
'IB.Crsp.Date.Month',
v_rt_all_cols(i).crr_month);
end if;
vstep_no := '6.3';
vtable_nm := 'before stateyear';
if (v_rt_all_cols(i).crr_year is not null) then
insert into child_tab
(COM_ID,
KEY,
VALUE)
values
(id_val,
--'IB.Correspondence.Date.Year',
'IB.Crsp.Date.Year',
v_rt_all_cols(i).crr_year);
end if;
vstep_no := '7';
vtable_nm := 'before type';
if (v_rt_all_cols(i).product_type is not null) then
insert into child_tab
(COM_ID,
KEY,
VALUE)
values
(id_val,
'IB.Product.ProductName',
v_rt_all_cols(i).product_type);
end if;
vstep_no := '9';
vtable_nm := 'before title';
if (trim(v_rt_all_cols(i).title) is not null) then
insert into child_tab
(COM_ID,
KEY,
VALUE )
values
(id_val,
'IB.Customer.Title',
trim(v_rt_all_cols(i).title));
end if;
vstep_no := '10';
vtable_nm := 'before surname';
if (v_rt_all_cols(i).surname is not null) then
insert into child_tab
(COM_ID,
KEY,
VALUE)
values
(id_val,
'IB.Customer.LastName',
v_rt_all_cols(i).surname);
end if;
vstep_no := '12';
vtable_nm := 'before postcd';
if (trim(v_rt_all_cols(i).POSTCODE) is not null) then
insert into child_tab
(COM_ID,
KEY,
VALUE)
values
(id_val,
'IB.Customer.Addr.PostCodeMasked',
substr(replace(v_rt_all_cols(i).POSTCODE,' ',''),length(replace(v_rt_all_cols(i).POSTCODE,' ',''))-2,3));
end if;
vstep_no := '13';
vtable_nm := 'before subject';
if (trim(v_rt_all_cols(i).SUBJECT) is not null) then
insert into child_tab
(COM_ID,
KEY,
VALUE)
values
(id_val,
'IB.Correspondence.Subject',
v_rt_all_cols(i).subject);
end if;
vstep_no := '14';
vtable_nm := 'before inactivity';
if (trim(v_rt_all_cols(i).UNREAD_CORRES_PERIOD) is null or
trim(v_rt_all_cols(i).UNREAD_CORRES_PERIOD) = '3' or
trim(v_rt_all_cols(i).UNREAD_CORRES_PERIOD) = '6' or
trim(v_rt_all_cols(i).UNREAD_CORRES_PERIOD) = '9') then
insert into child_tab
(COM_ID,
KEY,
VALUE)
values
(id_val,
'IB.Correspondence.Inactivity',
v_rt_all_cols(i).UNREAD_CORRES_PERIOD);
end if;
vstep_no := '14.1';
vtable_nm := 'after notfound';
end if;
vstep_no := '15';
vtable_nm := 'after notfound';
END LOOP;
end loop;
vstep_no := '16';
vtable_nm := 'before closecur';
CLOSE stg_cursor;
vstep_no := '17';
vtable_nm := 'before commit';
DELETE FROM table_stg;
COMMIT;
vstep_no := '18';
vtable_nm := 'after commit';
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
success_flag := 1;
vsql_code := SQLCODE;
vsql_errm := SUBSTR(sqlerrm,1,200);
error_logging_pkg.inserterrorlog('samp',vsql_code,vsql_errm, vtable_nm,vstep_no);
RAISE_APPLICATION_ERROR (-20011, 'samp '||vstep_no||' SQLERRM:'||SQLERRM);
end;
ThanksIts bit urgent
NO - it is NOT urgent. Not to us.
If you have an urgent problem you need to hire a consultant.
I have a performance issue in the below code,
Maybe you do and maybe you don't. How are we to really know? You haven't posted ANYTHING indicating that a performance issue exists. Please read the FAQ for how to post a tuning request and the info you need to provide. First and foremost you have to post SOMETHING that actually shows that a performance issue exists. Troubleshooting requires FACTS not just a subjective opinion.
where i am trying to insert the data from table_stg into target_tab and in parent_tab tables and then to child tables via cursor with bulk collect .the target_tab and parent_tab are huge tables and have a row wise trigger enabled on it .the trigger is mandatory . This timetaken for this block to execute is 5000 seconds.Now my requirement is to reduce it to 5 to 10 mins.
Personally I think 5000 seconds (about 1 hr 20 minutes) is very fast for processing 800 trillion rows of data into parent and child tables. Why do you think that is slow?
Your code has several major flaws that need to be corrected before you can even determine what, if anything, needs to be tuned.
This code has the EXIT statement at the beginning of the loop instead of at the end
FETCH stg_cursor BULK COLLECT INTO v_rt_all_cols LIMIT limit_in;
vstep_no := '4';
vtable_nm := 'after fetch';
--EXIT WHEN v_rt_all_cols.COUNT = 0;
EXIT WHEN stg_cursor%NOTFOUND;
The correct place for the %NOTFOUND test when using BULK COLLECT is at the END of the loop; that is, the last statement in the loop.
You can use a COUNT test at the start of the loop but ironically you have commented it out and have now done it wrong. Either move the NOTFOUND test to the end of the loop or remove it and uncomment the COUNT test.
WHEN OTHERS THEN
ROLLBACK;
That basically says you don't even care what problem occurs or whether the problem is for a single record of your 10,000 in the collection. You pretty much just throw away any stack trace and substitute your own message.
Your code also has NO exception handling for any of the individual steps or blocks of code.
The code you posted also begs the question of why you are using NAME=VALUE pairs for child data rows? Why aren't you using a standard relational table for this data?
As others have noted you are using slow-by-slow (row by row processing). Let's assume that PL/SQL, the bulk collect and row-by-row is actually necessary.
Then you should be constructing the parent and child records into collections and then inserting them in BULK using FORALL.
1. Create a collection for the new parent rows
2. Create a collection for the new child rows
3. For each set of LIMIT source row data
a. empty the parent and child collections
b. populate those collections with new parent/child data
c. bulk insert the parent collection into the parent table
d. bulk insert the child collection into the child table
And unless you really want to either load EVERYTHING or abandon everything you should use bulk exception handling so that the clean data gets processed and only the dirty data gets rejected. -
Using a link to trigger a delete action on form page?
Hello,
I have been unable to find an explanation about how to do this in the documentation, these forums or the old interakt forums.
Is it possible to use a link to trigger the delete action on a form page?
If so how is it done?
Thanks in advance!Sorry Purple.. I know that there is a delete link that triggers the delete transaction on the form page..
The question was if anybody knew if I am able to use a link to trigger that delete transaction (on the form page), much like a dynamic list has a link that will trigger the delete transaction on the form page.
I don't want to use a dynamic list in this case though. :)
Thanks anyways,
Drew -
Error while deploying the trigger
Hi All,
In the trigger given below I want to append the data from all the table columns , to convert the numeric data to string i am using to_char function , but when i try to deploy the trigger i am getting the error.
What could be the problem here?
Is there any alternate way to achieve the same??
Trigger
==========================================================
create or replace trigger emp_delete
after delete
on emp
for each row
begin
insert into Event(EventId,TableName,Pkey,OldValues,NewValues,DateTime,ActionType) values
(My_Event_ID_Seq.NEXTVAL ,'emp','EMPNO',
TO_CHAR(:old.EMPNO) || TO_CHAR(:old.ENAME) ||
TO_CHAR(:old.JOB) || TO_CHAR(:old.MGR) ||
TO_CHAR(:old.HIREDATE) || TO_CHAR(:old.SAL) ||
TO_CHAR(:old.COMM) || TO_CHAR(:old.DEPTNO),
' ',SYSDATE,'D');
end;
Error
==========================================================
LINE/COL ERROR
3/2 PL/SQL: SQL Statement ignored
5/25 PLS-00307: too many declarations of 'TO_CHAR' match this call
SQL> help helpindex
SP2-0172: No HELP available.Check you proxy settings. Disable them in your deployment tool / JDeveloper
-
:NEW cannot be used in After Delete Trigger ?
Hi,
Is there any way to get the :NW.value in the After delete trigger for each row. My requirement is audit log of the end user DML operations along with user Name (HERE THE USER IS NOT THE ORACLE USER, BECAUSE OF THE LARGE NUMBER OF END USERS WE ARE MAINTAINING ONE TABLE TO CREATE USER NAME & PASSWORD, WHEN THE USER LOGIN TO ORACLE FORM SCREEN, ASSIGN THE USER NAME TO GLOBAL VARIABLE) & Action Date.
Here is my code for trigger - It is working fine with INSER & UPDATE but for DELETE User is NULL
CREATE OR REPLACE TRIGGER Tgr_stud_det
AFTER INSERT OR UPDATE OR DELETE ON student_details
FOR EACH ROW
DECLARE
BEGIN
IF Inserting THEN
-------------INSERT VALUE---------------
INSERT INTO Log_student_details
(Seq,
App_User,
Action,
Action_Date,
stud_name,
stud_age,
stud_sex)
VALUES
(stud_sequence.NEXTVAL,
:NEW.App_User,
'INSERT',
SYSDATE,
:NEW.stud_name,
:NEW.stud_age,
:NEW.stud_sex);
-------------DELETE VALUE---------------
ELSIF Deleting THEN
INSERT INTO Log_student_details
(Seq,
App_User,
Action,
Action_Date,
Comment_Up,
stud_name,
stud_age,
stud_sex)
VALUES
(stud_sequence.NEXTVAL,
:OLD.App_User,
'DELETE',
SYSDATE,
NULL,
:OLD.stud_name,
:OLD.stud_age,
:OLD.stud_sex);
ELSIF Updating THEN
-------------UPDATE VALUE---------------
INSERT INTO Log_student_details
(Seq,
App_User,
Action,
Action_Date,
Comment_Up,
stud_name,
stud_age,
stud_sex)
VALUES
(stud_sequence.NEXTVAL,
:NEW.App_User,
'UPDATE',
SYSDATE,
'NEW VALUE',
:NEW.stud_name,
:NEW.stud_age,
:NEW.stud_sex);
INSERT INTO Log_student_details
(Seq,
App_User,
Action,
Action_Date,
Comment_Up,
stud_name,
stud_age,
stud_sex)
VALUES
(stud_sequence.CURRVAL,
:NEW.App_User,
'UPDATE',
SYSDATE,
'OLD VALUE',
:OLD.stud_name,
:OLD.stud_age,
:OLD.stud_sex);
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END Tgr_stud_det;
Thanks in advance.Rizly,
As i mentioned in the above post, you should remove the references of :old and :new when you are trying to use the global variables. These values are only significant when you the talk about the record in the table.
For the scenario, you explained, your trigger would insert two records....The trigger would be fired twice.. once during the insert and once during the delete. The audit table will have two records indicating both the actions..
Take a look at this example below...I am artificially manufacturing a user id in the package test_pkg and using that in the insert trigger. As i explained above, you dont need the :old and :new references because the user id is not a column in the table . hence the :old and :new references have no relevance.
Also note that, for the delete, I use the :old value and for the insert, I use the :new value.
for update, I assume you want to store the old record and hence used :old (you can of course use :new too..technically.).
I don't have access to a forms environement, but the user id logic should be similar to what I described below.
sql> create table t(
2 id number,
3 name varchar2(20)
4 );
Table created.
sql> create table t_audit
2 ( id number,
3 name varchar2(20),
4 action varchar2(20),
5 user_id varchar2(20)
6 );
Table created.
sql> create or replace package test_pkg as
2 function get_user_id return varchar2;
3 end test_pkg;
4 /
Package created.
sql> create or replace package body test_pkg as
2 function get_user_id return varchar2 is
3 begin
4 return 'USER' || to_char(sysdate,'HH24:MI');
5 end get_user_id;
6 end test_pkg;
7 /
Package body created.
1 create or replace trigger trg_biud_t
2 before insert or update or delete on t
3 for each row
4 begin
5 if INSERTING then
6 insert into t_audit values (:new.id, :new.name, 'INSERT',test_pkg.get_user_i
7 elsif UPDATING then
8 insert into t_audit values (:old.id, :old.name, 'UPDATE',test_pkg.get_user_i
9 elsif DELETING then
10 insert into t_audit values (:old.id, :old.name, 'DELETE',test_pkg.get_user_i
11 end if;
12* end;
sql> /
Trigger created.
sql> select * from t;
no rows selected
sql> select * from t_audit;
no rows selected
sql> insert into t values (100, 'Rajesh');
1 row created.
sql> insert into t values (200,'Kumar');
1 row created.
sql> delete from t where id = 200;
1 row deleted.
sql> commit;
Commit complete.
sql> select * from t
2 /
ID NAME
100 Rajesh
sql> select * from t_audit;
ID NAME ACTION USER_ID
100 Rajesh INSERT USER15:36
200 Kumar INSERT USER15:36
200 Kumar DELETE USER15:37 -
Processing LONG RAW in the trigger
I'm currently using Oracle 7.3.4.x. I'd like to perform in the
update trigger of LONG RAW column the copy of that value to
another table. Since the :new and :old is prohibited in triggers
and you cannot defined variables as LONG RAW data type in the
trigger I couldn't work out any solution to this problem.
Any one get any idea how to do that?
Thanks,
Mariusz.Hi!
You will not be able to do "select * from ..." from a table with a LONG column. However you will be able to do a select successfully by using the individual column name(s). The other thing is, in order to see the full content of the LONG column you will have to do do "set long nnnnn" where nnnnn represents the maxumum length of the values in the LONG column.
Hope that helps.
null -
I am trying to get my vi to trigger, not sure where to add the trigger
I need a vi that can trigger using an analog rising edge (1V), then produces a square wave (any square wave will do for now), and then show the measurement of the waveform. Attached is the code that I have made so far. Not sure how to get a trigger attached, or where to place the trigger, onto what I have done so far. Another question is where to have it triggered from, do I need to add another generate waveform to produce the trigger signal?
Any help is appreciated!!
-ncm
Solved!
Go to Solution.
Attachments:
Generate and Read Waveform.vi 39 KBHi,
You can place a DAQmx start trigger VI in the code at the top, between the DAQmx Timing and DAQmx write VIs, and then set the trigger type to "Analog Edge" and specify the channel to trigger from (in this case I think you would use the APFI line on your card). Check out the 'Voltage - Continuous Output' Example' if you need help implementing this in code, that example covers analog output with different types of triggering in a setup similar to yours.
Matt Lee
National Instruments
Applications Engineer -
Using to pass the current user while creating a procedure
I have a .sql script that several people use to help set-up test beds but some users call the test procedures from a separate schema. The .sql creates a table (TABLE_A) and then a procedure that when run will create a trigger on a separate table (TABLE_B) that basically writes all info to TABLE_A. The problem is that if the .sql is run under schema SCOTT and then the procedure is run from schema JOE to create a trigger on JOE.TABLE_B, the trigger will try to write copy info to just TABLE_A instead of SCOTT.TABLE_A. My plan is to add a new input variable to the procedure for the schema where the procedure is located and set the default to the schema of the user running the .sql.
I can't seem to figure out how to call the current user and then pass it to a procedure as a DEFAULT input variable. Any help would be greatly appreciated.OK, sadly, that did not work. What that provided to me was user that runs the procedure. If I run it as SCOTT it gives me SCOTT, but if I run as JOE, it gives me JOE.
I created an example of what I am trying to do (it is all run in a .sql file). Let me know if this is a bad example....
CREATE TABLE TABLE_A (
tranid VARCHAR2(20) Primary Key,
db_user varchar2(100) not null,
old_val varchar2(100) not null,
create or replace PROCEDURE TestBuild(OWN2 IN VARCHAR2, TNAME2 IN VARCHAR2, LOC2 IN VARCHAR2) IS
OWN VARCHAR2(30);
TNAME VARCHAR2(30);
FNAME VARCHAR2(62);
UNAME VARCHAR2(62);
COL VARCHAR2(30);
ST CHAR;
CONS VARCHAR2(30);
BEGIN
OWN := UPPER(OWN2);
TNAME := UPPER(TNAME2);
FNAME := OWN||'.'||TNAME;
UNAME := OWN||'_'||TNAME;
FILE := SYS.UTL_FILE.FOPEN(LOC2,'TEST_Trig_'||UNAME||'.sql','w');
SYS.UTL_FILE.PUT_LINE(FILE,'-- Test trigger start');
SYS.UTL_FILE.PUT_LINE(FILE,'-- generated '||SYSDATE);
SYS.UTL_FILE.NEW_LINE(FILE,1);
-- The following trigger fires for EVERY row of each statement for
-- the specified table.
SYS.UTL_FILE.PUT_LINE(FILE,'CREATE OR REPLACE TRIGGER Test_trig_'||UNAME||' AFTER INSERT OR UPDATE OR DELETE ON '||FNAME||' ');
SYS.UTL_FILE.PUT_LINE(FILE,' REFERENCING NEW as n OLD as o FOR EACH ROW');
SYS.UTL_FILE.PUT_LINE(FILE,' DECLARE');
SYS.UTL_FILE.PUT_LINE(FILE,' dmltype CHAR(1);');
SYS.UTL_FILE.PUT_LINE(FILE,' tpid VARCHAR2(30);');
SYS.UTL_FILE.PUT_LINE(FILE,' BEGIN');
SYS.UTL_FILE.PUT_LINE(FILE,' tpid := SYS.DBMS_TRANSACTION.LOCAL_TRANSACTION_ID();');
SYS.UTL_FILE.PUT_LINE(FILE,' IF INSERTING THEN dmltype := ''I'';');
SYS.UTL_FILE.PUT_LINE(FILE,' ELSIF UPDATING THEN dmltype := ''U'';');
SYS.UTL_FILE.PUT_LINE(FILE,' ELSIF DELETING THEN dmltype := ''D'';');
SYS.UTL_FILE.PUT_LINE(FILE,' END IF;');
SYS.UTL_FILE.PUT_LINE(FILE,' BEGIN');
SYS.UTL_FILE.PUT_LINE(FILE,' INSERT INTO TABLE_A VALUES (tpid,User,:o.col1);');
SYS.UTL_FILE.PUT_LINE(FILE,' END IF;');
SYS.UTL_FILE.PUT_LINE(FILE,' EXCEPTION WHEN already_there THEN NULL;');
SYS.UTL_FILE.PUT_LINE(FILE,' END;');
SYS.UTL_FILE.PUT_LINE(FILE,' END;');
SYS.UTL_FILE.PUT_LINE(FILE,'/');
SYS.UTL_FILE.PUT_LINE(FILE,'show errors');
SYS.UTL_FILE.NEW_LINE(FILE,1);
SYS.UTL_FILE.FCLOSE_ALL;
dbms_output.put_line('Script for table ['||FNAME||'] created. Now run it in sqlplus. ');
END; -
Call a Form using Webutil from the Menu loose focus on the applet
Hello,
I have the following problem:
When calling a form using webutil from the menu the focus on the applet (I mean the Forms Application window) is lost and I have to click on the window to get back the focus on the application.
Any advice ?
Env: Forms 9i / Webutil 1.06
Rgds,
PhilippeTry to use the NO_HIDE parameter in the CALL_FORM() built-in.
Call_Form( 'the_form', NO_HIDE ) ;Or maybe, in the[b] When-New-Form-Instance trigger of the called form, return the focus to the calling form
Go_Form( Get_Application_Property( CALLING_FORM ) ) ;Francois
Maybe you are looking for
-
How do i get my file back when it seems to have been lost or replaced?
My Mac froze and then shut down so i started it up again to find my indesign file had been replaced with a much older file with practically no work on. I closed the document and tried opening it again but it now will just open as a much older file. I
-
Can't edit smart album in iPhoto '11
The help files for iPhoto say to select a smart album in the source list and then select it item 'edit smart album' in the file menu. But there is no such item in the File menu. When I right-click on the album, the option 'edit smart album' is dimme
-
Gst-register and gst-plugins-gnomevfs [Solved]
One of the dependencies for rhythmbox, gst-plugins-gnomevfs-0.8.10-1, causes gst-register to fail with message: (process:8613): libgnomevfs-WARNING **: Cannot load module `/opt/gnome/lib/gnome-vfs-2.0/modules/libhttp.so' (libdb-4.3.so: cannot open sh
-
Hi All, Thanks a lot for your support. I have trying to implement writeback feature in obiee. I am using SH schema. In the fact table sales I have created a column Sales_Quota with Char field size 5. Whenever I am trying to implement witeback then I
-
How do I upgrade CS5 12.0.5 to 12.1
I'm having trouble upgrading from CS5 64 bit 12.0.5 to 12.1. I have a current windows 7 OS. The downlod goes okay, then I unzip the files, stop the antivirus program, and click on the exe file as administrator... it all goes well, then after clicki