Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Relacionar nombre tabla con sequence

Estas en el tema de Relacionar nombre tabla con sequence en el foro de Oracle en Foros del Web. Estoy migrando una base desde Postgre a Oracle y necesito pasar una funcion que tiene como parametros el nombre de la tabla y el nombre ...
  #1 (permalink)  
Antiguo 30/08/2006, 13:45
 
Fecha de Ingreso: agosto-2003
Mensajes: 203
Antigüedad: 21 años, 3 meses
Puntos: 0
Relacionar nombre tabla con sequence

Estoy migrando una base desde Postgre a Oracle y necesito pasar una funcion que tiene como parametros el nombre de la tabla y el nombre del campo y devuleve el nombre de la sequence.
Esta es la funcion original
Código:
CREATE OR REPLACE FUNCTION "public"."get_sequence" ("sTabla" varchar, "sCampo" varchar) RETURNS varchar AS
$body$
DECLARE
	sTabla ALIAS FOR $1;
	sCampo ALIAS FOR $2;
	sSecuencia VARCHAR;
BEGIN
	SELECT
		s.relname INTO sSecuencia
	FROM
		information_schema.columns c,
		information_schema.tables t,
		pg_catalog.pg_statio_user_sequences s
	WHERE
		t.table_schema = 'public' AND
		c.table_name = t.table_name AND
		c.table_schema = 'public' AND
		c.table_name = sTabla AND
		c.column_name = sCampo AND
--		c.column_default = 'nextval(''public.' || s.relname || '''::text)' AND
		c.column_default LIKE 'nextval(''public.' || s.relname || '%' AND		
		s.schemaname = 'public';

	RETURN sSecuencia;
END;
$body$
Al intentar pasarlo no logro encontrar la relacion entre las tablas y los sequences.
Asi esta la funcion en Oracle, aunque no funciona
Código:
CREATE or replace FUNCTION get_sequence(sTabla IN VARCHAR2, sCampo IN VARCHAR2)
RETURN VARCHAR2
   AS
   sSecuencia  VARCHAR2(255);
BEGIN
   begin
      SELECT
      s.sequence_name INTO sSecuencia
      FROM
	all_sequences s,
	all_cons_columns c
      WHERE
      c.table_name = sTabla AND
      c.column_name = sCampo AND      
      s.sequence_owner = 'PUBLIC';
      EXCEPTION
      WHEN NO_DATA_FOUND THEN
         NULL;
   end;
   RETURN sSecuencia;
END;
Espero me puedan ayudar
  #2 (permalink)  
Antiguo 30/08/2006, 16:44
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 8 meses
Puntos: 7
"Al intentar pasarlo no logro encontrar la relacion entre las tablas y los sequences"

que yo sepa en oracle no existe relacion entre las secuencias y las tablas, tu defines una secuencia y esta la usas para cualquier operacion de cualquier objeto ( generalmente los primary key de las tablas ) pero en ningun lado obligas a que esa secuencia sea solo usada para determinada tabla
__________________
Blogzote.com :-) Mi blog
  #3 (permalink)  
Antiguo 31/08/2006, 07:54
 
Fecha de Ingreso: agosto-2003
Mensajes: 203
Antigüedad: 21 años, 3 meses
Puntos: 0
OK, gracias lo estoy solucionando de otra manera, no muy optima pero es para no modificar el codigo dado que intento que sea aplicable a cualquier base de datos. La funcion para obtener el sequence concatena el nombre de la tabla y del campo con un _seq que es de la mandera que llamamo al los sequence, pero con esto me surge otro problema en postgre tenia la funcion currval(sequenceName) para traer los datos en oracle se maneja sequenceName.currval, pero si yo no tengo el nombre del sequence que quiero y lo obtenjo mediante la funcion como le aplico el currval, intente sin exito get_sequence('table','id_campo').currval y no funciono tampoco pasando previamente la funcion a una variable
Código:
Aux := get_sequence('table','id_campo');
auxID := Aux.currval;
Si me puedes guiar con esto te lo agredezco
  #4 (permalink)  
Antiguo 31/08/2006, 11:13
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 8 meses
Puntos: 7
no entendi muy bien, creo que lo que me dices es que tienes algo asi:

:variable = :tabla || :id_campo || '_seq'; -- nombre de la secuencia

ahora como esta formandose dinamicamente y te regresa un valor, checate este documento

http://www.stanford.edu/dept/itss/do...9/pc_13dyn.htm
__________________
Blogzote.com :-) Mi blog
  #5 (permalink)  
Antiguo 31/08/2006, 14:19
 
Fecha de Ingreso: agosto-2003
Mensajes: 203
Antigüedad: 21 años, 3 meses
Puntos: 0
Estuve leyendo el link que me pasaste al parecer es lo que necesito pero por alguna razon me esta fallando, yo estoy creando la funcion desde el SQL Editor, y no logro que me tome las sentencias con las veriables, ni la que yo necesito ni una mas basica, disculpa mi ignorancia, esta bien como estoy ejecuntando la funcion

Código:
CREATE or replace FUNCTION sequence_curval(sTabla IN VARCHAR2, sCampo IN VARCHAR2)
RETURN INTEGER
	AS
	iValue  INTEGER;
	iValAux  VARCHAR2(200);
BEGIN
	iValAux := 'SELECT ' || get_sequence ('aplicaciones','id_aplicacion') ||'.CURRVAL INTO iValue FROM dual';
	puts(iValAux);
	EXEC SQL EXECUTE IMMEDIATE :iValAux;

	RETURN iValue;
END;
la funcion a la que llama "get_sequence ('aplicaciones','id_aplicacion') " solamente concatena los datos y devuelve un varchar2 con APLICACIONES_ID_APLICACION_SEQ que es el nombre del sequence.

Espero me puedas guiar algo mas con esto
muchas gracias
  #6 (permalink)  
Antiguo 31/08/2006, 16:13
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 8 meses
Puntos: 7
he utilizado sql dinamico pero nunca he tenido que usarlo para que me regrese un valor, entonces por ese lado te sera de mas ayuda el documento

solo dos observaciones en tu funcion, no deberia de ser? con dos puntitos al inicio

:iValAux := '...'
puts(:iValAux);

y el execute immediate segun yo funciona solo, es decir sin el "exec sql"
__________________
Blogzote.com :-) Mi blog
  #7 (permalink)  
Antiguo 01/09/2006, 07:48
 
Fecha de Ingreso: agosto-2003
Mensajes: 203
Antigüedad: 21 años, 3 meses
Puntos: 0
Muchas gracias por la ayuda

Finalmente logre hacer que funcione, dejo el codigo, quizas a otra persona le sirva
Código:
CREATE or replace FUNCTION sequence_curval(sTabla IN VARCHAR2, sCampo IN VARCHAR2)
RETURN INTEGER
	AS
	iValue  INTEGER;
	iValAux  VARCHAR2(200);
BEGIN
	 iValAux := 'SELECT ' || get_sequence (sTabla,sCampo) || '.CURRVAL FROM dual';
	EXECUTE IMMEDIATE (iValAux)  INTO iValue ;
	RETURN iValue;
END;
  #8 (permalink)  
Antiguo 01/09/2006, 11:07
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 8 meses
Puntos: 7
a mira, no me sabia esa del execute immediate, lo habia usado pero sin el into, gracias por la info
__________________
Blogzote.com :-) Mi blog
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:33.