Trigger con secuenciador

Tengo problemas con un trigger. Tengo que insertar datos a una tabla y deseo que un campo sea secuenciador, que no se repita:
Mi secuencia esta creada así:
Create sequence "juan"."SEC_P_C" INCREMENT BY 1 START WITH 1
MAXVALUE 1.0E28 MINVALUE 1 CYCLE
CACHE 20 NOORDER
Mi TRIGGER SE HA CREADO así:
CREATE OR REPLACE TRIGGER "JUAN"."TRI_P_C" BEFORE
INSERT ON "PRI_CONTRIBUYENTES" FOR EACH ROW
BEGIN
:NEW.NUM_SEC := SEC_P_C.NEXTVAL;
END;
LA ESTRUCTURA DE MI TABLA PRI_CONTRIBUYENTES ES:
NUM_SEC NUMBER 10 NOT NULL
AP_PATERNO VARCHAR2(20) , ....
EL CAMPO NUM_SEC LLAVE UNICA
EL PROBLEMA ES CUANDO EJECUTO O COMPILO EL TRIGGER DA EL SIGUIENTE ERROR:
Número de Línea = 2 Número de Columna = 25 Texto de Error = PLS-00357: Table,View Or Sequence reference 'SEC_P_C.NEXTVAL' not allowed in this context
Número de Línea = 2 Número de Columna = 1 Texto de Error = PL/SQL: Statement ignored
No me permite usar un secuenciado en el trigger.
Quisiera que me ayudes, tal vez hay que definir otros parámetros para que los triguer acepten los comandos de nextval entre el begin y end del trigger, no se.
CUANDO HAGO UN INSERT ME SALE UN ERROR:
ORA-04098: ¿Trigger? JUAN.TRI_P_C? Is invalid and failed re-valitation
Cuando elimino el trigger me permite ingresar datos.
Por otro lado quisiera que me ayudes en este otro:
En que tipo de datos de oracle debo almacenar unos archivos gráficos .jpg o .bmp
quisiera que me comentes si has tenido experiencia en esto, como se define las tablas, espacios, es muy pesado, tengo que ingresar 50000 registros un 3 gráficos .jpg y mostrarlos por pantalla.
Te estaré agradecido por siempre. Jantezana

1 respuesta

Respuesta
1
El error es porque en el trigger no se puede utilizar en asignación curval y nextval es necir no se puede usar:
:NEW.NUM_SEC := SEC_P_C.NEXTVAL;
Por lo tanto para simular un sequenciador o autonumber(de microsoft) yo uso algo parecido a esto:
Si se tiene una tabla:
CREATE TABLE register
(
Nseq NUMBER PRIMARY KEY,
data DATE NOT NULL,
author VARCHAR2(80) NOT NULL,
subject VARCHAR2(80) NOT NULL
);
Para simular el autonumber se crea:
CREATE SEQUENCE seq NOCACHE;
Y el triggefr que hace el autonumber:
CREATE TRIGGER reg_seq BEFORE INSERT ON register FOR
EACH ROW
BEGIN
SELECT seq.NEXTVAL INTO :NEW.nseq FROM DUAL;
END;
/
Espero que le ayude lo anterior para el trigger.
Con respecto al bmp se almacena en campos de tipo blob existen varias alternativas la primera es:
Los pasos para insertar una imagen son:
1.Crear directorio JPG como '/photo';
2. insert into employee_information vaules(..........,empty_blob());
3. CREATE OR REPLACE PROCEDURE load_jpg is
v_filelocator bfile;
v_cloblocator blob;
begin
select jpg into v_cloblocator from employee_information where enroll_id='27684';
v_filelocator:=bfilename('JPG','27684.jpg');
dbms_lob.fileopen(v_filelocator,dbms_lob.file_readonly);
dbms_lob.loadfromfile(v_cloblocator,v_filelocator,dbms_lob.getlength(v_filelocator));
dbms_lob.fileclose(v_filelocator);
commit;
end ;
4.exec load_jpg;
No olvidar que oralce path debe apuntar al file directory
Otra alternativa es la siguiente, le envio tres ejemplos diferentes para insert, select y update
Un ejemplo de insert:
DECLARE
v_bfile BFILE;
v_blob BLOB;
BEGIN
INSERT INTO sca VALUES ('10077703T',empty_blob(),null,null)
RETURN imanif INTO v_blob;
v_bfile := BFILENAME('IMAGES', '10077703Td.gif');
Dbms_Lob.Fileopen(v_bfile, Dbms_Lob.File_Readonly);
Dbms_Lob.Loadfromfile(v_blob, v_bfile, Dbms_Lob.Getlength(v_bfile));
Dbms_Lob.Fileclose(v_bfile);
COMMIT;
END;
Un ejemplo para seleccionar:
PROCEDURE WRITE_ECIT (p_id number, p_blob blob)
IS
v_signature BLOB;
v_sql varchar2(200);
v_size binary_integer := 0;
v_buf raw(32767);
v_amt binary_integer := 30000;
v_pos binary_integer := 1;
BEGIN
select c_blob into v_signature
from t_blob
where c1=p_id
for update;
v_size := dbms_lob.getlength(p_blob);
WHILE v_size > v_amt LOOP
DBMS_LOB.READ(p_blob, v_amt, v_pos, v_buf);
DBMS_LOB.WRITE(v_signature, v_amt, v_pos, v_buf);
v_size := v_size - v_amt;
v_pos := v_pos + v_amt;
END LOOP;
DBMS_LOB.READ(p_blob, v_size, v_pos, v_buf);
DBMS_LOB.WRITE(v_signature, v_size, v_pos, v_buf);
dbms_output.put_line('length of blob is: '||dbms_lob.getlength(v_signature));
end;
Un ejemplo para actualizar:
SQL> create or replace procedure UpdateClob (nid number, contents clob) is
2 clob$ CLOB;
3 begin
4 select
5 c_blob into clob$
6 from t_blob
7 where c1 = nid
8 for update;
9
10 DBMS_LOB.write( clob$, DBMS_LOB.getlength(contents), 1, contents );
11
12 commit;
13 end;
14 /
Procedure created.
SQL> select * from t_blob;
C1 C_BLOB
-- --------------------------------------------------------------------------------
1 this is the original contents of the blob
SQL> begin
2 UpdateClob( 1, 'new blob contents' );
3 end;
4 /
ARA
Funciono lo del tragger y secuenciador. Gracias. Con respecto a los datos de imágenes, quisiera que me ayudes pero quiero guardar estos gráficos desde Visual Basic 6. Si podes darme otras referencias..

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas