aspx y Oracle.. como leer la clave primaria después de hacer una insert

Adlorenzo
16 de Junio del 2005
hola, buenos días..

La verdad es que la pregunta se las trae espero que tengais un poco de paciencia conmigo y puedais echarme una manita

Tengo desarrollada una aplicacion 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 autonumerico 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: despues 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

Muchas gracias por todo

mouser
16 de Junio del 2005
Hola,
igual si en el package que has creado pones el LastIdentity como parámetro de entrada y salida lo puedes recoger cuando hagas la llamada al package

Edgar Chac?
16 de Junio del 2005
Otra forma de hacer esto es incrementar la secuencia fuera de la sentencia de inserción y guardarla en una variable que luego puedes utilizar en otra parte del código.

SELECT nombre_secuencia.NEXTVAL FROM DUAL o

SELECT nombre_secuencia.NEXTVAL INTO :variable FROM DUAL

Adrian
16 de Junio del 2005
Es muy sencillo con la claúsula RETURNING:

create table t2 (c1 number);

create sequence s;

set serveroutput on;

declare x number;
begin
insert into t2 (c1) values (s.nextval) returning c1 into x;
dbms_output.put_line (x);
end;