Si descubres como se debe utilizar correctamente el comando UPDATE en tus PL-SQL Packages en Oracle podrás aprender a actualizar los datos en las tablas o vistas dentro de tu Base de Datos Oracle.
El comando UPDATE como su nombre lo indica, te permite modificar o actualizar la información contenida en una tabla o en una vista, dándote la posibilidad de modificar uno o varios campos a la vez en tus PL-SQL Packages en Oracle.
Cuando requieres actualizar los datos en una tabla en tus PL-SQL Packages en Oracle, el comando UPDATE te permite modificar todos los datos de la tabla o filtrar solo los que cumplen alguna condición específica.
Revisemos como es la sintaxis básica del comando UPDATE en tus PL-SQL Packages en Oracle:
/* PL-SQL Packages en Oracle */
UPDATE {table | view} [alias]
SET { columna [, columna] … = { expresión } }
[WHERE condición]
Donde:
/* PL-SQL Packages en Oracle */
UPDATE= Permite identificar la tabla o la vista que deseas actualizar en tus PL-SQL Packages en Oracle.
Table= Es el nombre de la tabla que quieres modificar.
View= Es el nombre de la vista que quieres modificar.
Alias= Es un nombre abreviado para identificar la tabla o la vista.
SET= Permite identificar las columnas de la tabla o vista que vas a actualizar en tus PL-SQL Packages en Oracle.
TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
Columna= Es el nombre de la columna que quieres actualizar.
Expresión= Corresponde al valor que vas a guardar en la columna.
WHERE= Permite identificar las condiciones para filtrar los datos que vas a actualizar en la tabla o vista definida en el UPDATE en tus PL-SQL Packages en Oracle.
Condición= Permite actualizar solo los registros que cumplan con una condición específica.
Ejemplo #1: Revisemos un ejemplo de cómo utilizar el UPDATE para actualizar la edad de un empleado, veamos como se hace:
/* PL-SQL Packages en Oracle */
Update t_empleado emp
Set emp.edad= 28
Where emp.id_empleado = pin_id_empleado;
En este ejemplo de PL-SQL Packages en Oracle solo se actualiza la edad de un empleado en particular.
Te propongo que pruebes de inmediato estos ejemplos en tu Base de Datos con tus propias tablas, PL-SQL Procedures en Oracle y PL-SQL Function en Oracle, para que comiences a ejercitar la mano y aprendas a dominar esta nueva técnica en tus PL-SQL Packages en Oracle.
Estoy muy interesado en conocer tu opinión y/o comentario sobre este artículo, también cuéntame sobre qué es lo que quieres saber de PL-SQL Packages en Oracle y/o dime cuál es tu principal frustración a la hora de trabajar con PL-SQL Packages en Oracle. Estaré muy atento respondiendo tus preguntas y/o comentarios, gracias.
Saludos
Roberto Vicencio – Escritor del Reporte:
“Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
como hago para borrar un valor de una Tabla T1, cuando ese valor se encuentra en una Tabla T2 y deban coincidir mas de un valor entre ambas tablas
Hola Wagner, gracias por comunicarte, si entiendo bien quieres borrar un registro de una tabla padre (T1) que tiene registros asociados en una tabla hija (T2), para hacer esto primero debes borrar los registros de la tabla T2 que correspondan al id del registro de la tabla T1 y finalmente borrar el id en la tabla T1, de esta forma mantendrás la consistencia de los datos.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
estoy probando con este script
UPDATE /*+BYPASS_UJVC*/
(
SELECT
T2.TRANSACTIONID A1,
T1.TRANSACTIONID A2
FROM DIARIA T1
INNER JOIN Historica T2 ON T1.id_articulo = T2.id_articulo and T1.registro=T2.registro where T2.procesada=0)
)
SET A1 = A2;
pero aun con el hint me da error
Hola Wagner, creo que tienes un paréntesis demas, pero para hacer este update prueba usar lo siguiente:
UPDATE /*+BYPASS_UJVC*/
(
SELECT
T2.TRANSACTIONID A1,
T1.TRANSACTIONID A2
FROM DIARIA T1,
Historica T2
Where T1.id_articulo = T2.id_articulo
and T1.registro=T2.registro
and T2.procesada=0
)
SET A1 = A2;
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Un saludo. Un favor como puedo hacer un update a una tabla de acuerdo a la fecha en que fue insertado ese registro en la tabla en cuestión.
Este es el query que uso:
UPDATE wf_usr_reg_icvc
SET numseqcdr = SQ_WF_REG_ICVC.nextval,
nombre_archivo_s = ‘ + outputFileName + ‘
WHERE numseqcdr is null
and tipo_llamada = ‘ + tipoLlamada + ‘;
Pero quiero que actualice esos mismos campos pero empezando desde el registro mas viejo hasta el mas actual, para ello cuento con el campo en la tabla insert_date..
Por favor tu ayuda…¡¡¡
Hola Edison, gracias por comunicarte, el problema que quieres resolver tiene sus complicaciones pero nada que no tenga solución, te mando la forma de como lo resolvi, debes hacer algo como esto:
UPDATE ( Select numseqcdr, nombre_archivo_s
From wf_usr_reg_icvc
WHERE numseqcdr is null
and tipo_llamada = ‘ + tipoLlamada + ‘
Order by insert_date
) dat
SET dat.numseqcdr = SQ_WF_REG_ICVC.nextval,
dat.nombre_archivo_s = ‘ + outputFileName + ‘;
Fíjate que la subquery ordena los datos de forma ascendente, asi consigues lo que necesitas, espero que te sirva.
PD: Ya obtuviste mi reporte gratuito sobre ‘Cómo Construir un SELECT Eficiente en Oracle en Solo 7 Pasos’, si aun no lo has hecho reclama el tuyo haciendo clic aquí:
https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
GRACIAS 🙂
Hola Anthony, gracias por comunicarte y por tu comenario.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Mi pregunta es como puedo optimizar un update para 5 millones de registros, es factible un bulk collect??
Que tal Gibran, gracias por comunicarte, claro que si es factible usar un bulk collect ya que manejar datos en estructuras es mucho mas rápido, pero también te recomiendo que revises que el update no este haciendo full en una de las tablas que usas, gracias.
PD: Si te gusto este artículo te invito a que compartas este enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar esta información, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito on Oracle.
https://dominatuspackagesen0racle.com/
Hola Roberto, te felicito por todo el material que publicas; es muy didáctico.
Ahora bien quisiera realizarte la consulta siguiente: Al realizar la actualización de 26 millones de registros, utilizando oracle developer 4, aparece el error IO Error: Conection reset Vendor code 17002 después de cierto tiempo. Es posible que la forma en que se realiza el UPDATE ocasione este error? Saludos cordiales y gracias por la atención prestada.
Hola Eris, gracias por comunicarte y por tu comentario, respecto del error que indicas este no esta relacionado con el Update, mas bien es un problema en tu archivo tnsnames.ora, te aconsejo que revises el puerto y el nombre del host de la conexión el que por ejemplo no debe ser ‘localhost’ que muchas veces es el predeterminado por Developer, gracias.
PD: Si te han gustado los artículos te invito a que compartas el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar esta información, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
como puedo actualizar 2 campos de una tabla X con respecto al agrupado de una tabla Y y que se relacionan mediante un campo.
Hola Janet, gracias por comunicarte, para hacer ese update primero debes hacer obtener los datos de tu tabla Y y luego hacer el update a la tabla X por el campo relación, algo como lo siguiente:
select campo_1, campo_2, campo_relacion
into v_campo_1, v_campo_2, v_campo_relacion
from tabla_y;
update tabla_x
set campo_1= v_campo_1,
campo_2= v_campo_2,
where campo_relacion = v_campo_relacion;
PD: Ya pudiste ver mi libro reporte sobre ‘Cómo Crear un SELECT Eficiente en ORACLE en Solo 7 Pasos’, si aun no lo tienes en tus manos puedes obtenerlo desde aquí: https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Buenas,
Podrias ayudarme con un pequeño problema? Te lo agradeceria mucho:
Estoy tratando de hacer un Update a un campo (id_pago(clave foranea)) de la tabla Curso1 (que actualmente esta null) este campo(numerico) debera tener un 1, 2 o 3, si la persona pago la matricula (1) o si hizo un pago parcial(2) o si no ha pagado(3). La tabla Pago tiene la info de las personas que han pagado la matricula o han hecho un pago parcial.
Tengo esto:
Update Curso1 C
Set c.id_pago=case when c.valorcurso=p.valorpagado then ‘1’
when c.valorcurso>p.valorpagado then ‘2’
else ‘3’ end
from Curso1 c full outer join Pago p
on c.id_persona=p.id_persona and c.id_colegio=p.id_colegio;
de antemano muchas gracias.
Hola Carlos, gracias por comunicarte, dentro de un update no puedes usar un from, para este caso lo mejor es hacer un cursor a la tabla de pago y cuando lo leas debes ir haciendo el update, algo como lo siguiente:
Update Curso1 C
Set c.id_pago=case when c.valorcurso=cursor_reg.valorpagado then ‘1’
when c.valorcurso>cursor_reg.valorpagado then ‘2’
else ‘3’ end
where c.id_persona=cursor_reg.id_persona
and c.id_colegio=cursor_reg.id_colegio;
En este enlace explico como usar un cursor:
https://dominatuspackagesen0racle.com/como-se-debe-utilizar-un-cursor-en-tus-pl-sql-procedures-en-oracle.html
PD: Ya viste mi guía sobre “Cómo Crear SELECT Eficientes en ORACLE en Solo 7 Pasos”, si aun no la tienes en tus manos puedes obtenerla gratis desde aquí: https://dominatuspackagesen0racle.com/cmrz
PD2: Si te ha gustado lo que has visto del blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/cmbl/ con tus amigos o personas que también les pueda interesar ver esta información, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Buen dia quisiera saber donde es el error ya que no me cambia los registros y no logro ver la insercion en la otra tabla ,si me corrigen por favor
create or replace package body esquema.name is
Procedure actualizar_ccosto(p_empresa in number,
p_codigo_alfanumerico in VARCHAR2,
p_sub_codigo in number,
p_ccosto in number) is
Cursor c_art is
select *
from stk_articulo a
where a.art_cod_alfanumerico = p_codigo_alfanumerico
and a.art_ccosto_act = p_ccosto
and a.art_sub_codigo_act = p_sub_codigo;
v_ccosto_ant number;
Begin
— raise_application_error(-20005, p_ccosto);
for c in c_art loop
–se cargan los datos en el historico
v_ccosto_ant := c.art_ccosto_act;
— v_ccosto_ant := p_ccosto;
Begin
update stk_articulo a
set a.art_ccosto_act = p_ccosto
where a.art_empr = p_empresa
–and a.art_codigo =c.art_codigo
and a.art_cod_alfanumerico = c.art_cod_alfanumerico;
–and a.art_cod_alfanumerico = p_codigo_alfanumerico;
commit;
exception
when others then
raise_application_error(-20001, sqlerrm);
end;
insert into act_articulo_hist
( –hart_ejercicio,
hart_codigo,
hart_cod_alfanumerico,
hart_sub_codigo,
hart_empr,
hart_suc,
hart_ubic,
hart_ccosto,
hart_categ,
hart_desc,
hart_fec_compra,
hart_val_compra,
hart_vida_util,
hart_vida_util_inic,
hart_val_rev_ej_ant,
hart_coef_rev,
hart_val_revaluado,
hart_cuota_deprec_anual,
hart_vida_util_restante,
hart_val_neto_cierre,
hart_deprec,
hart_rev_acum,
hart_deprec_acum,
hart_dis_acum,
hart_aum_acum,
hart_fec_baja,
hart_val_baja,
hart_oper_baja,
hart_clave_fin_doc,
hart_obs,
hart_val_neto_inicial,
hart_cuo_dep_anual_ant)
values
( –1,
c.art_codigo,
c.art_cod_alfanumerico,
c.art_sub_codigo_act,
c.art_empr,
c.art_suc_act,
c.art_ubic_act,
v_ccosto_ant,
c.art_categ_act,
c.art_desc,
c.art_fec_compra_act,
c.art_val_compra_act,
c.art_vida_util_act,
c.art_vida_util_inic_act,
c.art_val_rev_ej_ant_act,
c.art_coef_rev_act,
c.art_val_revaluado_act,
c.art_cuota_deprec_anual_act,
c.art_vida_util_restante_act,
c.art_val_neto_cierre_act,
c.art_deprec_act,
c.art_rev_acum_act,
c.art_deprec_acum_act,
c.art_dis_acum_act,
c.art_aum_acum_act,
c.art_fec_baja_act,
c.art_val_baja_act,
c.art_oper_baja_act,
c.art_clave_fin_doc_act,
c.art_obs_act,
c.art_val_neto_inicial_act,
c.art_cuo_dep_anual_ant_act);
end loop;
commit;
exception
when others then
raise_application_error(-20002, sqlerrm);
end;
end;