update salida resueltos procedimientos procedimiento parametros funciones ejercicios ejemplos ejecutar dinamico developer con almacenado oracle stored-procedures plsql triggers

salida - procedimientos y funciones oracle pl/sql



Oracle PL/SQL: reenvĂ­o de toda la fila al procedimiento desde un desencadenante (4)

En la gran mayoría de los casos, la única forma de asignar los nuevos valores en la fila a una variable% ROWTYPE sería asignar explícitamente cada columna. Algo como

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;

Si su tabla es declarada en base a un objeto,: NEW será un objeto de ese tipo. Entonces, si tienes una mesa como

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

entonces podría declarar procedimientos que acepten parámetros de entrada de tipo OBJ_FOO y los llame directamente desde su desencadenante.

La sugerencia en el otro hilo acerca de seleccionar la fila de la tabla en un hilo DESPUÉS DE INSERTAR / ACTUALIZAR, desafortunadamente, generalmente no funciona. Eso generalmente conducirá a una excepción de tabla mutante.

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''

Tiene un activador de nivel de fila PL / SQL de Oracle (10i) que es responsable de tres tareas independientes. Como el desencadenador está relativamente desordenado de esa manera, quiero exportar estas tres tareas en tres procedimientos almacenados. Estaba pensando en usar un parámetro my_table%ROWTYPE o quizás un tipo de colección para los procedimientos, pero mi principal preocupación es cómo llenar estos parámetros.

¿Hay alguna manera de poner el conjunto :NEW fila de un disparador en una sola variable fácilmente? Hasta ahora, la única forma en que pude averiguar fue asignando cada campo por separado a la variable que no es del todo satisfactoria, mirando el mantenimiento del código, etc.

Algo como

SELECT :NEW.* INTO <variable> FROM dual;

sería preferido (No lo he intentado en realidad, pero supongo que no funcionaría)


Esto es similar a la solución de Justins, pero un poco más corto (sin tipear la parte izquierda de cada tarea):

-- use instead of the assignments in Justins example: select :new.column1, :new.column2, ... :new.columnN, into l_row from dual;


Use SQL para generar el SQL;

select '' row_field.''||COLUMN_NAME||'' := :new.''||COLUMN_NAME||'';'' from ALL_TAB_COLUMNS cols where cols.TABLE_NAME = ''yourTableName'' order by cols.column_name

Luego copie y pegue la salida.