miércoles, 19 de agosto de 2015

Migrar de SYBASE a ORACLE

Para migrar bases de datos de SYBASE a ORACLE, es posible hacerlo generando un ODBC para conectarlo mediante SQLStudio, tambien mediante SQLDeveloper con un JDBC descargando un complemento que llama a un archivo .jdk el cual permite realizar conexiones hacia SYBASE y SQLServer, ahora bien estos dos casos no aplican para la version de SYBASE que necesité migrar la cual es 9.1 Adaptive Server Anywhere, por lo que generé un bcp (bulk copy) de las tablas enviándolas a un archivo en texto plano separado por comas (.csv), y mediante SQLDeveloper realicé la migración, como se muestra a continuación:

Pasos para migrar de SYBASE a ORACLE

-->Generar los archivos de texto plano csv con cabecera
-->Adecuar los tipos de datos de SYBASE a ORACLE
-->Generar los DDL´S en la nueva base ORACLE
-->Buscar las tablas en SQLDEVELOPER (ORACLE)




-->Click derecho Importar Datos


-->Buscamos el archivo csv en Examinar




-->Elegimos la Codificacion que se adecue a nuestra necesidad x-UTF-16LE-BOM


-->En su defecto UTF-8 (la mas común y compatible)


-->Siguiente


-->Seleccionamos el Orden de las columnas



-->Adecuamos el formato de Fecha 




-->Revisamos todos los datos con signo de admiracion


-->Siguiente y Terminar


-->Seguimos estos pasos para cada tabla

Si tienes dudas para este u otro método para migrar, escribe en mi Blog y te responderé cuanto antes.

viernes, 17 de julio de 2015

UTL_MAIL.SEND, Enviar correos desde sql por medio de procedures

Para enviar correos por medio de procedures en Oracle, es necesario contar con la Utileria de Mail (UTL_MAIL). Es importante definir un servidor de correos previamente configurado, preguntar con Sistema Operativo o en su defecto anexar la opcion -v en el comando mailx para ejecutar el 'verbose' e identificar cual es el servidor de correos.

-->Revisar cual es nuestro servidor de correos

Al ejecutar el comando mailx con la opcion -v nos mostrara una salida como la siguiente:


