Ayudan urgente sobre un trigger

Hola, tengo una duda y a ver si me puede ayudar sobre como realizar esto:
Nota: /*
AQUÍ ES DONDE SE ENCONTRARÁ LA DUDA.
*/
create or replace trigger x_ai_tr
after insert on x
for each row
declare
v_uid varchar2(200);
v_usuario varchar2(200);
v_seq number;
v_post varchar2(200);
v_cols varchar2 (2000);
v_aplic varchar2 (8);
begin
v_aplic:= control.trae_aplicacion(v_uid);
v_post:=':new.nexp||'@@'||:new.aexp||'@@'||:new.anio||'@@'||:new.mes||'@@'||:new.concepto';
/*Aquí esta mi duda, me gustaría saber como sacar el valor de los campos de v_post, ejem, ':new.nexp' para poder saber el valor nuevo del campo después de dispararse el trigger after insert.
Lo que quiero conseguiir es el valor de :new.nexp, para luego poder insertarlos en históricos.
*/
v_cols:= [email protected]@[email protected]@[email protected]@[email protected]@concepto;
insert into control.historicos_tb
(nhist_n,usuario_v,fecha_d,valor_anterior_v,valor_post_v,motivo_v,aplicacion_v,nombre_tabla_v,cols_tabla_v )
values(v_seq,v_usuario,sysdate,null,v_post,'a',v_aplic,'plicinct',v_cols);
end plicinct_ai_tr;
Muchas gracias por todo. Un saludo
1

1 respuesta

Respuesta
1
Si no he entendido mal, necesitas una rutina que a partir de una cadena con valores separados por delimitadores puedas obtener un valor cualquiera. Igual te sirve la sig. función PLSQL:
FUNCTION SUBSTR_OCURRENCIA(p_Cadena VARCHAR2, p_Ocurrencia NUMBER, p_Separador VARCHAR2 DEFAULT ';') RETURN VARCHAR2 IS
v_Aux VARCHAR2(20000);
v_Pos NUMBER(4);
BEGIN
IF p_Ocurrencia = 0 THEN
RETURN p_Cadena;
END IF;
IF p_Ocurrencia > NUMERO_OCURRENCIAS(p_Cadena, p_Separador) + 1 THEN
RETURN NULL;
END IF;
--Acotamos por arriba
v_Pos := INSTR(p_Cadena, p_Separador, 1, p_Ocurrencia);
IF v_Pos <> 0 THEN
v_Aux := SUBSTR(p_Cadena, 1, v_Pos - 1);
ELSE
v_Aux := p_Cadena;
END IF;
--Acotamos por abajo
IF p_Ocurrencia <> 1 THEN
v_Pos := INSTR(v_Aux, p_Separador, 1, p_Ocurrencia-1);
v_Aux := SUBSTR(v_Aux, v_Pos + 1);
END IF;
RETURN v_Aux;
END SUBSTR_OCURRENCIA;
--P. Ej. p_Cadena = 'HOLA;ADIOS;QUE TAL'
-- p_Ocurrencia = 2; p_Separador = ';'
-- p_Resultado =
El problema es que el trigger llama a una función que devuelve las
columnas de una tabla que le he pasado como .
Pues bien esta función recupera y devuelve las columnas de una
tabbla.-
y lo que
Quiero es que con :new. '+ El el valor que devuelve ´la función,
ejem: código' es el valor que deseo poner.
v_variables:=devuelve_cols('EMPLEADOS');
--Ahora v_variable ahora contiene 'codigo'
--Y ahora necesito recuperar el nuevo valor de esa columna de la
--Tabla.
:new.XXXXXXXXXX
Es para hacer un trigger que me sea útil para varias tablas.
Muchas gracias.
Más aclaraciones
1. La función 'devuelve_cols' retorna un string con los nombres de
> ¿Las columnas en una tabla dada?
Si esta función devuelve las columnas de una tabla, devuelve un
varchar2 con es siguiente formato
[email protected]@[email protected]
>
> 2. En ese string cuál es el carácter(es) que separan los nombres
de
> ¿Las columnas?
El carácter de separación es @
>
> 3. Ud. deses extraer cada nombre de columna, individualmente?
>
Exactamente ahora lo que deseaba es sacar de la variable que
contiene el varchar2 anterior y poder conseguir en el trigger los
valores old y new.
Aquí esta el problema no se como poner después del :new. El primer
campo de la variable.
En el caso anterior tendría que sacar :
:new. Código --como puedo poner esto es posible. Recuerda que estos
:new. Nombre --valores los saco de una variable.
... --
> Chao gracias
Los triggers son asociados a una única tabla. En el código de un trigger, en el caso de un INSERT, se puede referenciar a los valores que se van a insertar mediante :new. nombre_columna.
No puedes emplear :new para otra tabla que no sea la asociada al trigger.
Sin embargo, si que puedes hacer consultas sobre otras tablas en un trigger.
El único medio que conozco de compartir código entre triggers para varias tablas es llamando a funciones/procedimientos comunes.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas