PDA

Ver la Versión Completa : Problemas con package dbms_crypto_toolkit


Isabel
12-06-2003, 12:01:34
Hola a todos!!!
Quiero insertar valores en una tabla de manera q cuando el valor de uno de los campos sea nulo insertar un valor aleatorio. El código q he implementado en PL/SQL para hacer esto es el sgte:

create sequence IdCodeSeq;

create or replace function GeneraCodigo
return integer as
code INTEGER;
num INTEGER;
seed BINARY_INTEGER;
begin
SELECT IdCodeSeq.NextVal INTO seed FROM Dual;
dbms_random.initialize(seed*1000);
code := dbms_random.random;
SELECT Count(*) into num FROM Tabla WHERE ID=code;
while num=0 LOOP
code := dbms_random.random;
select count(*) into num from Tabla where ID =code;
end loop;
dbms_random.terminate;
RETURN code;
end;
/

create or replace trigger BITabla
before insert on Tabla for each row
begin
if :new.Id is null then
:new.Id := GeneraCodigo;
end if;
end;
/

Y el mensaje de error que me aparece es el siguiente:
SQL> insert into tabla values(null);
insert into tabla values(null)
*
ERROR en línea 1:
ORA-06521: PL/SQL: Error al crear la correspondencia de la función
ORA-06512: en "USERP.DBMS_CRYPTO_TOOLKIT", línea 23
ORA-06512: en "USERP.DBMS_CRYPTO_TOOLKIT", línea 962
ORA-06512: en "USERP.DBMS_RANDOM", línea 15
ORA-06512: en "USERP.GENERACODIGO", línea 9
ORA-06512: en "USERP.BITABLA", línea 4
ORA-04088: error durante la ejecución del disparador 'USERP.BITABLA'

donde UserP es un usuario con el rol dba asignado y propietario de la tabla en la q quiero hacer la inserción.

Qué estoy haciendo mal?
Muchas gracias a todos por vuestra ayuda y sugerencias.
Hasta pronto,
Isabel

jachguate
20-06-2003, 20:53:40
No entiendo exactamente que queres conseguir....

Además, todos los mensajes de error que has enviado parecen ser producto de un error "primario" que no se está viendo....

Porque no tratás de cambiar un poco tu rutina que genera el código aleatorio. Segun veo, queres generar un código para el que ya exista algún valor agregado a la tabla??

Es eso necesario???

que pasará cuando la tabla este vacia... nunca saldrá del ciclo...


Además, podrias agregar a tu procedure unas llamadas a dbms_output.Put_line, o un manejo de errores.

Que versión de Oracle utilizas... porque los métodos initialize, random y terminate están obsoletos ahora...

He revisado el package dbms_random y no eleva ninguna excepción....

porque no me envias la estructura completa de la tabla con triggers y stored procedures para poder hacer una prueba??

hasta luego.

ah... además te recomiendo el uso de la étiqueta [ CODE ] (sin los espacios...) con lo que podes conseguir un resultado como el siguiente:



create or replace function GeneraCodigo
return integer as
code INTEGER;
num INTEGER;
seed BINARY_INTEGER;
begin
SELECT IdCodeSeq.NextVal INTO seed FROM Dual;
dbms_random.initialize(seed*1000);
code := dbms_random.random;
SELECT Count(*) into num FROM Tabla WHERE ID=code;
while num=0 LOOP
code := dbms_random.random;
select count(*) into num from Tabla where ID =code;
end loop;
dbms_random.terminate;
RETURN code;
end;
/



hasta luego.

Isabel
24-06-2003, 13:09:25
El problema no está en la rutina, no digo q el código del procemiento o del trigger esté bien, pero la cuestión es q simplemente si hago una llamada a cualquier función del paquete dbms_random me da el siguiente error:

SQL> exec dbms_random.initialize(1234);
begin dbms_random.initialize(1234); end;

*
ERROR en línea 1:
ORA-06521: PL/SQL: Error al crear la correspondencia de la función
ORA-06512: en "SYS.DBMS_CRYPTO_TOOLKIT", línea 23
ORA-06512: en "SYS.DBMS_CRYPTO_TOOLKIT", línea 962
ORA-06512: en "SYS.DBMS_RANDOM", línea 15
ORA-06512: en línea 1

con lo cual no puedo comprobar si el resto del código está bien o no porque no es capaz de hacer la llamada a las funciones de este paquete.

jachguate
25-06-2003, 00:22:06
Pues yo lo he probado con un oracle 8.1.7 sobre windows NT y ha funcionado bien, así que creo que se puede suponer que se trata de un problema de instalación, o bien que tengas alguna configuración no estándar que se te ha olvidado comentar.

El package que te está dando problema es el Oracle Cryptographic Toolkit, pero no veo por donde tenga que ver con la generación de números aleatorios. Al revés, el DBMS_CRYPTO_TOOLKIT utiliza el DBMS_RANDOM para generar sus propios números aleatorios, y yo ni siquiera lo tengo instalado en mi sistema.

Hasta luego.

;)

Isabel
25-06-2003, 09:00:17
Pues yo tengo la versión personal de Oracle 8 para Windows NT. Y no tengo ni idea de qué es lo q puede estar fallando. Antes de usar el paquete he ejecutado los sgtes scripts y no me ha dado ningún fallo:

1. utlraw.sql
2. prvtrawb.plb
3. dbmsoctk.sql
4. prvtoctk.plb
5. dbmsrand.sql

Tu has tenido q compilar algún paquete, cambiar algo de la configuración o algo?
Llevo con esto un montón de tiempo y me estoy volviendo loca pq no sé qué más puedo hacer. Así es q cualquier sugerencia por trivial q parezca me puede venir bien.
Muchas gracias por todo,
Silvia

jachguate
25-06-2003, 23:43:22
Fijate que yo no he hecho ninguna configuración especial... ni recompilado paquetes, ni ejecutado scripts de configuración, sino que la instalación y el setup de la base de datos lo hice todo con el asistente.

Yo te aconsejo que lo reinstales, pues ya busque por toda la documentación de Oracle y no encontré mayor referencia al problema que te está dando.

Que versión específica es la que tenes instalada??

Lamento no poder ayudarte mas por ahora...

Hasta luego

;)

Isabel
27-06-2003, 12:29:37
El hecho de q te intereses por mi problema y aportes posibles motivos de error ya es mucha ayuda para mí, gracias.

De todas formas después d dar muchas vueltas y preguntar por ahí me han dicho q por lo visto hay un problema con Oracle 8.0 (Bug#520154) para versiones inferiores a la 8.0.5 q hace q aparezca este error, y como yo tengo instalada la 8.0.3 supongo q puede ser ese el problema. Intentaré bajarme otra versión posterior a ver si eso soluciona el problema.

Bye,
Isabel

jachguate
04-07-2003, 05:38:20
Me alegra que hayas encontrado la fuente de tus problemas.

Hasta luego.

;)