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

insert con select en pl sql

Estas en el tema de insert con select en pl sql en el foro de Oracle en Foros del Web. Hola. Soy nuevo en plsql y estoy intentado hacer un insert con select en un procedimiento de pl sql @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original ...
  #1 (permalink)  
Antiguo 25/07/2013, 04:31
 
Fecha de Ingreso: marzo-2013
Mensajes: 2
Antigüedad: 11 años, 1 mes
Puntos: 0
insert con select en pl sql

Hola.

Soy nuevo en plsql y estoy intentado hacer un insert con select en un procedimiento de pl sql
Código SQL:
Ver original
  1. PROCEDURE INSERTAMAPEO(
  2.   PCO_CATEGORIA       IN    WEBCATEGORIAMAP.CO_CATEGORIA%TYPE,
  3.   PCO_CATEGORIA_SAP   IN    WEBCATEGORIAMAP.CO_CATEGORIA_SAP%TYPE
  4.   )AS
  5.   AUX WEBCATEGORIAMAP.CO_CATEGORIA_SAP%TYPE;
  6.   BEGIN
  7.     aux:= concat(PCO_CATEGORIA_SAP,'%');
  8.     INSERT  INTO WEBCATEGORIAMAP  VALUES (PCO_CATEGORIA, (SELECT co_categoria_sap FROM webcategoriasap WHERE co_categoria_sap LIKE AUX));
  9.    
  10.   END INSERTAMAPEO;
Me dice single row subquery returns more than one row

Yo quiero insertar todas las rows que devuelve.
Alguien me puede ayudar y decirme que hago mal.

Se que deberia sacar la subquery pero no se como, me da errores cuando la saco.
Gracias.

Última edición por gnzsoloyo; 25/07/2013 a las 04:47
  #2 (permalink)  
Antiguo 25/07/2013, 04:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: insert con select en pl sql

Esto es sintaxis de Oracle, no de MySQL (el lenguaje procedural es distinto entre DBMS).

Movido a Foro de Oracle.

En cuanto a tu problema, es simple: La subconsulta que pones en el VALUE devuelve más de un registro, pero VALUE espera un único registro por cada bloque de datos entre paréntesis.
Te convendría un cursor y un ciclo de inserciones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 25/07/2013, 16:27
Avatar de zarwar  
Fecha de Ingreso: mayo-2013
Ubicación: Madrid
Mensajes: 77
Antigüedad: 10 años, 11 meses
Puntos: 4
Respuesta: insert con select en pl sql

Quizas pueda ayudar un poco.

Enntiendo que te compila, ya que te da un error al ejecutar el procedimiento y no al compilar.

Por otro lado como bien indica gnzsoloyo, la inserción con la sintaxis, que indicas intenta insertar un registro, pero el segundo campo de los valores devuelve mas de un valor y por eso no se lo traga.

En Oracle también existe el INSERT INTO .. SELECT con la siguiente sintaxis. Fijate, que no está el termino "VALUES":
Código SQL:
Ver original
  1. INSERT INTO tabla_a (a,b,c,d)
  2.      SELECT        tabla_b.a AS a,
  3.             tabla_b.b AS b,
  4.             tabla_b.c AS c,
  5.             '0' AS d
  6.         FROM tabla_b;

Por lo que se podría adaptar al procedimiento utilizando algo parecido a:
Código SQL:
Ver original
  1. INSERT INTO WEBCATEGORIAMAP (PCO_CATEGORIA,co_categoria_sap)
  2.    SELECT PCO_CATEGORIA,
  3.           co_categoria_sap
  4.      FROM webcategoriasap
  5.     WHERE co_categoria_sap LIKE PCO_CATEGORIA_SAP||'%';

Tiene un problema si existen muchos registros, aunque es bastante eficiente.

Un saludo
__________________
Entra en mi blog sobre base de datos Oracle:
http://mundodb.es
  #4 (permalink)  
Antiguo 26/07/2013, 04:02
 
Fecha de Ingreso: julio-2013
Mensajes: 10
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: insert con select en pl sql

Deberías hacer un cursor o un registro y iterar sobre los resultados de la select y dentro del bucle que te vaya metiendo todos los registros de la select.

Etiquetas: insert, mysql, select, sql
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 06:32.