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

[SOLUCIONADO] funcion con varios inserts

Estas en el tema de funcion con varios inserts en el foro de Oracle en Foros del Web. Buen día!! Necesito de su amable ayuda :) Soy nueva en oracle, así que hay q tenerme paciencia :P Tengo una aplicación que registra empleados, ...
  #1 (permalink)  
Antiguo 21/11/2013, 14:38
Avatar de lucy87  
Fecha de Ingreso: mayo-2011
Mensajes: 25
Antigüedad: 12 años, 11 meses
Puntos: 0
funcion con varios inserts

Buen día!!

Necesito de su amable ayuda :)

Soy nueva en oracle, así que hay q tenerme paciencia :P

Tengo una aplicación que registra empleados, para esto en la tabla de datos generales (tbl_rh_cv_datos_grales) se almacena la información del empleado como fecha de nacimiento, numero de hijos, correos, iddomicilio etc, y en otra tabla se almacena su domicilio (tbl_rh_cv_domicilio) ahora, ya que todo esto se hace desde la misma pantalla, estoy pensando en hacer una función en lugar de hacer 2 inserts diferentes...
Ya una vez había trabajado con una función en postgresql que recibía los parámetros, los metía en variables y comenzaba con los inserts.. x ejemplo, primero hacia el insert en la tabla de domicilio y a otra variable le asignaba el id que se insertaba, y cuando inserta en la tabla de datos generales (dentro de la misma función) le envía el id del domicilio guardado.

Ahora, estas funciones las se hacer en postgresql, pero en Oracle no tengo ni la minima idea de como :( hay alguien que tenga un ejemplito por ahí en el que me pueda basar??

esta es la función como la hacia en postgresql por si es que no me explique bien... muchas gracias!!

Código SQL:
Ver original
  1. CREATE FUNCTION prospectos_insert(CHARACTER VARYING, INTEGER, INTEGER, INTEGER,
  2. CHARACTER VARYING, CHARACTER VARYING, CHARACTER VARYING, INTEGER, INTEGER, CHARACTER
  3.  VARYING, text, CHARACTER VARYING, CHARACTER VARYING, INTEGER) RETURNS catalogoprospectos
  4.     LANGUAGE plpgsql
  5.     AS $_$DECLARE
  6.  
  7.     Resultado   catalogoprospectos%rowtype;
  8.    
  9.     r_idprospecto      INTEGER;
  10.     r_idpersona        INTEGER;
  11.     r_id_tel       INTEGER;
  12.     r_idtipotelefono   INTEGER;
  13.    
  14.     p_prospecto     CHARACTER VARYING:=$1;
  15.     p_idgiro        INTEGER      :=$2;
  16.     p_idlocalidad       INTEGER      :=$3;
  17.     p_idestatus     INTEGER      :=$4;
  18.     p_nombre        CHARACTER VARYING:=$5;
  19.     p_paterno       CHARACTER VARYING:=$6;
  20.     p_materno           CHARACTER VARYING:=$7;
  21.     p_lada          INTEGER      :=$8; 
  22.     p_telefono          INTEGER      :=$9; 
  23.     p_email         CHARACTER VARYING:=$10;
  24.     p_comentarios       text         :=$11;    
  25.     p_hashurl       CHARACTER VARYING:=$12;
  26.     p_periodo       CHARACTER VARYING:=$13;
  27.     p_creadopor     INTEGER      :=$14;
  28. BEGIN                
  29.     SELECT INTO r_idpersona idpersona FROM personas_insert(p_nombre,
  30.                                    p_paterno,
  31.                                    p_materno,
  32.                                    '?','',NULL,NULL,
  33.                                    p_creadopor) idpersona;
  34.      RAISE DEBUG 'r_idpersona=%', r_idpersona;
  35.                                    
  36.     INSERT INTO prospectos(idgiro, idcontacto, idlocalidad,
  37.                    idestatus, prospecto, email, comentarios,
  38.                    periodo,   hashurl,   creadopor)
  39.                    VALUES(p_idgiro,   r_idpersona,   p_idlocalidad,
  40.                   p_idestatus, p_prospecto,  p_email, p_comentarios,
  41.                   p_periodo,   p_hashurl,    p_creadopor);
  42.  
  43.     SELECT INTO r_idprospecto idprospecto FROM prospectos
  44.     WHERE prospecto=p_prospecto
  45.           AND idlocalidad=p_idlocalidad AND hashurl=p_hashurl AND creadopor=p_creadopor AND email=p_email;
  46.         IF NOT FOUND
  47.         THEN
  48.             RAISE EXCEPTION 'ERROR AL INSERTAR EL REGISTRO DE PROSPECTOS.';
  49.         END IF;
  50.     RAISE DEBUG 'r_idprospecto=%', r_idprospecto;
  51.  
  52.     SELECT INTO r_idtipotelefono  idcatalogomaestro FROM catalogomaestro WHERE  definicion='Telefono_De_Contacto';
  53.    
  54.     SELECT id INTO r_id_tel FROM telefonospersona_insert(r_idtipotelefono,p_lada,p_telefono,'teléfono de contacto para prospección',TRUE,r_idpersona) id;
  55.    
  56.     RAISE DEBUG 'r_id_tel=%', r_id_tel;
  57.    
  58.     SELECT INTO Resultado * FROM catalogoprospectos WHERE idprospecto=r_idprospecto;
  59.         IF NOT FOUND
  60.         THEN
  61.             RAISE EXCEPTION 'ERROR AL CORROBORAR REGISTRO DE PROSPECTOS.';
  62.         END IF;
  63.     RETURN Resultado;
  64. END
  65. $_$;
  66.  
  67.  
  68. ALTER FUNCTION public.prospectos_insert(CHARACTER VARYING, INTEGER, INTEGER,
  69. INTEGER, CHARACTER VARYING, CHARACTER VARYING, CHARACTER VARYING, INTEGER, INTEGER,
  70.  CHARACTER VARYING, text, CHARACTER VARYING, CHARACTER VARYING, INTEGER) OWNER TO
  71.  postgres;


[/PHP]

Última edición por gnzsoloyo; 21/11/2013 a las 15:24 Razón: MUY mal etiquetado. SQL NO ES PHP.
  #2 (permalink)  
Antiguo 21/11/2013, 15:53
Avatar de kike00  
Fecha de Ingreso: febrero-2005
Ubicación: El Salvador
Mensajes: 180
Antigüedad: 19 años, 2 meses
Puntos: 7
Respuesta: funcion con varios inserts

Hola,

para comenzar deberías de leer un poco sobre los tipos de datos en Oracle y hagas tú una comparación entre ambos motores. Por ejemplo, si en postgresql usabas Interger para los numeros enteros, en Oracle puedes usar NUMBER, o para cadenas usar VARCHAR2 y así... eso es lo más básico que debes ver.

Nunca he trabajado con procedimientos almacenados/funciones en Postgresql, pero al menos en Oracle si creas una función debes crearla dentro de un paquete. Los paquetes son objetos contenedores, tanto de funciones como procedimientos.

Código SQL:
Ver original
  1. CREATE OR REPLACE
  2. package MI_PAQUETE_PKG IS
  3.  
  4.     FUNCTION MI_FUNCION(PARAM1 NUMBER,
  5.                         PARAM2 VARCHAR2) RETURN VARCHAR2;
  6.  
  7.  
  8.     FUNCTION MI_FUNCION2(PARAM1 NUMBER,
  9.                          PARAM2 VARCHAR2) RETURN VARCHAR2;
  10.  
  11. END MI_PAQUETE_PKG;
[/CODE]


Código SQL:
Ver original
  1. CREATE OR REPLACE
  2. PACKAGE BODY MI_PAQUETE_PKG AS
  3.  
  4.   FUNCTION MI_FUNCION(PARAM1 NUMBER,
  5.                       PARAM2 VARCHAR2) RETURN VARCHAR2 AS
  6.     V_VAR1 VARCHAR2;
  7.  
  8.   BEGIN
  9.     PARAM1 := 2+2; --hacer alguna operación
  10.  
  11.     PARAM2 := 'hola mundo';
  12.     V_VAR1 := PARAM2 || ' HOLA'; --asignación y concatenar
  13.  
  14.     RETURN V_VAR1;
  15.  
  16.   END MI_FUNCION;
  17.  
  18.  
  19.   FUNCTION MI_FUNCION2(PARAM1 NUMBER,
  20.                       PARAM2 VARCHAR2) RETURN VARCHAR2 AS
  21.  
  22.     V_VAR1 VARCHAR2;
  23.   BEGIN
  24.     V_VAR1 := "Hola mundo":
  25.     RETURN V_VAR1;
  26.   END MI_FUNCION;
  27.  
  28. END MI_PAQUETE_PKG;
[/CODE]

Última edición por gnzsoloyo; 21/11/2013 a las 16:18 Razón: Por favor, USAR LOS HIGHLIGHT.
  #3 (permalink)  
Antiguo 22/11/2013, 08:06
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: funcion con varios inserts

El PL de postgresql y de Oracle son muy similares.
Tal como dice el compañero Kike, tiene algunas variaciones en tipos de datos que no son muy engorrosas.

Como punto aclaratorio, en oracle no necesariamente una funcion o un procedimiento deben ir dentro de un paquete. Es una buena practica, pero no es obligación. Es posible crear funciones y procedimientos directamente.

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 22/11/2013, 15:07
Avatar de xpapachox  
Fecha de Ingreso: junio-2011
Mensajes: 77
Antigüedad: 12 años, 10 meses
Puntos: 12
Respuesta: funcion con varios inserts

Hola si usas un ID de tipo enter, podrias hacer uso de una Secuencia(SEQUENCE).
Código SQL:
Ver original
  1. /*Secuencia para la tabla principal*/
  2. CREATE SEQUENCE orders_seq
  3. INCREMENT BY 1                   --> Va incrementarse de 1 en 1.
  4. START WITH 100                    --> El valor con el cual va empezar la secuencia, en tu caso seria el ultimo id de tu tabla.
  5. maxvalue 25                      --> Valor maximo
  6. nocache;                            -->No guarda dato en cache.
  7.  
  8.  
  9. /*Secuencia para la tabla detalle.*/
  10. CREATE SEQUENCE order_lines_seq START WITH 200; --> el valor que va empezar el detalle supongamos que es 200.
  11.  
  12.  
  13.  
  14.  
  15. BEGIN
  16.   -- Usar NEXTVAL para generar el siguiente id.
  17.   --orders_seq.NEXTVAL=101
  18.  
  19.   INSERT INTO orders (id, description)
  20.   VALUES (orders_seq.NEXTVAL, 'Dummy order description.');
  21.  
  22.   -- Usar CURRVAL para traer el valor actual de la secuencia de la tabla Principal y usarlo en el detalle.
  23.   --orders_seq.CURRVAL=101
  24.  
  25.   --order_lines_seq.NEXTVAL=201
  26.  
  27.   INSERT INTO order_lines (id, order_id, description)
  28.   VALUES (order_lines_seq.NEXTVAL, orders_seq.CURRVAL, 'Dummy order line description');
  29.  
  30.   COMMIT;
  31. END;
  32. /
  33.  
  34. SQL> SELECT * FROM orders ORDER BY id;
  35.  
  36.         ID DESCRIPTION
  37. ---------- --------------------------------------------------
  38.          101 Dummy ORDER description.        
  39.  
  40. 2 ROWS selected.
  41.  
  42. SQL> SELECT * FROM order_lines ORDER BY id;
  43.  
  44.         ID   ORDER_ID DESCRIPTION
  45. ---------- ---------- --------------------------------------------------
  46.        201       101 Dummy ORDER line description
  47.      
  48.  
  49. 2 ROWS selected.
  50.  
  51. SQL>

Última edición por gnzsoloyo; 22/11/2013 a las 16:44

Etiquetas: funcion
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 16:53.