Aspx y oracle, leer clave primaria

Tengo desarrollada una aplicación aspx con SQL SERver, una vez terminada el cliente me ha pedido que la pase a ORacle. Ya lo tengo todo preparado pero me he encontrado con la siguiente dificultad.
Con SQL server tenía el campo clave primaria con un autonumérico que se incrementaba en una unidad. Cada vez que hacía una insert recuperaba la clave primaria de la tabla con un sentencia del tipo...
Insert into TBACCESOS (NombreA) values ('Nombre Acceso); select @@identity;
Con esto conseguía que al hacer la insert me devolviera el Identificativo de la tabla donde se ha hecho la insert.
¿Cómo hacer esto con ORACLE?, bueno he seguido los pasos de un artículo que he leído y ha quedado de la siguiente manera.
PRIMERO: después de crear la tabla TBACCESO creo el índice PK_TBACCESO
SEGUNDO: defino una secuencia
Create sequence s_824_1_tbacceso increment by 1
start with 62 maxvalue 1.0e27 minvalue 1 nocycle
cache 20 noorder
TERCERO: he añadido un package
Create or replace package identitypkg as
LastIdentity number := -1000;
end IdentityPkg;
Y por ultimo forcé la asignación de un valor secuencial en un trigger asociado a la tabla de ACCESOS
CREATE OR REPLACE TRIGGER TR_S_824_1_TBACCESO
BEFORE
INSERT ON TBACCESO FOR EACH ROW begin
select S_824_1_TBACCESO.NextVal
into :new.IDACCESO
from DUAL;
IdentityPkg.LastIdentity := :new.IDACCESO;
end;
Bien con todo esto consigo definir la clave primaria y que ésta se autoincremente en una unidad cada vez que hago la insert. PERO... Lo que no consigo, bueno lo que no se es hacer es que me devuelva el valor que ha insertado en la clave primaria. De tal modo que al hacer la insert pueda recoger el valor de la clave primaria. Se que tiene que estar guardado el package pero no se como leerlo
Estoy un poco desesperado, yo estoy un poco pez con oracle y no se por donde tirar... Cualquier genero de ayuda será bienvenida

1 respuesta

Respuesta
1
No te preocupes, es sencillo.
Como puedes ver en el trigger, has utilizado una función de las secuencias que incrementa su valor: NextVal.
Pues existe otra que te devuelve el valor actual de la secuencia: CurrVal
Yo no utilizaría un paquete para almacenar el valor de la secuencia porque si lo recargas volverías a resetear la variable pero no la secuencia.
Si lo que quieres es tener una función que te devuelva el valor actual de la secuencia, yo haría una función que ejecutara lo siguiente:
Paquete plsql:
========================
CREATE OR REPLACE PACKAGE IDENTITYPKG as
function UltimoID return number;
END IdentityPkg;
/
CREATE OR REPLACE PACKAGE BODY IDENTITYPKG as
function UltimoID return number
is
v_ultimo_id number;
begin
select s_id.currval into v_ultimo_id from dual;
return v_ultimo_id;
exception
when others then
return 0;
end;
end IdentityPkg;
/
Y luego solo tienes que ejecutar la función para ver el valor actual. Por ejemplo:
select IDENTITYPKG.ULTIMOID from dual
Ultimoid
----------
5
1 row selected
De esta manera, podrás recargar todas las veces que quieras el paquete pero sin afectar a la secuencia ni a sus valores.
Igualmente, no haría falta tener el trigger... bastaría con hacer:
insert into TBACCESO values (S_824_1_TBACCESO.NextVal, campo2, campo3,....., campoN);
Y siempre insertaría un valor diferente.
Muchas gracias por tu ayuda, ... todavía no he conseguido nada, Necesito que me aclares una cosilla, pero te lo voy a poner en una pregunta nueva... de nuevo muchas gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas