Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle PL / SQL:Chuyển tiếp toàn bộ hàng tới thủ tục từ một trình kích hoạt

Trong phần lớn các trường hợp, cách duy nhất để gán các giá trị mới trong hàng cho biến% ROWTYPE là chỉ định rõ ràng từng cột. Một cái gì đó giống như

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;

Nếu bảng của bạn tình cờ được khai báo dựa trên một đối tượng,:NEW sẽ là một đối tượng thuộc loại đó. Vì vậy, nếu bạn có một bảng như

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

CREATE TABLE foo OF obj_foo;

thì bạn có thể khai báo các thủ tục chấp nhận các tham số đầu vào thuộc loại OBJ_FOO và gọi những người đó trực tiếp từ trình kích hoạt của bạn.

Thật không may, gợi ý trong chuỗi khác về việc chọn hàng từ bảng trong chuỗi SAU KHI CHÈN / CẬP NHẬT, không hoạt động. Điều đó nói chung sẽ dẫn đến một ngoại lệ bảng thay đổi.

  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. Thay đổi kích thước tên bảng / cột / chỉ mục trong oracle 11g hoặc 12c

  2. Chuyển quy trình đã lưu trữ từ SQL Server đến máy chủ được liên kết ORACLE

  3. oracle PL / SQL cách tính toán dải ô ip cho IPv6 cidr

  4. ORA-6502 với Trình kích hoạt ghi nhật ký cấp

  5. Có thể có một bế tắc khi sử dụng khóa lạc quan?