nombre-servidor:oracle:PATITO: /opt/oracle $ mailx -v -s hola ltorres@algo.com.mx
.
EOT
nombre-servidor:oracle:PATITO: /opt/oracle $ ltorres@algo.com.mx... Connecting to [127.0.0.1] via relay...
220 nombre-servidor.empresa.gob.mx ESMTP Sendmail 8.14.5+Sun/8.14.5; Fri, 17 Jul 2015 09:48:20 -0500 (CDT)
>>> EHLO nombre-servidor.empresa.gob.mx
250-nombre-servidor.empresa.gob.mx Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-DELIVERBY
250 HELP
>>> VERB
250 2.0.0 Verbose mode
>>> MAIL From:<oracle@nombre-servidor.empresa.gob.mx> SIZE=59
250 2.1.0 <oracle@nombre-servidor.empresa.gob.mx>... Sender ok
>>> RCPT To:<ltorres@algo.com.mx>
>>> DATA
250 2.1.5 <ltorres@algo.com.mx>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
050 <ltorres@algo.com.mx>... Connecting to mx.algo.com.mx. via esmtp...
050 220 MX.algo.com.mx Microsoft ESMTP MAIL Service ready at Fri, 17 Jul 2015 09:40:19 -0500
050 >>> EHLO nombre-servidor.empresa.gob.mx
050 250-MX.algo.com.mx Hello [160.41.90.120]
050 250-SIZE
050 250-PIPELINING
050 250-DSN
050 250-ENHANCEDSTATUSCODES
050 250-STARTTLS
050 250-X-ANONYMOUSTLS
050 250-AUTH NTLM
050 250-X-EXPS GSSAPI NTLM
050 250-8BITMIME
050 250-BINARYMIME
050 250-CHUNKING
050 250-XEXCH50
050 250-XRDST
050 250 XSHADOW
050 >>> STARTTLS
050 220 2.0.0 SMTP server ready
050 >>> EHLO nombre-servidor.empresa.gob.mx
050 250-MX.algo.com.mx Hello [160.41.90.120]
050 250-SIZE
050 250-PIPELINING
050 250-DSN
050 250-ENHANCEDSTATUSCODES
050 250-AUTH NTLM LOGIN
050 250-X-EXPS GSSAPI NTLM
050 250-8BITMIME
050 250-BINARYMIME
050 250-CHUNKING
050 250-XEXCH50
050 250-XRDST
050 250 XSHADOW
050 >>> MAIL From:<oracle@nombre-servidor.empresa.gob.mx> SIZE=387
050 250 2.1.0 Sender OK
050 >>> RCPT To:<ltorres@algo.com.mx>
050 >>> DATA
050 250 2.1.5 Recipient OK
050 354 Start mail input; end with <CRLF>.<CRLF>
050 >>> .
050 250 2.6.0 <201507171448.t6HEmJmT021843@nombre-servidor.empresa.gob.mx> [InternalId=1734250] Queued mail for delivery
050 <ltorres@algo.com.mx>... Sent (<201507171448.t6HEmJmT021843@nombre-servidor.empresa.gob.mx> [InternalId=1734250] Queued mail for delivery)
250 2.0.0 t6HEmKOt021844 Message accepted for delivery
ltorres@algo.com.mx... Sent (t6HEmKOt021844 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 nombre-servidor.empresa.gob.mx closing connection


El nombre del servidor de correo aparece como MX.algo.com.mx


--->Revisar si esta habilitada la Utileria de Mail

--Ir a sql y ejecutar lo siguiente

desc UTL_MAIL

Si aparece que no existe el objeto entonces:


-->Instalar las siguientes librerias

--Ir a sql y ejecutar lo siguiente

@?/rdbms/admin/utlmail.sql
@?/rdbms/admin/prvtmail.plb


--->Anexar el servidor SMTP con el servidor de correos antes mancionado y el puerto default 25

ALTER SYSTEM SET smtp_out_server='MX.algo.com.mx:25' SCOPE=BOTH;


--->El usuario dueño del procedure necesita permisos sobre la Utileria de Mail (UTL_MAIL)

GRANT execute ON utl_mail TO USUARIO;


--->Ejemplos de como mandar mensajes con esta Utileria de Mail

Ejemplo 1

exec UTL_MAIL.SEND(sender=>'Seguridad@empresa.com', recipients=>'ltorres@algo.com.mx', subject=>'Testmail', message => 'Hola');


Ejemplo 2

create or replace PROCEDURE ltorresin
IS
    mailhost    VARCHAR2(64) := 'MX.algo.mx';
    sender      VARCHAR2(64) := 'Seguridad@empresa.com';
    recipient   VARCHAR2(64) := ''ltorres@algo.com.mx';
    mail_conn  utl_smtp.connection;
BEGIN
    mail_conn := utl_smtp.open_connection(mailhost,25);
    utl_smtp.helo(mail_conn, mailhost);
    utl_smtp.mail(mail_conn, sender);
    utl_smtp.rcpt(mail_conn, recipient);
    utl_smtp.open_data(mail_conn);
    utl_smtp.write_data(mail_conn, 'This is a test message.' || chr(20));
    utl_smtp.write_data(mail_conn, 'This is line 2.' || chr(20));
    utl_smtp.close_data(mail_conn);
    utl_smtp.quit(mail_conn);
    
END;
/


Ejemplo 3


begin
UTL_MAIL.send(
sender => 'Seguridad@empresa.com',
recipients => 'ltorres@algo.com.mx',
subject => 'Advertencia',
message => 'Este es un mensaje de prueba');
end;
/


miércoles, 1 de julio de 2015

Instalar Apache en solaris/Linux para crear paginas web


Para crear paginas web dentro de un entorno Solaris o Linux (Redhat 6.4 Santiago) es necesario instalar y habilitar Apache, para ello hacemos lo siguiente:

***ESTE EJEMPLO SE REALIZO DESDE MAQUINAS VIRTUALES SOLARIS/REDHAT  Y LAS PAGINAS WEB SE ABRIERON DESDE LA PC FISICA CON WINDOWS***


Instalacion en Solaris

-->Agregar el paquete
pkgadd -d /cdrom/sol_10_113_x86/Solaris_10/Product  SUNWapchr SUNWapchu SUNWapchd

-->Deshabilitar el START y STOP del run control que se instala como parte del SUNWapchr package
Listar los scripts de runcontrol del Apache
Renombrar los scripts de runcontrol del Apache
Verificar que todos los scripts sean renombrados

ls -1 /etc/rc?.d/*apache

mv /etc/rc0.d/K16apache  /etc/rc0.d/k16apache
mv /etc/rc1.d/K16apache  /etc/rc1.d/k16apache
mv /etc/rc2.d/K16apache  /etc/rc2.d/k16apache
mv /etc/rc3.d/S50apache  /etc/rc3.d/s50apache
mv /etc/rcS.d/K16apache  /etc/rcS.d/k16apache


-->>copiar las carpetas con otro nombre

cp -p /etc/apache2/httpd.conf-example /etc/apache2/httpd.conf

cp -p /etc/apache/httpd.conf-example /etc/apache/httpd.conf

-->>Para revisar estatus/iniciar/deshabilitar los servicios de http

svcs http
svcadm enable http
svcadm disable http


-->Agregar al /etc/hosts un nombre para la ip 127.0.0.1 y asi ingresar a firefox con ese nombre

127.0.0.1 lnxsgcpdev --por ejemplo

-->> o en su defecto

10.6.100.113     lnxsgcpdev.com      loghost


-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-


Instalacion en linux

-->Ingresar a la unidad de instalacion para ver los paquetes

[root@lnxsgcpdev Packages]# pwd
/mnt/cdrom/Packages


-->Agregar los siguientes paquetes

 rpm -ivh apr-1.3.9-5.el6_2.x86_64.rpm
 rpm -ivh apr-util-1.3.9-3.el6_0.1.x86_64.rpm
 rpm -ivh apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm
 rpm -ivh httpd-tools-2.2.15-26.el6.x86_64.rpm
 rpm -ivh httpd-2.2.15-26.el6.x86_64.rpm


-->Para habilitar los servicios de http

 chkconfig httpd on

 /etc/init.d/httpd start


 --->verificar el etc/hosts de linux y windows y agregar la linea del host 10.6.100.113     lnxsgcpdev.com      loghost

 [root@lnxsgcpdev Packages]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.6.100.113     lnxsgcpdev.com      loghost


En Windows


C:\Windows\System32\drivers\etc

Abrir el archivo hosts y editarlo



# localhost name resolution is handled within DNS itself.
# 127.0.0.1       localhost
# ::1             localhost
10.6.100.113        lnxsgcpdev.com


--->Ingresar desde el browser (Chrome,Firefox,etc)

http://lnxsgcpdev.com


--->Comentar las lineas del /etc/httpd/conf.d/welcome.conf

vi /etc/httpd/conf.d/welcome.conf

#
# This configuration file enables the default "Welcome"
# page if there is no default index page present for
# the root URL.  To disable the Welcome page, comment
# out all the lines below.
#
#<LocationMatch "^/+$">
#    Options -Indexes
#    ErrorDocument 403 /error/noindex.html
#</LocationMatch>
#
~


--->Agregar en /var/www/html una pagina web

[root@lnxsgcpdev html]# ls -ltrh
total 60K
-rw-r--r-- 1 root root 56K Jul  1 10:06 ichii.jpg
-rw-r--r-- 1 root root 674 Jul  1 10:07 some.html

--->EntraR desde el browser indicando la pagina que acabamos de agregar anteponiendo una "/"


http://lnxsgcpdev.com/some.html








viernes, 26 de junio de 2015

Como montar un cdrom en una maquina virtual linux redhat

Para montar un cdrom en una maquina virtual linux redhat debemos identificar el dispositivo que lo controla y entonces montar el dispositivo en una ruta o directivo previamente creado:


Listamos el dispositivo del cdrom:

[root@lnxsgcpdev shm]# more /proc/sys/dev/cdrom/info
CD-ROM information, Id: cdrom.c 3.20 2003/12/17

drive name:             sr1     sr0
drive speed:            32      32
drive # of slots:       1       1
Can close tray:         1       1
Can open tray:          1       1
Can lock tray:          1       1
Can change speed:       1       1
Can select disk:        0       0
Can read multisession:  1       1
Can read MCN:           1       1
Reports media changed:  1       1
Can play audio:         1       1
Can write CD-R:         0       0
Can write CD-RW:        0       0
Can read DVD:           1       1
Can write DVD-R:        0       0
Can write DVD-RAM:      0       0
Can read MRW:           1       1
Can write MRW:          1       1
Can write RAM:          1       1

Montamos el dispositivo sr1 en /mnt/cdrom

[root@lnxsgcpdev shm]# mount /dev/sr1 /mnt/cdrom
mount: block device /dev/sr1 is write-protected, mounting read-only

Ahora el dispositivo se encuentra listo para ser utilizado.

jueves, 11 de junio de 2015

dbando agregar y formatear un disco Solaris en VirtualBox

En un ambiente linux es facil y mas entendible agregar discos, particionarlos y montarlos. En un ambiente Solaris es muy diferente por lo cual hago este post, la metodologia es la siguiente:



Agregar un nuevo disco a VirtualBox Solaris

-->Apagar la maquina virtual

-->Ir al administrador de maquinas virtuales (VirtualBox)

-->Click derecho Configurar (a la maquina virtual que deseamos a gregar un disco)

-->Almacenamiento

-->Controlador SATA

-->Agregar un disco duro

-->Crear nuevo disco

-->seleccionar el tipo de disco (en este caso VMDK )

-->seleccionar el tipo de almacenamiento (en este caso Tamaño fijo)

-->Escribir el nombre del disco

-->Elegir el tamaño del disco

-->Crear

-->Iniciar la maquina virtual

-->Loguearse como root (super usuario)

-->Ingresar los siguientes comandos

devfsadm -->Nos permitira reescanear los dispositivos disponibles
format -->Nos mostrara los discos disponibles 

AVAILABLE DISK SELECTIONS:
       0. c0d0 <Úxäþ¢ÿþ©ÿþ¬@©üþ cyl 2085 alt 2 hd 255 sec 63>
          /pci@0,0/pci-ide@1,1/ide@0/cmdk@0,0
       1. c2t0d0 <ATA    -VBOX HARDDISK  -1.0  cyl 3341 alt 2 hd 224 sec 56>
          /pci@0,0/pci8086,2829@d/disk@0,0
Specify disk (enter its number):

-->Seleccionar el disco que acabamos de anexar, para estar seguros de cual es.
-->seleccionamos un numero (0 o 1 en este caso), he seleccionado el 0 para probar lo siguiente:

##En caso de que el disco ya este ocupado aparecera algo similar a esto:
 
 Specify disk (enter its number): 0
selecting c0d0
Controller working list found
[disk formatted, defect list found]
Warning: Current Disk has mounted partitions.
/dev/dsk/c0d0s0 is currently mounted on /. Please see umount(1M).
/dev/dsk/c0d0s1 is currently used by swap. Please see swap(1M).
/dev/dsk/c0d0s7 is currently mounted on /export/home. Please see umount(1M).


-->Ahora verificamos la opcion 1:

format

Searching for disks...
Inquiry failed for this logical diskdone


AVAILABLE DISK SELECTIONS:
       0. c0d0 <Úxäþ¢ÿþ©ÿþ¬@©üþ cyl 2085 alt 2 hd 255 sec 63>
          /pci@0,0/pci-ide@1,1/ide@0/cmdk@0,0
       1. c2t0d0 <ATA    -VBOX HARDDISK  -1.0 cyl 3340 alt 2 hd 224 sec 56>
          /pci@0,0/pci8086,2829@d/disk@0,0
-->Selccionamos 1
Specify disk (enter its number): 1
selecting c2t0d0
[disk formatted]


FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
-->Generamos la particion con el comando partition

format> partition


PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit

##Para simplificar, vamos a hacer el segmento 0 del tamaño de la unidad completa con la opcion modify.
##Seleccionaos la opción de "All Free Hog", que debería ser la opción 1, y pulse ENTER.


partition> modify
Select partitioning base:
        0. Current partition table (original)
        1. All Free Hog
-->Seleccionamos la opcion 1
Choose base (enter number) [0]? 1

Part      Tag    Flag     Cylinders        Size            Blocks
  0       root    wm       0               0         (0/0/0)           0
  1       swap    wu       0               0         (0/0/0)           0
  2     backup    wu       0 - 3339       19.98GB    (3340/0/0) 41896960
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6        usr    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        6.12MB    (1/0/0)       12544
  9 alternates    wm       0               0         (0/0/0)           0
Do you wish to continue creating a new partition

-->Seleccionamos yes
table based on above table[yes]? yes
Free Hog partition[6]? 0
Enter size of partition '1' [0b, 0c, 0.00mb, 0.00gb]:
Enter size of partition '3' [0b, 0c, 0.00mb, 0.00gb]:
Enter size of partition '4' [0b, 0c, 0.00mb, 0.00gb]:
Enter size of partition '5' [0b, 0c, 0.00mb, 0.00gb]:
Enter size of partition '6' [0b, 0c, 0.00mb, 0.00gb]:
Enter size of partition '7' [0b, 0c, 0.00mb, 0.00gb]:

Part      Tag    Flag     Cylinders        Size            Blocks
  0       root    wm       1 - 3339       19.97GB    (3339/0/0) 41884416
  1       swap    wu       0               0         (0/0/0)           0
  2     backup    wu       0 - 3339       19.98GB    (3340/0/0) 41896960
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6        usr    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        6.12MB    (1/0/0)       12544
  9 alternates    wm       0               0         (0/0/0)           0

-->Seleccionamos yes
Okay to make this the current partition table[yes]? yes
Enter table name (remember quotes): disk_prueba1

--Seleccionamos yes
Ready to label disk, continue? yes

-->Salimos de partition con quit
partition> quit


FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
-->Guardamos los cambios en format con save

format> save
Saving new disk and partition definitions
Enter file name["./format.dat"]: /etc/format.dat

-->Salimos del format
format> quit

-->Creamos el nuevo filesystem
# newfs /dev/rdsk/c2t0d0s0

-->Selccionamos yes
newfs: construct a new file system /dev/rdsk/c2t0d0s0: (y/n)? yes
Warning: 5376 sector(s) in last cylinder unallocated
/dev/rdsk/c2t0d0s0:     41884416 sectors in 6818 cylinders of 48 tracks, 128 sectors
        20451.4MB in 427 cyl groups (16 c/g, 48.00MB/g, 5824 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
 32, 98464, 196896, 295328, 393760, 492192, 590624, 689056, 787488, 885920,
Initializing cylinder groups:
........
super-block backups for last 10 cylinder groups at:
 40997024, 41095456, 41193888, 41292320, 41390752, 41489184, 41587616,
 41686048, 41784480, 41882912
 
-->Montamos el disco en una ruta previamente creada (mkdir /opt/oracle)
# mount /dev/rdsk/c2t0d0s0 /opt/oracle
mount: /dev/rdsk/c2t0d0s0 not a block device ---Es necesario montar desde /dev/dsk

-->Ejecutamos la sentencia correcta
# mount /dev/dsk/c2t0d0s0 /opt/oracle

-->Revisamos que el filesystem este creado
# df -h .
Filesystem   

/dev/dsk/c2t0d0s0       20G    20M    19G     1%    /opt/oracle



  
 Saludos!












lunes, 8 de junio de 2015

dbando Trigger que mata sesiones atrapadas

Buen dia,


El siguiente Trigger mata sesiones de usuarios atrapadas, lo hace de manera automatica, esto en caso de que nuestra solucion al perder conexion por lluvia, apagones, etc no pueda matar las sesiones en automatico, y si tenemos reestriccion en el numero de sesiones por usuario, este Trigger nos ayudara mucho.

El codigo es el siguiente:


CREATE OR REPLACE TRIGGER KILL_SESSIONS_LETG
AFTER LOGON ON DATABASE
DECLARE

--Declaracion de variables

  t_prog sys.v_$session.program%TYPE;
  v_numsid integer;
  v_sid sys.v_$session.sid%TYPE;
  v_serial sys.v_$session.serial#%TYPE;
  sidd integer;
  seriall integer;
  sid2 integer;
  serial2 integer;
  v_user varchar2(20);
    
BEGIN

--Se evita el error comun de procesos background de oracle

  SELECT count(PROGRAM)
  into t_prog
  from sys.v_$session
  where program like 'oracle@osgc-oracle (J00%)'
  AND audsid = USERENV('SESSIONID')
  AND  ROWNUM = 1;
  
  IF t_prog >0
  
  THEN
  
  NULL;
    
  ELSE
  
  --Se obtiene el usuario del sesion actual
  
  SELECT username,sid,serial#
  INTO v_user,v_sid,v_serial
  FROM sys.v_$session
  WHERE  audsid = USERENV('SESSIONID')
  AND  audsid != 0 
  AND  ROWNUM = 1;  
  
 --Se generan los usuarios que no se veran afectados por el trigger

     IF UPPER(v_user)='ADMON' OR
     UPPER(v_user)='BATCH' OR
     UPPER(v_user)='CESFI2014' OR
     UPPER(v_user)='PERRITO'
  
  THEN
NULL;

ELSE

--Se estima el valor maximo de conexiones a la base de datos
--en general este trigger es para soluciones donde las sesiones 
--quedan atrapadas y es necesario desconectar usuarios

 select count(sid)
 into v_numsid
 from v$session
 where username=v_user
 and program like 'opensgc%';

 IF v_numsid >2
  
 THEN

 --Hacemos la comparacion para no matar nuestra sesion actual
  select sid,serial#
  into sidd,seriall
  from v$session
  where username=v_user 
  and sid != v_sid
  AND serial# != v_serial
  and program like 'programa_con_el_que_nos_conectamos%'
  and rownum=1;
  
  --EXECUTE IMMEDIATE 'alter system kill session ''' || sidd || ',' || seriall || '''';
  EXECUTE IMMEDIATE 'alter system disconnect session ''' || sidd || ',' || seriall || '''immediate';
  
  
  --Hacemos la comparacion para no matar nuestra sesion actual
  select sid,serial#
  into sid2,serial2
  from v$session
  where username=v_user 
  and sid != v_sid
  AND serial# != v_serial
  and program like 'programa_con_el_que_nos_conectamos2%'
  and rownum=1;
  
  --EXECUTE IMMEDIATE 'alter system kill session ''' || sidd || ',' || seriall || '''';
  EXECUTE IMMEDIATE 'alter system disconnect session ''' || sidd || ',' || seriall || '''immediate';
  
  ELSE

 NULL;

END IF;
 END IF;
  END IF;
END;
/



Saludos!!