On Jun 6, 1:03 pm, charly <augustoada...@gmail.com> wrote:
> Hello friends, I am currently starting in the area of pl / sql.  I wonder
> if anyone could give me a hand with a situation. I' am creating a procedure
> that updates  TARGET TABLE. In case it finds new records in the BASE TABLE.
> If there is something new in the BASE TABLE, i have to insert the new
> records in the TARGET TABLE.
>
> To acomplish this I have done the following:
>
> PROCEDURE automatizacion_celdas
>  (
>  )
>
> IS
>
>                   -----VARIABLES DEL PROCEDIMIENTO-----
>
>    v_id       it_bi.cnf_cellsite_optima.id%type;
>    v_nombre           it_bi.cnf_cellsite_optima.nombre%type;
>    v_latitude           it_bi.cnf_cellsite_optima.latitude%type;
>    v_longitud           it_bi.cnf_cellsite_optima.longitude%type;
>    v_opid           it_bi.cnf_cellsite_optima.opid%type;
>    v_opnombre         it_bi.cnf_cellsite_optima.opnombre%type;
>    v_tecnologia         it_bi.cnf_tr_celdas_optima.tecnologia%type;
>    v_provincia          it_bi.cnf_tr_celdas_optima.cod_provincia%type;
>    v_ciudad             it_bi.cnf_tr_celdas_optima.cod_ciudad%type;
>    v_descripcion        it_bi.cnf_tr_celdas_optima.cell_description%type;
>    v_count              number;
>    v_etapa              it_brain.flw_proceso_log.etapa%TYPE;
>    v_cod_etapa          it_brain.flw_proceso_log.cod_etapa%TYPE;
>
> BEGIN
>
>     po_cod_err      := 'DWH-00000'; --.AUTOMATIZACION_CELDAS: Error
> al actualizar datos
>
>                 UPDATE celdas c
>                     Set
>                        nombre            = (SELECT nombre From
> Tabla_base ct where ct.id = c.id AND ct.nombre <> c.nombre ),
>                        latitude            = (SELECT latitude From
> Tabla_base ct where ct.id = c.id AND ct.latitude <> c.latitude ),
>                        longitude           = (SELECT longitude From
> Tabla_base ct where ct.id = c.id AND ct.nombre <> c.nombre ),
>                        opid            = (SELECT opid From Tabla_base
> ct where ct.id = c.id AND ct.nombre <> c.nombre ),
>                        opnombre          = (SELECT opnombre From
> Tabla_base ct where ct.id = c.id AND ct.opid <> c.opid ),
>                        tecnologia          = (SELECT tecnologia From
> Tabla_base ct where ct.id = c.id AND ct.tecnologia <> c.tecnologia ),
>                        cod_provincia       = (SELECT cod_provincia
> From Tabla_base ct where ct.id = c.id AND ct.cod_provincia <>
> c.cod_provincia ),
>                        cod_ciudad          = (SELECT cod_ciudad From
> Tabla_base ct where ct.id = c.id AND ct.cod_ciudad <> c.cod_ciudad ),
>                        cell_description    = (SELECT cell_description
> From Tabla_base ct where ct.id = c.id AND ct.cell_description <>
> c.cell_description );
>
>        po_cod_err      := 'DWH-00000'; --.AUTOMATIZACION_CELDAS:
> Error al iniciar iteración
>
>         FOR x in (select id from it_bi.cnf_tr_celdas_optima)
>         LOOP
>
>                 ---------- Inicializacion de Variables------------
>
>                 v_id        := 0;
>                 v_nombre            := 0;
>                 v_latitude            := 0;
>                 v_longitud            := 0;
>                 v_opid            := 0;
>                 v_opnombre          := 0;
>                 v_tecnologia          := 0;
>                 v_provincia           := 0;
>                 v_ciudad              := 0;
>                 v_descripcion         := 0;
>                 v_count               := 0;
>
>        Begin
>
>             -----------Busco nuevos registro en la tabla-----------------
>
>                select id, nombre, latitude, longitude, opid,
> opnombre,'Cell '|| opid ||' - '||substr(nombre, 1,11)||' -'||' GSM '
>                  into v_id,
> v_nombre,v_latitude,v_longitud,v_opid,v_opnombre, v_descripcion
>                  from Tabla_base o
>                 where  not EXISTS (select 1 from celdas t where t.id = x.id
> );
>
>            po_cod_err      := 'DWH-00000'; --.AUTOMATIZACION_CELDAS:
> Error al insertar datos
>
>                -----------inserto registros en caso de haber
> nuevos-----------------
>
>                v_count               := sql%rowcount;
>
>                 IF v_count >= 1 then
>                     insert into celdas
>                                (id,
>                                 nombre,
>                                 latitude,
>                                 longitude,
>                                 opid,
>                                 opnombre,
>                                 tecnologia,
>                                 cod_provincia,
>                                 cod_ciudad,
>                                 cell_description,
>                                 fch_inicio,
>                                 fch_fin,
>                                 estado_actual
>                                )
>                    VALUES     (v_id,
>                                v_nombre,
>                                v_latitude,
>                                v_longitud,
>                                v_opid,
>                                v_opnombre,
>                                'GSM',
>                                null,
>                                null,
>                                v_descripcion,
>                                null,
>                                null,
>                                null
>                                 );
>
>                   commit;
>
>               END IF;
>
>          end;
>
>   end loop;
>
> END;
>
> What I want is to find some function to tell me if the select bring records
> (if there are records), and if it is >= 1 then to insert the records in the
> TARGET TABLE. I'm using the sql%rowcount  and does not do what I seek . I
> will appreciate if someone can give me a guide or suggest me something.
>
> Thank you very much! I'll wait for your answers.
>
> Greetings!!

It appears you are trying to re-invent the wheel; look at the
following straight SQL example that does what you are asking:

SQL> create table empm as select * from emp where deptno = 10;

Table created.

SQL>
SQL>      merge into empm m
  2       using emp e
  3       on ( e.EMPNO = m.EMPNO )
  4       when matched then
  5           update set job='janitor' where ename='KING' ;

1 row merged.

SQL>
SQL> select * From empm;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL
COMM     DEPTNO
---------- ---------- --------- ---------- --------- ----------
---------- ----------
      7782 CLARK      MANAGER         7839 09-JUN-81
2450                    10
      7839 KING       janitor              17-NOV-81
5000                    10
      7934 MILLER     CLERK           7782 23-JAN-82
1300                    10

SQL>
SQL> rollback;

Rollback complete.

SQL>
SQL>      merge into empm m
  2       using emp e
  3       on ( e.EMPNO = m.EMPNO )
  4       when matched then
  5           update set job='janitor' where ename='KING'
  6       when not matched then
  7           insert (m.empno, m.ename, m.job)
  8           values (e.empno, e.ename, e.job)
  9           where e.deptno=20;

6 rows merged.

SQL>
SQL> select * From empm;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL
COMM     DEPTNO
---------- ---------- --------- ---------- --------- ----------
---------- ----------
      7782 CLARK      MANAGER         7839 09-JUN-81
2450                    10
      7839 KING       janitor              17-NOV-81
5000                    10
      7934 MILLER     CLERK           7782 23-JAN-82
1300                    10
      7788 SCOTT      ANALYST
      7566 JONES      MANAGER
      7902 FORD       ANALYST
      7369 SMITH      CLERK
      7876 ADAMS      CLERK

8 rows selected.

SQL>
SQL> rollback;

Rollback complete.

SQL>
SQL>      merge into empm m
  2       using emp e
  3       on ( e.EMPNO = m.EMPNO )
  4       when not matched then
  5           insert (m.empno, m.ename, m.job)
  6           values (e.empno, e.ename, e.job)
  7           where e.deptno=20
  8       when matched then
  9           update set job='janitor' where ename='KING' ;

6 rows merged.

SQL>
SQL> select * From empm;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL
COMM     DEPTNO
---------- ---------- --------- ---------- --------- ----------
---------- ----------
      7782 CLARK      MANAGER         7839 09-JUN-81
2450                    10
      7839 KING       janitor              17-NOV-81
5000                    10
      7934 MILLER     CLERK           7782 23-JAN-82
1300                    10
      7788 SCOTT      ANALYST
      7566 JONES      MANAGER
      7902 FORD       ANALYST
      7369 SMITH      CLERK
      7876 ADAMS      CLERK

8 rows selected.

SQL>

As you can see you can write the merge to process matched or unmatched
records 'first'.


David Fitzjarrell

-- 
You received this message because you are subscribed to the Google
Groups "Oracle PL/SQL" group.
To post to this group, send email to Oracle-PLSQL@googlegroups.com
To unsubscribe from this group, send email to
oracle-plsql-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/Oracle-PLSQL?hl=en

Reply via email to