Según el método de activación, los activadores de Oracle se dividen en dos tipos: nivel de declaración y nivel de fila. ¿Qué tipo de activador se llama activador creado en una vista?
Hay tres tipos de disparadores DML:
1, disparador de inserción
2, disparador de actualización
3, disparador de eliminación; Desencadenador;
Los componentes de un desencadenador:
La declaración del desencadenador, especificando el momento del desencadenador, el evento, el nombre de la tabla y el tipo
La ejecución del desencadenador, bloque PL/SQL o llamada a procedimiento
Restricciones de desencadenador, implementadas a través de la cláusula donde
Tipo:
Desencadenador de aplicación, desarrollo front-end Proporcionado por herramienta;
Los desencadenadores de la base de datos se definen para ser activados por ciertas condiciones dentro de la base de datos; se dividen en:
Desencadenadores DML;
Disparador alternativo;
Componente de disparo DML:
1, tiempo de disparo
2, evento de disparo
p>3, nombre de la tabla
4, tipo de activador
5, cláusula When
6, cuerpo del activador
Objetos que pueden crear activadores: tablas de bases de datos, vistas de bases de datos, esquemas de usuario, instancias de bases de datos
Crear activadores DML:
Crear [o reemplazar] activador [Modo.] activador Nombre del dispositivo
Antes|después de insertar|eliminar|(actualización del nombre de la columna)
En el nombre de la tabla
[para cada fila]
Cuando condición
Bloque PL/SQL
El significado de Para cada fila es: en una declaración que opera la tabla, cada fila se activará una vez si la operación es exitosa, si no se escribe, significa que es un; disparador a nivel de tabla, por lo que no importa cuántas filas se operen, solo se activará una vez;
La aparición de la condición When indica que el disparador puede activarse durante las operaciones DML, pero es posible que no necesariamente hacer trabajo real, como cuando la condición después de cuándo no es verdadera, el disparador simplemente omite el bloque PL/SQL;
Insertar creación del disparador:
crear o reemplazar el disparador tg_insert
antes de insertar en el estudiante
comenzar
dbms_output.put_line('insertar disparador es chufa le....');
fin ;
/
Efecto de ejecución:
SQLgt; insertar en estudiante
2 valores (202, 'dongqian', 'f' );
insertar disparador es chufa le....
Ejemplo de actualización de disparador a nivel de tabla:
crear o reemplazar disparador tg_updatestudent
después de la actualización del estudiante
comenzar
dbms_output.put_line('
el disparador de actualización es chufale .....');
end;
/
Efecto operativo:
SQLgt; set se='f';
el disparador de actualización es chufale....
Se han actualizado 8 filas;
Se puede ver que la tabla- El activador de nivel se está actualizando. En el caso de varias filas, solo se activa una vez;
Si agrega
Para cada fila después de la actualización del estudiante, se convertirá en un activador de nivel de fila. , y el efecto operativo es:
SQLgt; actualizar conjunto de estudiantes se='m';
el activador de actualización es chufale.....
activador de actualización es chufale.....
el activador de actualización es chufale.....
el activador de actualización es chufale.....
el activador de actualización es chufale .....
el disparador de actualización es chufale .....
el disparador de actualización es chufale .....
el disparador de actualización es chufale .. ...
Se han actualizado 8 filas;
: new y: old: deben ser para disparadores a nivel de fila, es decir, el disparador que utiliza estas dos variables debe tener para cada fila
Estas dos variables son variables de matriz proporcionadas automáticamente por el sistema: nueva se usa para registrar valores recién insertados y antigua se usa para registrar valores eliminados;
Cuando se usa insertar, solo: nuevo contiene valor;
Cuando se usa eliminar, solo: viejo tiene un valor
Cuando se usa actualizar: hay valores tanto en nuevo como en: viejo; /p>
Esto se puede hacer Utilice: dbms_output.put_line('insertar disparador es chufa
dbms_output.put_line('nueva identificación es: '||: new.stui
dbms_output.put_line('el nuevo nombre es: '||: new.st
dbms_output.put_line('el nuevo nombre es: '||: new.se);
Tú puede verificar los datos en una tabla del diccionario de datos de esta manera. Qué desencadena:
SQLgt; seleccione trigger_name from user_triggers
2 donde table_name=upper('student'); p>
TRIGGER_NAME
---------------------------------
TG_INSERT
TG_UPDATESTUDENT p>
Activador de eliminación de nivel de fila con: variable anterior:
crear o reemplazar el activador
tg_deletestudent
antes de eliminar al estudiante
para cada fila
comenzar
dbms_output.put_line('old is: '||: old .stuid);
dbms_output.put_line('nombre antiguo: '||: antiguo.stuname);
end;
/
Efecto operativo:
SQLgt; eliminar del estudiante;
el antiguo es: 202
nombre antiguo: dongqian
el antiguo es: 101
nombre antiguo: liudehua
antiguo es: 102
nombre antiguo: lingqingxia
antiguo es: 103
nombre antiguo: lichanggong
el antiguo es: 104
nombre antiguo: zhenxiuwen
el antiguo es: 1001
nombre antiguo: lilianjie
el antiguo es: 1009
nombre antiguo: tongleifuck
el antiguo es: 203
nombre antiguo: kfdj
el antiguo es: 209
nombre antiguo: joder
Se han eliminado 9 filas
Uso de cuándo: si está en inicio, es decir, activa PL/SQL Si agrega when(old.se='f') antes de la ejecución del bloque principal, la operación DML se ejecutará correctamente, pero solo se ejecutará cuando se elimine la línea con Se='f'. del disparador, efecto de ejecución:
SQLgt; eliminar del estudiante;
el antiguo es: 209
nombre antiguo: joder
9 se han eliminado filas; aunque se han eliminado 9 filas, el cuerpo principal del disparador solo se ejecuta una vez, como un disparador de nivel de fila;
Disparador de tipo mixto:
Los tres. Los predicados de Insertar, eliminar y actualizar pueden indicar respectivamente qué operación se realiza actualmente;
crear o reemplazar el activador hunhetrigger
antes de insertar, actualizar o eliminar en el estudiante
para cada fila
comience
si se inserta, entonces
dbms_output.put_line('insert le.........');
p>end if
si elimina entonces
dbms_output.put_line('delete le .......'); end if;
end;
/
Al insertar, determinará automáticamente que la acción actual es insertar:
SQLgt; insertar en los valores del estudiante
(303, 'me', 'f');
insertar archivo...
Al eliminar, la acción actual se considera automáticamente como eliminación:
p>SQLgt; eliminar del estudiante;
eliminar archivo.....
Tenga en cuenta que dado que el cuerpo PL/SQL dentro del disparador es una declaración, también puede ser una operación de inserción y eliminación en lugar de simplemente dbms_output imprimir alguna información;
Este es exactamente el principio de la tabla de registro: cuando el usuario ejecuta una declaración DML, el sujeto desencadenante se inserta en la tabla de registro para registrar el seguimiento de operación. Trigger;
¿Por qué utilizar disparadores? Cuando tenemos dos tablas que se usan para registrar el envío y el almacenamiento de mercancías, good_store se usa para registrar la categoría de producto y la cantidad del inventario, y good_out se usa para registrar la categoría de producto y la cantidad del envío, luego cada Cuando enviamos un cierta cantidad de productos de una determinada categoría fuera del almacén, debemos insertar la categoría y la cantidad de envío del producto en good_out y, al mismo tiempo, debemos usar la actualización en la tabla good_store para actualizar la cantidad de productos en. la categoría correspondiente; esto nos deja con dos tareas que debemos completar: insertar la tabla good_out
y actualizar la tabla good_store. Este proceso manual nos hace sentir muy feos si solo hacemos uno de los datos. inconsistencia; ahora podemos usar disparadores para vincular un disparador que actualiza good_store a la operación de inserción de la tabla Good_out. Por supuesto, este proceso debe ser una transacción, no es necesario. Me preocupa la inserción en la tabla good_out; se ejecutará, pero la operación de activación vinculada a esta acción no se ejecutará. Creo que Oracle está diseñado para ser atómico;
Nota: los activadores ralentizarán la declaración SQL original;
Disparador alternativo:
El disparador creado en la vista es un disparador alternativo, que solo puede ser un disparador a nivel de fila;
¿Por qué usarlo?
Supongamos que tiene una vista que se obtiene en función de la consulta de conexión de campos de varias tablas; ahora, si desea insertar directamente en esta vista, debe estar pensando en mi operación de inserción en la vista; p >
¿Cómo reflejarlo en las tablas que componen esta vista? De hecho, excepto definir un disparador para vincular la acción de inserción en la vista, no tiene otra forma de insertar datos directamente en la vista a través del informe de errores del sistema. Es por eso que usamos disparadores de reemplazo. Lo que realmente significa es; que la parte principal del disparador convierte la operación de inserción en la vista en una inserción detallada en cada tabla;
Tabla de mutación: la tabla de mutación es la tabla que está siendo modificada por la instrucción SQL actual, por lo que en una mutación Desencadenantes vinculado a la tabla no puede usar la función cout () La razón es muy simple: la declaración SQL acaba de modificar la tabla, ¿cómo se cuenta?
Tabla de restricciones:
Mantenimiento:
p>Alterar disparador…..disenable; Hace que el disparador no esté disponible;
Alterar disparador…activar;
Paquete integrado de Oracle
Funciones de base de datos extendidas;
Proporciona PL/SQL acceso a funciones SQL;
Generalmente utilizado por altos directivos con autoridad en sistemas;
Un paquete típico es dbms_output, siempre se utiliza su procedimiento put_line();
Dbms_standard proporciona herramientas de lenguaje;
Dbms_lob opera Oracle LOB; es para;
Diseñado para operaciones de datos grandes;
Dbms_lock bloqueo definido por el usuario;
Dbms_job permite la programación de procesos PL/SQL;
Dbms_alert admite notificaciones de eventos de base de datos asíncronos <; /p>
1, algunos procesos de dbms_output:
a): habilitar
b): deshabilitar
c): poner solo poner los datos en el caché (el caché de SQL-Plus, en realidad toda la ventana), sin función de salida
d): put_line puede generar todos los datos previamente colocados en el caché y cambiar a la siguiente línea;
e): new_line
f): get_line
g): get_lines
2, dmbs_lob, este paquete solo se puede operar por el administrador del sistema
Clob puede almacenar datos de caracteres hasta 2G;
Blob puede almacenar datos binarios hasta 4G
Nclob puede almacenar caracteres Unicode; ;
Un ejemplo de una lista de descarga de archivos:
Crear una tabla de directorio de descarga:
crear tabla downfilelist
(
id varchar(20) clave principal no nula,
nombre varchar(40) no nulo,
ubicación de archivo bfile,
descripción clob p >
)
/
Crear directorio:
crea o reemplaza el directorio filedir como 'f:\oracle'
/ El simple hecho de registrar el directorio con Oracle en realidad no crea el directorio en el disco; Oracle no tiene derecho a administrar y bloquear el sistema de archivos del sistema operativo;
Inserte datos en la tabla del directorio:
insertar en downfilelist
values('10001', 'guía de programación de Oracle plsal', bfilename(upper('filedir'), 'demo.mp3'), 'este es un mp3 music')
insertar en downfilelist
values('10002','java power', bfilename(upper('filedir'),'x.jpg'),'good super girl')
/Demo.mp3, x.jpg en realidad se almacenan en el directorio f:\oracle de filedir;
Tenga en cuenta que si intenta realizar consultas, el efecto es:
sysgt; select * from downfilelist;
SP2-0678: La columna o tipo de atributo no se puede mostrar a través de SQL*Plus
Porque la tercera columna no se puede mostrar se muestra y es un binario;
A continuación se utilizan algunos procesos de dbms_lob para realizar operaciones:
1, proceso de lectura
declarar
tempdesc clob;
ireadcount int;
istart int;
soutputdesc varchar(100);
comenzar
ireadcount:=5;
istart:=1;
seleccione la descripción en tempdesc desde downfilelist donde id='10001';
dbms_lob.read(tempdesc,ireadcount,istart,soutputdesc ) ; Lee los datos en el tipo clob tempdesc en el tipo de carácter soutputdesc;
dbms_output.put_line('Los 5 caracteres principales son: '||soutputdesc);
end; p>
/Tenga en cuenta que para Unicode, el número de dígitos ocupados por caracteres y letras chinos es el mismo;
2. función getlength
seleccione la descripción en tempclob desde downfilelist donde id='10001';
ilen:=dbms_lob.GetLength(tempclob);
añadir, copiar……..
Descubre este fenómeno: Al seleccionar x en y, y no es una copia independiente de x, porque x también se modifica cuando se modifica y;
3. función fileexists
seleccione id, dbms_lob .fileexists(filelocation) from downfilelist;
Si el archivo del sistema especificado por ubicación de archivo existe en el directorio bajo el sistema especificado por el campo de tipo de archivo ubicación de archivo, devuelve int 1; de lo contrario, devuelve 0;
Esto muestra que Oracle aún puede detectar la situación de los archivos del sistema, al igual que las clases en el paquete java.io;
Las funciones de operación para datos de tipo bfile incluyen fileisopen, fileopen, fileclose, etc.;