Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल पीएल/एसक्यूएल:ट्रिगर से पूरी पंक्ति को प्रक्रिया में अग्रेषित करना

अधिकांश मामलों में, पंक्ति में नए मानों को %ROWTYPE चर में निर्दिष्ट करने का एकमात्र तरीका प्रत्येक कॉलम को स्पष्ट रूप से असाइन करना होगा। कुछ इस तरह

CREATE OR REPLACE TRIGGER some_trigger_name
  BEFORE INSERT OR UPDATE ON some_table
  FOR EACH ROW
DECLARE
  l_row some_table%rowtype;
BEGIN
  l_row.column1 := :NEW.column1;
  l_row.column2 := :NEW.column2;
  ...
  l_row.columnN := :NEW.columnN;

  procedure1( l_row );
  procedure2( l_row );
  procedure3( l_row );
END;

यदि आपकी तालिका किसी वस्तु के आधार पर घोषित की जाती है, तो :NEW उस प्रकार की वस्तु होगी। तो अगर आपके पास एक टेबल है जैसे

CREATE OR REPLACE TYPE obj_foo 
    AS OBJECT (
      column1 NUMBER,
      column2 NUMBER,
      ...
      columnN NUMBER );

CREATE TABLE foo OF obj_foo;

तब आप उन प्रक्रियाओं की घोषणा कर सकते हैं जो OBJ_FOO . प्रकार के इनपुट पैरामीटर स्वीकार करती हैं और उन्हें सीधे अपने ट्रिगर से कॉल करें।

दुर्भाग्य से, INSERT/UPDATE थ्रेड के बाद तालिका से पंक्ति का चयन करने के बारे में अन्य धागे में सुझाव आम तौर पर काम नहीं करता है। यह आम तौर पर एक परिवर्तनशील तालिका अपवाद की ओर ले जाएगा।

  1  create table foo (
  2    col1 number,
  3    col2 number
  4* )
SQL> /

Table created.

SQL> create procedure foo_proc( p_foo in foo%rowtype )
  2  as
  3  begin
  4    dbms_output.put_line( 'In foo_proc' );
  5  end;
  6  /

Procedure created.

SQL> create or replace trigger trg_foo
  2    after insert or update on foo
  3    for each row
  4  declare
  5    l_row foo%rowtype;
  6  begin
  7    select *
  8      into l_row
  9      from foo
 10     where col1 = :new.col1;
 11    foo_proc( l_row );
 12  end;
 13  /

Trigger created.

SQL> insert into foo values( 1, 2 );
insert into foo values( 1, 2 )
            *
ERROR at line 1:
ORA-04091: table SCOTT.FOO is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.TRG_FOO", line 4
ORA-04088: error during execution of trigger 'SCOTT.TRG_FOO'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle के लिए MyBatis बैच इन्सर्ट/अपडेट करें

  2. न्यूल कॉलम के साथ संख्यात्मक अतिप्रवाह (0,3)

  3. ऑरैकल में कॉलम में पंक्तियों को विभाजित करना

  4. क्या गैर-अद्वितीय सूचकांक रिकॉर्ड के दोहराव से बच सकता है

  5. पेज सबमिट करने की आवश्यकता के बिना मैं ऑरैकल एपेक्स सर्वर साइड लाइव सत्यापन कैसे बना सकता हूं?