Acceso a una bbdd MSAccess desde Oracle.


Es posible acceder a bases de datos no oracle de forma transparente con Oracle Transparent Gateways.

Esta funcionalidad permite configurar una entrada DNS de ODBC como si se tratara de un servicio Oracle cualquiera. De este modo, mediante un dblink, un usuario podría acceder a una tabla de una base de datos access (o SQLServer o MySQL, por ejemplo) desde una query o desde PL/SQL.

La arquitectura de servicios heterogeneos se basa en la siguiente configuración:

Se especifica una entrada de TNS en el fichero tnsnames.ora que resuelva una conexión al host, puerto y nombre de servicio determinado, con el parámetro HS=OK (Oracle Heterogeneous Services).

Por otro lado, el listener destino tiene definido para ese servicio la invocación a un programa llamado «hsodbc» que, mediante un fichero de parámetros llamado init.ora accede al DNS asociado a la base de datos MSAccess concreta.

De este modo, y creando un dblink, cualquier usuario podría hacer una select que cruzara datos de su esquema Oracle y de una bbdd Access.

PASOS A SEGUIR
1.- Instalar en el diccionario los servicios heterogeneos.
2.- Configurar el tnsnames.ora
3.- Configurar el listener.
4.- Comprobar que el listener y el tnsnames.ora funcionan correctamente.
5.- Configurar el ODBC para la bbdd access.
6.- Crear el DBLINK hacia la bbdd access.
7.- Crear el fichero init.ora
8.- Ejecutar una consulta mediante ese dblink.


1.- Instalar en el diccionario los servicios heterogeneos
@?/rdbms/admin/caths.sql

NOTA: puede que estas vistas estén instaladas ya en la bbdd.

2.- Configurar el tnsnames.ora
bbdd_access =
   (DESCRIPTION=
      (ADDRESS= (PROTOCOL=tcp)
               (HOST=192.168.2.4)
               (PORT=1521)
     )
     (CONNECT_DATA =
         (SERVICE_NAME=odbc_access)
     )
     (HS = OK)
)

3.- Configurar el listener. (la entrada en negrita es la que hay que añadir)…

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
      )
      (ADDRESS_LIST =
         (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.4)(PORT = 1521))
      )
    )
  )

SID_LIST_LISTENER =
   (SID_LIST =
    (SID_DESC =
       (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:oracleora92)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = D:oracleora92)
      (SID_NAME = orcl)
    )
     (SID_DESC =
      (ORACLE_HOME = D:oracleora92)
      (SID_NAME = odbc_access)
       (PROGRAM = hsodbc)
    )
  )

4.- Comprobar que el listener y el tnsnames.ora funciona correctamente.

C:Documents and SettingsAdministrador>tnsping bbdd_access

TNS Ping Utility for 32-bit Windows: Version 9.2.0.1.0 – Production on 08-SEP-2006 18:19:42

Copyright (c) 1997 Oracle Corporation.  All rights reserved.

Archivos de parßmetros utilizados:
D:oracleora92networkadminsqlnet.ora

Adaptador TNSNAMES utilizado para resolver el alias
Attempting to contact (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=192.168.2.4) (PORT=1521)) (CONNECT_DATA = (SERVICE_NAME=odbc_access)) (HS = OK))
Realizado correctamente (50 mseg)

5.- Configurar el ODBC para la bbdd access.
La base de datos access utilizada en el ejemplo tiene una única tabla con cuatro filas de ejemplo…

create table ejemplo

   (id counter,
    valor text)

Es preciso crear un ODBC para acceder a la bbdd access determinada. Desde Windows esta opción se configura en Panel de control, Herramientas administrativas, Administrador ODBC y la pestaña DNS de sistema.

desde ahí se crea el driver    odbc_access vinculado a la base de datos que uso: «test_hs.mdb» con esta tabla de ejemplo.

NOTA: esta bbdd access tiene password «tesths»

6.- Crear el DBLINK hacia la bbdd access.

SQL> CREATE DATABASE LINK bbdd_access
2      CONNECT TO ADMIN IDENTIFIED BY TESTHS
3      USING ‘bbdd_access’;

Enlace con la base de datos creado.

7.- Crear el fichero init.ora en el directorio de ORACLE_HOME   /hs/admin/

— FICHERO initODBC_ACCESS.ora
#
# HS init parameters
#

HS_FDS_CONNECT_INFO = odbc_access
HS_FDS_TRACE_LEVEL = 0
HS_FDS_TRACE_FILE_NAME = odbc_access.trc
HS_AUTOREGISTER = TRUE

8.- Lanzar la query via ese dblink

SQL> column «valor» format a40
SQL> set pages 1000
SQL> set lines 120
SQL> select * from ejemplo@bbdd_access;

        id valor
———- —————————————-
         1 dato1
         2 dato2
         3 dato3
         4 dato4

Comments

  1. Anónimo
    • 13 octubre, 2006
    • 1:26 pm
    • Reply

    Javier,
    Estuve leyendo por primera vez tu blog y me ha resultado super interesante.
    Te comento algo a ver si tienes alguna experiencia registrada con un caso como este: base Oracle 10g v.10.1.0.5.0. Hay algunos queries que al ejecutarlos, por ejemplo, como @prueba en el SQL, quedan congelados, no corren directamente y hay que cerrar el SQL.
    Investigando encontré en Metalink un problema similar que se solucionó poniendo la variable _new_initial_join_orders = FALSE.
    Esto solucionó el tema aparentemente, pero ayer otra vez encontré algunos queries de bajada de información (creacion de TXT) que siguen con este mismo problema.
    Te mando un saludo y mil gracias!

  2. Javier Morales
    • 13 octubre, 2006
    • 6:24 pm
    • Reply

    Hola,

    quizás el problema que tienes pueda resolverse optimizando el SQL.

    Cuando se accede mediante dblinks a otras bases de datos, Oracle no dispone de información en la base de datos «remota» para optimizar la query correctamente. Por este motivo, utilizar hints como DRIVING_SITE en la query pueden mejorar los tiempos de ejecución.

    Ten cuidado con los parámetros que empiezan con «_» ya que son del tipo «no documentado» y su uso sólo debe hacerse en casos concretos y con seguimiento de Oracle Soporte.

    Los problemas de «caída de rendimiento» tal cual, sin más datos, son imposibles de resolver (y de adivinar sin la bola de cristal adecuada!! 😀 ) ¿qué tal si revisas el plan de ejecución, el tkprof y demás? Eso te dará una buena pista de qué falla.

    Revisa el blog de optimización de SQL para tener una pista para «investigar» qué está sucediendo debajo! 🙂

    Suerte!!

  3. Mila
    • 18 octubre, 2006
    • 5:08 pm
    • Reply

    Hola Javier, una consulta..
    el sistema operativo de mi pc se ha dañado y no he logrado hacer backup de la base de datos solo cuento con la carpeta oradata. Quisiera saber si se puede levantar la base de datos a partir de esta carpeta oradata, y cuales son los pasos a seguir.
    Gracias

  4. Javier Morales
    • 19 octubre, 2006
    • 7:22 am
    • Reply

    Hola Mila,

    en principio, si tienes los controlfiles, redolog y datafiles podrías levantar la base de datos.

    Revisa este artículo para «copiar» una base de datos de un servidor a otro y sáltate la recreación del controlfile.

    Verás que empieza, inicialmente, con los controlfiles, redologs y datafiles de la otra base de datos en frío.

    Suerte con la recuperación, si necesitas más ayuda puedes contactarme por mail.

  5. Anónimo
    • 26 octubre, 2006
    • 5:26 am
    • Reply

    Hola Javier tu blog esta super, ayudame please, tengo dudas con como calcular el storage de las tablas quiero dividirlas en medianas y grandes para que cuando crezcan mucho no este aumentando los extents a cada rato
    Saludos y muchas gracias
    y cual es tu Mail????

  6. Javier Morales
    • 26 octubre, 2006
    • 2:37 pm
    • Reply

    Hola,

    para calcular el storage de las tablas tienes dos opciones: calcular lo que ocupan físicamente las extensiones, o lo que ocupan en sí las filas.

    Para saber cuanto ocupan los segmentos (contando también índices y demás), suma el valor de la columna BYTES de USER_SEGMENTS

    Para saber cuanto ocupan las filas, analiza la tabla con analyze y multiplica el valor de NUM_ROWS por AVG_ROW_LEN (aumenta ese valor en el porcentaje de PCTFREE de la tabla).

    Espero que esto te sea de ayuda!
    Un saludo,
    Javier Morales

  7. Anónimo
    • 3 noviembre, 2006
    • 12:13 pm
    • Reply

    Hola Javier,

    estamos creando un dblink contra una base de datos informix y solo podemos hacer un select * de la tabla. ¿Como seleccionamos varios campos?

    Otra cosa. Al hacer un insert en la base de datos informix me da un error de conversión de fechas entre el formato que tengo en oracle y el que tengo en informix. ¿Hay alguna forma de averiguar el formato remoto o forzarlo? Tiene que ser dinámico porque el formato en el informix puede variar.

    Muchas gracias.
    Saludos.

  8. Javier Morales
    • 3 noviembre, 2006
    • 4:30 pm
    • Reply

    ¿podéis hacer desc tabla_informix y ver el nombre de los campos?

    pues no sé, en el uso de servicios heterogeneos quien se encarga de «convertir» el SQL de Net8 al sistema remoto es ODBC. ¿qué driver estáis usando?

    De todas maneras, fijáos lo que dice la documentación Oracle sobre los formatos de fechas:

    http://download-east.oracle.com/docs/cd/B10501_01/server.920/a96544/majfeat.htm#1004583

    Espero que os sea de ayuda, y siento no poder ayudaros con informix (nunca he trabajado con esa plataforma).

    Un saludo,
    Javier

  9. Javier Morales
    • 3 noviembre, 2006
    • 4:31 pm
    • Reply

    el link anterior es éste

  10. Anónimo
    • 7 noviembre, 2006
    • 8:28 pm
    • Reply

    Hola Javier,
    Estuve en un curso tuyo en ‘Administración Oracle II’ en Ibertech por el mes de Septiembre, en el que aprendí bastante y voy a cumplir mi palabra de hacer una pregunta.
    Se trata de temas de rendimiento lectura/escritura. Estamos tocando parámetros con objeto de mejorar el rendimiento, en concreto, db_writer_processes y dbwr_io_slaves, notamos una cierta mejora, el caso es que lo que nos sale contradice lo que dicen los manuales de Oracle, ya que tenemos el parámetro disk_asynch_io = TRUE y según los manuales si la base de datos está en modo asíncrono tocar estos parámetros no debería tener efecto, pero si lo tiene en nuestras pruebas. ¿Has tenido algún caso parecido?.
    Otro tema, tamaño de caché, estamos dimensionando la caché para la base de datos basándonos en lo obtenido en la vista v$db_cache_advice. Obtenemos un tamaño óptimo de unos 100Mb salvo para uno de los procesos (q se ejecuta mensualmente) en el que se nos va unos 400Mb.
    Estamos valorando la posibilidad de poner los 400Mb del proceso mensual, pero nos entra la duda de si una caché de 400 Mb que en el funcionamiento normal (fuera del proceso mensual) va a estar poco usada, nos podría penalizar. la pregunta es: una caché dimensionada a la baja penaliza (lectura a disco), ¿puede penalizar una caché sobredimensinada?.

    Muchas gracias por adelantado y ánimo con tu blog!!

    Juan

  11. Javier Morales
    • 9 noviembre, 2006
    • 4:47 pm
    • Reply

    Hola Juan,

    Pues tanto como no tener efecto…

    A ver, la documentación dice que si el parámetro disk_asynch_io está a FALSE y se pretende emular (en máquinas que no soportan escrituras asíncronas) la funcionalidad de escritura asíncrona, ENTONCES es conveniente jugar con los otros dos parámetros db_writer_processes y dbwr_io_slaves para emular el efecto (con multiproceso).

    El primero, como sabes, habilita varios procesos DBWR y el segundo habilita threads para cuando la bbdd tiene un único proceso DBWR (para emular tener varios procesos DBWR).

    En mi opinión, todo vuestro test de volúmen seguramente se resuelve solamente con el parámetro db_writer_processes=N (¿qué tal el número de CPU’s?) porque el otro parámetro (el dbwr_io_slaves) en ese caso oracle no le hace ni caso.

    Si una caché está sobredimensionada no suele haber prácticamente impacto, ya que el número de dirty blocks a leer en cada checkpoint va a ser el mismo.

    El debate sería si el sistema operativo no estaría interesado en recibir esos 300Mb de memoria libre y contigua para funcionar mejor el host.

    Un saludo, y gracias!

  12. Anónimo
    • 29 noviembre, 2006
    • 11:51 pm
    • Reply

    excelente tu blob, una consulta el ejemplo es para aplicarlo en oracle en NT? o todo se realiza en la maquina SQLSERVER?

    lo que sucede es que mi oracle es unix y sqlserver NT

    saludos
    fanm@synapsis-it.com

  13. Anónimo
    • 1 diciembre, 2006
    • 4:45 pm
    • Reply

    Hola Javier,

    He aquí un alumno tuyo de ‘admin de Oracle II’ que visita tu blog yvuelve a hacerte una preguntilla.
    El famoso segmento de UNDO. Resulta que por temas de rendimiento hemos utilizado paralelismo en unos
    deletes bastante masivos. Esos deletes ahora tardan menos, pero en alguna ocasión nos ha petado por
    llenar el segmento de UNDO. Nuestra teoria es que al entrar varios procesos en paralelo ( en nuestro caso 4) cada uno empieza a escribir en un punto del tablespace de UNDO, de modo que dejan huecos en medio
    y necesita más espacio de UNDO. ¿Puede ser esta la causa?.

    Vamos a solicitar a los admin de Oracle que nos aumenten el segmento de UNDO, pero en lugar de pedir Gibas a saco
    para curarnos en salud, queremos hacer una estimación del espacio q podemos necesitar.

    ¿Hay alguna forma de estimar esto en base al número de registros a borrar y el tamaño de registro?,
    ¿conoces alguna fórmula sencilla de estimar el segmento de UNDO en base a los datos a borrar/actualizar?.

    Hay que tener en cuenta que nuestros deletes van con paralelismo.

    Muchas gracias y un saludo.

    Juan

  14. Anónimo
    • 8 diciembre, 2006
    • 4:37 am
    • Reply

    Hola Javier,

    Tengo que conectar una base de datos informix pero no lo he logrado.

    El problema es que despuede de modificar el fichero del listener el servicio del listener no sube.

    Alguna sugerencia o tienes un ejemplo?

    Muchas gracias.

  15. Anónimo
    • 11 diciembre, 2006
    • 10:50 pm
    • Reply

    Hola Javier, tengo un problema con Oracle 10g y quisiera que me ayudaras a resolverlo, tengo una aplicacion web en VB.NET y tengo un reporte en Crystal Reports XI, tengo un una pagina el proyecto VB:NET el crystal report viewer enlazado con el reporte pero a la hora de correr mi aplicacion y querer ver el reporte no se conecta, me pide usuario y password, ademas quisiera enviarle paramentros a mi reporte y me gustaria saber como lo hago, de antemano muchas gracias

  16. Anónimo
    • 12 diciembre, 2006
    • 9:53 am
    • Reply

    Hola Javier,

    Aquí de nuevo preguntando..

    En nuestra instalación se están planteando montar la base de datos a nivel físico de forma que se simulen
    raw devices sobre filesystems, con lo que se podría mejorar bastante la E/S y reducir la memoria dedicada a ésta.

    Trabajamos en Oracle9 sobre una máquina IBM, sistema operativo AIX.

    La verdad es que estos temas son más de sistema operativo/hardware, pero quería preguntarte si has tenido alguna experiencia con configuraciones de este tipo («raw devices») y como fue.

    Muchas gracias de nuevo

    Juan

  17. Javier Morales
    • 14 diciembre, 2006
    • 9:43 pm
    • Reply

    Usuario anónimo: El ejemplo está montado sobre Windows, por el tema de ODBC y las rutas de directorio, etc. No obstante, es transportable a cualquier plataforma ajustando los cambios de sintaxis (mínimos) a ésta.

    Juan: Hola Juan. Lo primero es recomendarte que te empapes el funcionamiento del rollback detenidamente. En paralelo o en serie, el volúmen de rollback es el mismo en cada caso, pero no así el tiempo de permanencia en rollback (sujeto en el modo automático al parámetro UNDO_RETENTION). Para estimar el tamaño de los deletes cuenta el tamaño entero de la fila como entrada de rollback (o el rowid en los inserts, o el rowid más los valores antiguos en los updates). Para los deletes hay algo muy sencillo: de la USER_TABLES multiplicar (NUM_ROWS*AVG_ROW_LEN)+4 bytes para la identificación de la transacción que la causa. Aproximadamente te irás al tamaño de la tabla, pero CUIDADO, los demás procesos también hay que tenerlos en cuenta en el cómputo (o, al menos, todos los que quepan dentro de UNDO_RETENTION).

    Usuario anónimo2: Has modificado el listener y ahora no sube. Ok. Sin mi bola de cristal a mano no puedo ayudarte… y sí, el punto 3 es un fichero LISTENER.ORA enterito y funcionando! 🙂

    Usuario anónimo3: Sin código de error, ni más datos no puedo ayudarte sin mi bola de cristal a mano. Los usuarios por defecto de una bbdd Oracle son SYSTEM/MANAGER y SYS/CHANGE_ON_INSTALL, pero cuando instalaste la Oracle10G te obligó a especificar una nueva password para éstos. No conozco VB.NET ni he trabajado con Crystal Reports, ya que no soy programador de entornos microsoft. Siento no poder ayudarte en ese aspecto.

    Juan: Hola Juan. Se recomienda usar raw devices con Oracle por el comportamiento de las lecturas full scan de las tablas. Mi experiencia ha sido buenísima con éstos. Vamos, ningún problema!!

    Gracias a todos por participar en mi blog! Un saludo,
    Javier

  18. Anónimo
    • 11 enero, 2007
    • 3:31 pm
    • Reply

    Estimado Javier he seguido con atención los pasos a dar para el acceso de una BBDD ODBC desde Oracle,ya que se nos ha planteado esta circustancia entre un Oracle 8i (que además comparte instalación con discoverer 3, por tanto oracle 8.0.5) e InterBase 5.0 en máquinas diferentes.
    Hasta la comprobación de Tnsnames y Listener todo ha ido bién, pero al ejecutar el dblink da el siguiente mensaje:
    SELECT * FROM TABLA1@DBL_COLADA
    *
    ERROR en línea 1:
    ORA-02068: error grave de DBL_COLADA
    ORA-03114: no conectado a ORACLE

    Estamos un poco perdidos llegados a este punto y agradeceriamos un poco de luz en este sentido.

    Muchas Gracias de antemano y saludos.
    FJ.

  19. Anónimo
    • 15 enero, 2007
    • 8:12 pm
    • Reply

    muchas gracias por este documento, logre conectar oracle xe con mysql solo cambiando algunos parametros, solo hacer la observacion de que al crear el dblink el usuario y password deben de ir entre comillas ( no se porque, cuando no lo hize con comillas me regreso error de conexion )

    CONNECT TO «usuario» IDENTIFIED BY «password»

    pero ahora funciona, gracias

  20. Anónimo
    • 14 febrero, 2007
    • 11:59 pm
    • Reply

    Javier:
    Una pregunta, estoy tratando de enlazar una bd de access y otra de oracle pero en plataformas distintas (windows y linux respectivamente) he probado tu script sin embargo me genera un error al intentar levantar el listener, tienes algun comentario que me pueda ayudar, sobre todo por la diferencia entre plataformas, de antemano muchas gracias…

  21. Javier Morales
    • 16 febrero, 2007
    • 4:05 pm
    • Reply

    Por favor, revisa la configuración del listener (incluído el listener.log y demás) y comprueba que todo está correcto en lo que respecta a puertos, nombre de host, etc.

    (recuerda que el firewall de windows puede jugar ahí una mala pasada! 😛 )

    En principio, este caso-laboratorio funciona sobre plataformas Windows y linux (donde, evidentemente, el driver a utilizar es otro, aunque funcionando igualmente).

    Un saludo y gracias!
    Javier

  22. Anónimo
    • 7 marzo, 2007
    • 1:41 am
    • Reply

    Hola Javier,
    ya tengo un dblink a SqlServer 2000 desde Oracle 10G, cuando realizo un select * from tabla@dblk_sql todo es normal, pero cuando hago referencia a cualquier campo de una tabla, me aparece el error ORA-00904…me puedes decir qu pasa?

  23. Javier Morales
    • 7 marzo, 2007
    • 8:18 am
    • Reply

    Pues que no reconoce esa columna como válida. Pon la columna entre comillas dobles y escríbela tal cual aparece en SQLServer (mays y min).

    Un saludo,

  24. Anónimo
    • 9 marzo, 2007
    • 6:59 pm
    • Reply

    Hola Soy de Argentina, y tengo una pregunta, ojala puedas ayudarme. Quiero implementar Raw Devices en una base de datos oracle 10g. Es mi 1ra experiencia en raw, ¿tienes algun material de lectura que me pueda servir?. Buensimo el Blog. Maria

  25. Anónimo
    • 15 marzo, 2007
    • 8:35 am
    • Reply

    Javier, me parece estupendo tu blog. Permíteme que abuse de tus conocimientos y te pida que nos ilustres con un artículo a cerca de las diferencias entre los tipos de datos binarios de Oracle. Estoy haciendo una aplicación web que guarda documentos en la base de datos y no sé qué tipo sería el más conveniente.
    Gran trabajo. Un saludo

  26. Anónimo
    • 20 marzo, 2007
    • 2:45 pm
    • Reply

    mJavier,
    Estoy migrando una bd de access a oracle, mi unico problema hasta ahora son los queries de acces que se pueden tratar como tablas. Bien tengo un varios queries donde se llaman a otros dentro de estos. Me dijeron que no es conveniente tener muchas vistas, entonces ha decidido hacer stored que tengan las dos opciones:
    1 – Devolver un cursor de resultado.
    2 – Llenar una tabla temporal.
    esta accion dependiendo de un parametro que se le envia al stored. Lo que no puedo encontrar es la forma de ejecutar a un stored dentro de otro, cabe aclarar que se trata de un mismo pakage y estoy con oracle 9i.
    Espero tu respuesta.
    desde ya muchas gracias.

  27. Javier Morales
    • 20 marzo, 2007
    • 4:17 pm
    • Reply

    A los tres últimos anónimos:

    Anónimo1 María: Ante todo, gracias por tu comentario y tu apoyo. 🙂

    No he tenido mucha ocasión de pelearme con los raw devices. En las veces en las que he trabajado con ellos estaban ya implementados a nivel de filesystem y para mi fueron transparentes y funcionaban bastante bien.

    Oracle los recomienda en entornos RAC y, sobre todo, usando ASM. Puedes leer la documentación de Oracle al respecto sobre la configuración de RAC y ASM.

    Anónimo2: Gracias a ti también por tu comentario y por tu opinión! 🙂

    ¿Has leído este post? Habla de almacenar documentos Word y PDF en una bbdd Oracle como BFILES.

    El otro tipo binario para almacenamiento de grandes volúmenes (hasta 4Gb en Oracle9i e ilimitado en Oracle10G) es BLOB. Con el segundo la información se almacena internamente en la bbdd como segmento, y el BFILE se queda externo en el filesystem. Depende de tí escoger uno u otro… por ejemplo, cuando haces un EXP, la aplicación export no se lleva los ficheros, pero sí los BLOB (ya que son segmentos). Por otro lado, incluir estos «ficheros» en los backups puede aumentar considerablemente el volúmen de las copias (por ejemplo). Depende de tí usar el que más se adecúe a tus propósitos.

    Anónimo3: Gracias también por tu comentario en mi blog.

    En tu post me intriga esta afirmación: «Me dijeron que no es conveniente tener muchas vistas». Pues no sé por qué no es conveniente.

    El único problema es cuando se «descontrolan» los accesos de vistas que llaman a otras vistas, que llaman a otras vistas, etc. de modo que una consulta planteada sobre vistas con group by, distinct, union, etc. pueden resultar muy pesadas de ejecutar… pero, claro, esto ya es otro tema (el código podría optimizarse).

    La solución manual a las vistas (o el reinventar la rueda) seguro que te perjudica mucho más en el coste (o el mantenimiento de las estructuras, o…).

    ****

    A los tres, y a todos, gracias por participar en mi blog y por vuestro apoyo. Últimamente tengo una carga muy alta de trabajo y no tengo mucho tiempo para seguir publicando, pero en breve pretendo seguir contando «trucos» o casos prácticos para implementar BBDD Oracle de modo eficiente.

    Gracias por vuestro apoyo.
    Un saludo

  28. Anónimo
    • 20 marzo, 2007
    • 7:43 pm
    • Reply

    Javier,
    de nuevo Anonimo 3, conoces alguna forma de ejecutar un stored desde otro? existe algo como EXECUTE o EXEC???, no lo logro encontrar.
    Por otro lado, porque no puedo crear una vista de consultas anidadas.

  29. Javier Morales
    • 20 marzo, 2007
    • 10:39 pm
    • Reply

    Hola Anónimo3 🙂

    lo primero será responder a tu pregunta: para ejecutar un stored procedure desde otro sólo hay que mencionarlo.

    CREATE PROCEDURE LLAMA_A_CARGADATOS
    IS
    BEGIN
    carga_datos(‘VALOR1’);
    END;
    /

    ésto es un stored prodecure que ejecuta a otro. EXECUTE o EXEC funcionan sólo desde la consola del SQL*Plus (pues son comandos SQL*Plus).

    Pero lo más importante es que quien te dijo que no era conveniente tener muchas vistas no tenía mucha razón. Para tu propósito, lo mejor es utilizar vistas y, si necesitas tener almacenados los resultados como una tabla (cuidado, MSAccess no duplica las filas!!) entonces estás hablando de Vistas Materializadas (create materialized view nombre as select xxxxx;).

    Para todo lo demás, ya sabes: un tipo REF CURSOR dentro del paquete para invocarlo, bla bla bla…

    …pero vamos, es increíble que para migrar de un MSAccess a Oracle tengas que implementar stored procedures que devuelvan refcursors en un paquete. Para eso existen las vistas, que es lo que utiliza MSAccess al fin y al cabo.

    No intentes reinventar la rueda! 🙂

    Gracias por estar ahí. Un saludo,
    Javier

  30. Edgardo Antonio
    • 17 mayo, 2007
    • 4:59 pm
    • Reply

    Estimado Javier

    Escribo porque me parecio muy interesante el tema. De hecho debo implementarlo en un proyecto que requiere desde Oracle 9i extraer datos de una BD SQL Server. Mi pregunta es… como lo hago si Oracle esta sobre Unix y SQL sobre Windows en otra maquina?. Podrias ayudarme y de ser posible publicar la solucion.

    Hasta pronto, saludos de Chile

  31. Javier Morales
    • 18 mayo, 2007
    • 4:54 pm
    • Reply

    Hola Edgardo,

    La única diferencia para poder implementar esta configuración de conectividad con Unix es el driver ODBC. Necesitas instalar en la máquina donde tengas Oracle un driver ODBC para SQLServer. Puedes encontrar este software aquí, aunque la versión para SQLServer es de pago.

    El resto, igual que el artículo.

    Un abrazo desde España, gracias por tu comentario, y cuéntame qué tal fue todo! Cuenta conmigo para lo que necesites…

    Un saludo,
    Javier

  32. Edgardo Antonio
    • 22 mayo, 2007
    • 2:55 pm
    • Reply

    Muchas gracias Javier. En todo caso nuestra idea no es comprar la herramienta. No se si la version trial nos ayude mucho.

  33. Javier Morales
    • 22 mayo, 2007
    • 3:23 pm
    • Reply

    En todo caso, la versión trial es shareware de 30 días (creo)… si os funciona, estos 30 días podréis traspasar la información de sqlserver a Oracle…

    … suerte!
    Un saludo,

  34. Edgardo Antonio
    • 22 mayo, 2007
    • 3:54 pm
    • Reply

    Gracias

  35. Anónimo
    • 7 junio, 2007
    • 2:59 pm
    • Reply

    hola quisiera saber el acceso a otra base de datos como mysql es la misma y del driver tambien el odbc gracias de antemano por la ayuda

  36. Gabriela
    • 7 junio, 2007
    • 3:04 pm
    • Reply

    Hola me ha gustado mucho tu logs es muy interesante mira tengo unas inquietudes y espero me puedas ayudar …tengo una base de datos mysql que tiene un tabla que necesito que se actualice cada vez que se hace una actualizacion y/o insert en otra base datos que es oracle he leido tu articulo y quisiera saber si es lo mismo para el mysql y acerca del driver sin mas que decir me despido y gracias

  37. Anónimo
    • 21 junio, 2007
    • 5:26 pm
    • Reply

    Mi estimado Javier antes que nada te felicito por tu blog esta muy interesante, yo humildemente solicito tu apoyo para lo siguiente, tengo unos Querys en Excel (Parecido a los DTS) pero en mi empresa tengo 45 servidores, entonces para accesar a estos servidores pues configuro manualmente el alias en el TNSNAMES.ORA, habrá la manera de hacerlo automatico es decir si puedo meter varios servidores en el mismo TNSNAMES ? para que los querys accesen en automático ?

    no se si me di a entender, espero me respondas, saludos. ATTE Alejandro Bustos

  38. Anónimo
    • 16 julio, 2007
    • 7:20 am
    • Reply

    hola. Se me plantea este tema en el proyecto en el que me encuentro actualmente; ahora pues, el acceso también es posible a una mde? o sólo sirve para mdb??. Si también fuera posible, se hace igual?

  39. Marcelo
    • 24 agosto, 2007
    • 4:34 pm
    • Reply

    Saludos Javier,

    He seguido paso a paso tu procedimiento para utilizar las HS; sin embargo, yo neceisto conectarme a SQL Server, se debe hacer alguna cosa adicional cuando de SQL Server se trata?

    Abajo la respuesta de PLUS cuando trato de ejecutar el query.

    ORA-28500: la conexión de ORACLE a un sistema no Oracle ha devuelto este mensaje:
    [Generic Connectivity Using ODBC][Microsoft][Administrador de controladores ODBC] No se encuentra
    el nombre del origen de datos y no se especificó ningún controlador predeterminado (SQL State:
    IM002; SQL Code: 0)
    ORA-02063: 2 lines precediendo a BBDD_SQL

    Espero tu gentil respuesta.

    Marcelo.

  40. Javier Morales
    • 24 agosto, 2007
    • 9:10 pm
    • Reply

    Hola Marcelo

    el error te lo da el ODBC porque no encuentra la base de datos.

    Debes configurar debidamente el controlador ODBC de SQLServer, de modo que testeando el servicio, el nombre de usuario y la localización de la base de datos SQLServer sean visibles por el ODBC.

    El fallo ya no está en Oracle, ni en Net8 (software de red de Oracle).

    Un saludo, y gracias!
    Javier

  41. Marcelo Ríos
    • 27 agosto, 2007
    • 11:05 pm
    • Reply

    Hola Javier:
    Muchas gracias por el dato. Te comento que deberías añadir un temilla relacionado con la parte de suguridad del SQL Server (para que otros amigos sepan del porqué del error). Básicamente los HS de Oracle sólo interactuan con la autenticación nativa de SQL Server. En mi caso la autenticación del SQL la tengo vía Directorio Activo. Por eso me daba el error. En fin, he cambiado la seguridad en el SQL y ya pude recuperar los datos requeridos. Sólo una pregunta más, cuando pones las claúsula WHERE cómo haces referencia a los campos de la tabla en SQL. He probado de todo y siempre me dice que el campo del otro lado no existe. Ej: where campo1 = ‘100’
    otro Ej. where tabla.campo1@bbdd_sql = ‘100’
    otro Ej. where tabla@bbdd_sql.campo1 = ‘100’

    Siempre me dice que CAMPO1 no existe y así con cualquier campo de la labla en SQL.

    Una vez más, muchas gracias por tu dedicación.

    Marcelo.

  42. mIGUEL
    • 8 noviembre, 2007
    • 11:59 pm
    • Reply

    QUIEN ME PODRIA AYUDAR CON ESTAS 4 PREGUNTAS Como activar el modo servidor compartido
    2 CoMo se crea un DBLINK y coMo se usa Y Manejo de area UNDO

  43. Anónimo
    • 14 diciembre, 2007
    • 11:26 am
    • Reply

    Hola Javier, gracias por todos tus consejos, son muy buenos.
    Yo he creado el acceso a un BBDD MSAccess desde Oracle pero me he encontrado con dos problemas:
    1- Si el nombre de la tabla es mayor de 30 caracteres, no consigo que la reconozca. Recorto a 30 y no hay manera.
    2- Los campos Memo de Access me dan error:
    SQL Error: ORA-00600: código de error interno, argumentos: [HO define: Long fetch], [], [], [], [], [], [], []
    00600. 00000 – «internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]»
    *Cause: This is the generic internal error number for Oracle program
    exceptions. This indicates that a process has encountered an
    exceptional condition.
    *Action: Report as a bug – the first argument is the internal error number

    Muchas gracias y un saludo.

  44. Anónimo
    • 29 abril, 2008
    • 5:12 pm
    • Reply

    Que tal Javier como estas?

    Muy bueno el articulo escrito sobre esta conexion, he seguido tus pasos al pie de la letra, sin embargo, me sale un error como este:
    ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
    [Generic Connectivity Using ODBC][Microsoft][Administrador de controladores ODBC] No se encuentra el
    de datos y no se especificó ningún controlador predeterminado (SQL State: IM002; SQL Code: 0)
    ORA-02063: preceding 2 lines from BE.
    Ya vi en el foro que alguien tuvo el mismo problemita (Marcelo) pero si no se aún como atacarlo, estoy empezando en esto tambien y bueno lo que te puedo adicionar es que estoy trabajando desde un Oracle9i tratando de pegarme a una Access2003. Agradezco todo el apoyo que puedas brindarme lo mas pronto posible, saludos….

  45. Fernando
    • 15 mayo, 2008
    • 10:34 am
    • Reply

    Hola Javier.

    Primero felicitarte por la calidad de tu blog, hacia tiempo que no encontraba algo parecido…

    Me preguntaba si podrías ayudarme con una duda que tengo, verás: he leído que Oracle recomienda que los índices que se creen para las tablas, se almacenen en un tablespace independiente… he conseguido implementarlo de esta manera, pero qué ventajas podría ofrecerme esta arquitectura?

    Muchas gracias.

  46. Anónimo
    • 15 octubre, 2008
    • 11:32 am
    • Reply

    Hola, muy interesante la nota.

    ¿Como habría que hacerlo para conectar Oracle en Linux con una base de datos en Access?

    Salu2.

  47. Anónimo
    • 27 noviembre, 2008
    • 8:51 pm
    • Reply

    He seguido todos los pasos para crear el HS pero cuando tengo que realizar el tnsping me envia un error de que no encuentra ningun listener
    TNS-12541

    ESTE ES EL LISTENER
    —-
    SID_LIST_LISTENER =
    (SID_LIST =
    (SID_DESC =
    (SID_NAME = PLSExtProc)
    (ORACLE_HOME = C:oraclexeapporacleproduct10.2.0server)
    (PROGRAM = extproc)
    )
    (SID_DESC =
    (SID_NAME = CLRExtProc)
    (ORACLE_HOME = C:oraclexeapporacleproduct10.2.0server)
    (PROGRAM = extproc)
    )
    #AGREGADO TAMBIEN ODBC_SQLCON ES EL NOMBRE Q TIENE EL TNS
    (SID_DESC =
    (ORACLE_HOME =C:oraclexeapporacleproduct10.2.0server)
    (SID_NAME = STH)
    (PROGRAM = hsodbc)
    )
    )

    LISTENER =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
    (ADDRESS = (PROTOCOL = TCP)(HOST =

    WZLDMIRONES.sthonore.zl)(PORT = 1521))
    #AGREGAR EL ADRESS NUEVO CON EL HOST DEL SQL
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.8)(PORT = 1521))
    )
    )

    #DEFAULT_SERVICE_LISTENER = (XE)
    ——-

    ESTE ES EL TNSNAME
    ——
    #AGREGADO ODBC_SQLCON ES EL MISMO NOMBRE DEL ODBC
    odbc_sqlcon =
    (DESCRIPTION=
    (ADDRESS= (PROTOCOL=tcp)
    (HOST=192.168.0.8)
    (PORT=1521)
    )
    (CONNECT_DATA =
    #BASE DE DATOS SQL
    (SERVICE_NAME = STH)
    )
    (HS = OK)
    )
    ———-
    CUAL PUEDE SER EL ERROR??
    DE ANTE MANO GRACIAS!

  48. Anónimo
    • 30 marzo, 2009
    • 10:33 am
    • Reply

    Hola, estoy realizando una aplicación que se conectara a una BD Oracle XE. El asunto es que me interesa maximizar la eficiencia, pero mi jefe no quiere tener que instalar un cliente pesado en cada ordenador que ejecutara la aplicacion.
    Mi duda es si este driver:
    – Microsoft ODBC for Oracle
    ofrecerá un buen rendimiento en los accesos a BD y optimización de consultas.

    ¿Lo has probado? ¿Que tal rendimiento ofrece?

    Gracias,
    un saludo

  49. Alex
    • 3 abril, 2009
    • 5:36 pm
    • Reply

    Q tal Javier…
    Estoy dearrollando un proyecto en visual basic 6 y tengo que conectar mi programa a una base de datos oracle 10 que esta en un servidor unix, quisiera saber los pasos a seguir para hacer la conexión, me imagino q debe ser con odbc, pero no estoy muy seguro de el string de conexion ni d q ip debería usar.
    Un saludo y gracias x tu atención

  50. Anónimo
    • 25 mayo, 2009
    • 7:49 am
    • Reply

    Hola Javier,
    Tengo un pequeño problema. Estoy trabajando con Oracle Warehouse Builder y uso HS para cargar un Excel en una tabla oracle con la que poder trabajar. Mi problema reside en que al pasar todos los campos del Excel me omite dos campos, que casualemtne son de un tamaño considerable (200-2000 caracteres) y no se si el HS tiene restricciones a la hora de acceder a datos de gran tamaño del Excel. De ser asi hay alguna forma de solucionarlo?
    Muchas gracias por atenderme.
    Un cordial saludo!!

  51. Javier Morales
    • 25 mayo, 2009
    • 8:48 am
    • Reply

    Pues no debería. 2000 carácteres es algo bastante pequeño.
    ¿Cómo está definida la columna? ¿VARCHAR2 o CLOB?

    seguramente cambiando el tipo no tengas problema.

    Un saludo,

  52. Anónimo
    • 25 mayo, 2009
    • 10:33 am
    • Reply

    Hola de nuevo,
    la longitud era entorno a 4000-5000 caracteres. La cuestion es que yo no puedo definir de antemano el tipo y tamaño de los campos ya que HS lo hace por si mismo cuando lee el Excel y crea la tabla segun los datos que contenga. Por eso no se si son demasiado grandes los registros y por eso no los mapea…

  53. Anónimo
    • 19 agosto, 2009
    • 9:31 am
    • Reply

    Bueno, mi pregunta es para justamente lo contrario. Tengo un esquema hecho en oracle con una serie de tablas. Desde sqlplus veo el contenido, desde la aplicación de visual basic también, sin embargo cuando vinculo una tabla desde ms access 97, usando odbd (oracle en orahome92) y si bien puedo ver sin problema el contenido de tablas de otros esquemas, no puedo ver el contenido de las tablas que creé yo. Es curioso porque me deja seleccionar la tabla y cuando intento abrirla desde access se ve el nombre de los campos, sin embargo todos los campos de los registros tienen el valor #¿nombre?
    El diseño de la tabla también lo puedo ver, pero ya digo, ver los datos es imposible.¿Alguna idea?
    En otras tablas al intentar abrirla da directament el error: ODBC FALLO LA LLAMADA; y en la siguiente ventana aparece ORA-03114 NOT CONNECTED TO ORACLE.
    A tablas de otras esquemas puedo acceder sin problemas

  54. AOP
    • 23 octubre, 2009
    • 6:48 pm
    • Reply

    quisiera saber com puedo ver en WORD un fichero que esta en un bfile de oracle dele visual basic.net

  55. Anónimo
    • 21 agosto, 2010
    • 10:07 pm
    • Reply

    hola disculpa me podrias ayudar que tipo de datos debo utilizar para almacenar cualquier tipo de documento como word,excel,power point,pdf

  56. Javier Morales
    • 23 agosto, 2010
    • 9:07 am
    • Reply

    Hola,

    para almacenar ficheros, los tipos de datos son o BLOB o BFILE, pero tienen un tratamiento de inserción particular (con el paquete DBMS_LOB).

    Podéis ver un ejemplo en este artículo de mi blog.

    Un saludo,
    Javier

  57. Alejandro
    • 28 octubre, 2010
    • 5:16 pm
    • Reply

    Javier, como puedo tener acceso a las bases de datos de varios servidores, es una rutina que hago diario y quisiera automatizarla, es decir si se tiene que configurar en el TNSNAMES.ORA todos los servidores para su acceso, tengo 60 servidores con espejo de tablas.

    Saludos Cordiales

  58. Anónimo
    • 15 noviembre, 2010
    • 8:57 pm
    • Reply

    Hola Javier, se puede utilizar decode o case when en el where de un select,
    select * from tabla1 where case when(tabla1.campo1=.t.) then … else … end

  59. Diego
    • 11 diciembre, 2010
    • 12:52 am
    • Reply

    Hola Javier

    Tengo un problema con Distinct

    ejecuto este query y se duplican los registros y si le quito el distinct sucede lo mismo, que estoy haciendo mal
    select distinct a.codi_aduan||'-'||a.ano_prese||'-'||a.nume_corre Nro_DSEER,a.fech_ingsi Fec_Numeracion,a.nume_serie Serie,b.tipo_aforo Canal,
    case when(a.Codi_agent <> ' ') then (a.Codi_agent||'-'||c.Dnombre) else ' ' end Agente,
    b.libr_tribu RUC,b.fech_manif||'-'||trim(b.nume_manif) Manifiesto_EER, d.numconm Doc_Transp, d.numcon Guia_EER, a.cnt_bultos_decl Bultos_Declar,
    a.cant_bulto Bultos_Recib, a.cnt_peso_decl Peso_declar, a.peso_bruto Peso_Recib, a.cod_produc Cod_prod, a.part_nandi SPN, trim(a.desc_comer) Mercancia,
    a.fob_dolpol FOB, a.fle_dolar Flete, a.seg_dolar Seguro, a.cif_dolpol CIF row_number()
    from seriesdc a, polizadc b, directo c, mcdeta d
    where b.fech_ingsi between to_number('20101101') and to_number('20101103') and b.codi_aduan='235' and b.CODI_ADUAN=a.codi_aduan
    and b.ano_prese=a.ano_prese and b.nume_corre=a.nume_corre and b.poli_anula <> 'A' and b.via_transp='5' and c.tagente ='A'
    and c.cagente=b.codi_agent and c.cjurisdicc in ('235','992','983') and a.seri_elim <> 'S' and nvl(to_number(d.nume_mc),0)=b.nume_manif and
    d.anno(+)=substr(b.fech_manif,3,2) and d.via_trans(+)=to_char(b.via_transp) and d.codi_aduan(+)=b.cadu_manif and d.numcon=a.cono_embar
    and b.codi_agent='0091' order by 1,2,3

  60. Javier Morales
    • 13 diciembre, 2010
    • 8:53 am
    • Reply

    @Diego: El CASE te está tratando registros distintos a visualizar el mismo resultado.

  61. frlo
    • 17 diciembre, 2010
    • 7:35 pm
    • Reply

    Recientemente e Notado un alto consumo de memoria de el Proceso de Enterprise Manager de Oracle ,quisiera saber si alguien se le ha presentado este problema me huele a memory leak mi version de oracle es 10.2.0.0

  62. Anónimo
    • 18 enero, 2011
    • 8:06 pm
    • Reply

    estupendo site javier…

    oie yo en mi caso estoy intentando acceder desde oracle 10g a una base de datos postgresql 8.1, sin embargo no logro conectarme, alguna sugerencia.
    pepe

  63. Javier Morales
    • 19 enero, 2011
    • 9:50 am
    • Reply

    Hola Pepe,

    Pues si no me das más pistas, poco puedo ayudarte…

    ¿estás usando ODBC para postgreSQL?¿Cómo lo estás haciendo?

  64. Anónimo
    • 15 febrero, 2011
    • 6:02 pm
    • Reply

    Antes que nada excelente el BLOG.
    Estoy operando con 2 base de datos ORACLE 9i, al ejecutar una misma instruccion SQL en mi instancia desarrollo ejecuta bien al pasarla a la explotacion aparece error ORA 600, el DBA altero en la session este valor : _new_initial_join_orders = FALSE y se soluciono el problema.
    Como puedo ver los valores por defecto de este parametro en ambas instancias? cual podria ser la causa.

  65. Andres
    • 16 junio, 2011
    • 7:19 pm
    • Reply

    Hola Javier.

    Estoy realizando una conexion con SQL Server 2005 y Oracle 10g. En realidad tengo instalado es OBI standard edition one.

    Necesito hacer la conexion para traerme algunos datos de la BD sql server a una BD en Oracle.

    Segui los pasos y todo va muy bien, hago el TNSPING y responde bien. El problema es cuando intento realizar un query. me arroja los siguientes errores:
    ORA-28500: la conexión de ORACLE a un sistema no Oracle ha devuelto este mensaje:
    [Generic Connectivity Using ODBC][Microsoft][Administrador de controladores ODBC] No se encuentra el nombre del origen de datos y no se especificó ningún controlador predeterminado (SQL State: IM002; SQL Code: 0)
    ORA-02063: 2 lines precediendo a ORACLE_SQL.

    Si me pudieras dar alguna ayuda lo agradeceria mucho

  66. Javier Morales
    • 13 julio, 2011
    • 11:48 am
    • Reply

    Anónimo: Los parámetros que empiezan por un guión bajo son parámetros ocultos (no documentados) que únicamente pueden usarse con la recomendación de Oracle soporte. Si el administrador ha seguido esta recomendación, basta con añadir ese parámetro en el fichero de parámetros o ejecutar

    SQL> alter system set "_new_initial_join_orders"=false scope=spfile;

    System altered.

    Andrés: Ese error suele ocurrir cuando has creado un "user data source" (odbc) en vez de uno DNS. ¿Puedes confirmarme si es así?

  67. Anónimo
    • 23 julio, 2011
    • 8:13 am
    • Reply

    Hola Javier muy interesantes tus conocimientos sobre bases de datos. Tengo una pregunta ojala me puedas orientar. En mi trabajo utilizan informix y se estan migrando a oracle, tengo un proceso que baja algunas tablas de informix las trabajo en VFP y obtiene una tabla resultado que quiero migrar subir a informix pero contiene al rededor de 5 millones de registros lo que hace el insert muy lento. Hacer un dblink y todo trabajarlo en oracle sin usar vfp me funcionaria mas rapido? Y la forma hacer este dblink como seria los dos estan montados en maquinas unix y yo como cliente trabajo en windows, tienen los administradores de bd respectivos que configurar los equipos donde estan las BD?
    Gracias por tu respuesta. Saludos

  68. Jorge Basilico
    • 18 septiembre, 2012
    • 1:26 pm
    • Reply

    Hola Javier, te cuento a ver si me podes ayudar, hace una semana estoy peleandome con este servicio "HS", tratando de conectar un Oracle 11g instalado en un ubuntu server con un MS-Sqlserver y me tira un ora-02063 line precediendo a DBLINK_SQL. segui los pasos tal cual, con las diferencias del S.O., el odbc me anda perfecto, y ya no se que probar.
    Te paso los archivos como me quedaron para ver si me podes dar una mano.

    LISTENER.ORA
    LISTENER =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.95)(PORT = 1521))
    )
    )

    ADR_BASE_LISTENER = /u01/app/oracle

    SID_LIST_LISTENER=
    (SID_LIST=
    (SID_DESC=
    (SID_NAME=extdb)
    (ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1)
    (PROGRAM=dg4odbc)

    TNSNAMES.ORA
    extdb=
    (DESCRIPTION=
    (ADDRESS=
    (PROTOCOL=TCP)
    (HOST=)
    (PORT=1521)
    )
    (CONNECT_DATA=
    (SERVER = DEDICATED)
    (SERVICE_NAME=extdb))
    (HS=OK))

    SQLNET.ORA
    SQLNET.AUTHENTICATION_SERVICE=(ALL)
    NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT,HOSTNAME)

    Saludos!

  69. Javier Morales
    • 20 septiembre, 2012
    • 2:50 pm
    • Reply

    Hola Jorge,

    Pues no lo sé, parece que los ficheros están bien. ¿puedes pasarme el status del listener?

    puedes probar que el driver funciona bien en ubuntu? Ya sabes, poner algún testcase o algo así!

    Sólo con los ficheros de configuración no puedo saber qué falla…

    Un saludo,
    Javier

  70. Jorge Basilico
    • 1 octubre, 2012
    • 6:48 pm
    • Reply

    te paso el status del listener (el que uso para la conexion con sqlserver es el dg4odbc).
    Te cuento además que el odbc funciona ok, lo pruebo con isql -v … y puedo ver las tablas perfecto.
    Esto que pones del testcase, nunca use nada me podes decir como hago?

    LSNRCTL for Linux: Version 11.2.0.1.0 – Production on 01-OCT-2012 15:49:35

    Copyright (c) 1991, 2009, Oracle. All rights reserved.

    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
    STATUS of the LISTENER
    ————————
    Alias LISTENER
    Version TNSLSNR for Linux: Version 11.2.0.1.0 – Production
    Start Date 26-SEP-2012 12:26:02
    Uptime 5 days 3 hr. 23 min. 33 sec
    Trace Level off
    Security ON: Local OS Authentication
    SNMP OFF
    Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/ listener.ora
    Listener Log File /u01/app/oracle/diag/tnslsnr/LIFIASERVER/listener/aler t/log.xml
    Listening Endpoints Summary…
    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.95)(PORT=1521)))
    Services Summary…
    Service "DEV" has 1 instance(s).
    Instance "DEV", status READY, has 1 handler(s) for this service…
    Service "DEVXDB" has 1 instance(s).
    Instance "DEV", status READY, has 1 handler(s) for this service…
    Service "dg4odbc" has 1 instance(s).
    Instance "dg4odbc", status UNKNOWN, has 1 handler(s) for this service…
    Service "orcl" has 1 instance(s).
    Instance "orcl", status READY, has 1 handler(s) for this service…
    Service "orclXDB" has 1 instance(s).
    Instance "orcl", status READY, has 1 handler(s) for this service…
    The command completed successfully

  71. Digic
    • 8 marzo, 2013
    • 7:06 pm
    • Reply

    Hola Javier,he tratado de realizar una conexion entre ORACLE 10g enterprise a SQLSERVER 2012 a través de db_link heterogeneo. Logre configurar el listener y el tnsnames en ora, también el inithsodbbc, al realizar el tnsping me responde correctamente.

    Al realizar la consulta a la tabla que se encuentra en sqlserver a través del db_link genera el siguiente error:

    SQL> conn misional_pruebas/@bd

    Conectado.

    SQL> select db_link from user_db_links;

    DB_LINK

    ————————————————————————

    SQLSERVDB.REGRESS.RDBMS.DEV.US.ORACLE.COM

    SQL> show user;

    USER es "MISIONAL_PRUEBAS"

    SQL> select * from prueba1@sqlservdb;

    select * from prueba1@sqlservdb

    *

    ERROR en lÝnea 1:

    ORA-28545: error diagnosticado por Net8 al conectar a un agente

    Unable to retrieve text of NETWORK/NCR message 65535

    ORA-02063: 2 lines precediendo a SQLSERVDB.

    Gracias por tu ayuda.

  72. Yina Berenice Martinez Rodriguez
    • 11 mayo, 2013
    • 9:34 pm
    • Reply

    Buenas tardes:

    Solo una preguntita, como hago para desahabilitar el log/traza .trc??, resulta que ocupa muhco espacio y no tengo un disco duro tan generoso, y se me va al 100% de uso gracias a esa traza.

    Mil gracias por tu ayuda.

  73. Anónimo
    • 16 agosto, 2013
    • 6:05 pm
    • Reply

    Hola Javier, te agradezco de antemano el apoyo que me puedas brindar.

    Tengo la bd de oracle en una pc y la de access en otra. He seguido los pasos sobre conectar oracle con access.

    Tengo dificultades al ejecutar los comandos:

    lsnrctl stop

    LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 – Production on 16-AUG-2013 11:55
    :44

    Copyright (c) 1991, 2010, Oracle. All rights reserved.

    Message 1053 not found; No message file for product=NETWORK, facility=TNSTNS-125
    41: Message 12541 not found; No message file for product=NETWORK, facility=TNS
    TNS-12560: Message 12560 not found; No message file for product=NETWORK, facili
    ty=TNS
    TNS-00511: Message 511 not found; No message file for product=NETWORK, facilit
    y=TNS
    64-bit Windows Error: 61: Unknown error

    —-

    lsnrctl start

    LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 – Production on 16-AUG-2013 11:56
    :36

    Copyright (c) 1991, 2010, Oracle. All rights reserved.

    Message 1070 not found; No message file for product=NETWORK, facility=TNSTNS-125
    60: Message 12560 not found; No message file for product=NETWORK, facility=TNS
    TNS-00530: Message 530 not found; No message file for product=NETWORK, facility
    =TNS

    —–

    tnsping cnx_ora_acc

    TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 – Production on 16-AUG-2
    013 11:58:14

    Copyright (c) 1997, 2010, Oracle. All rights reserved.

    Message 3511 not found; No message file for product=NETWORK, facility=TNSTNS-035
    05: Message 3505 not found; No message file for product=NETWORK, facility=TNS

    Adicionalmente, la duda que tengo es si en la pc de la bd de oracle solo se ejecuta el dblink y no se modifican el tsnames.ora, listener.ora ni el initconexion_oracle_access.ora

    Por favor orientame en mis dudas y dificultades.

    Saludos.

  74. Javier Morales
    • 16 agosto, 2013
    • 6:21 pm
    • Reply

    Hola, parece que no tienes definida la variable ORACLE_HOME en la sesión cliente en la que intentas arrancar el listener…

    Un saludo!

  75. Anónimo
    • 16 agosto, 2013
    • 10:37 pm
    • Reply

    Javier, gracias por tu pronta respuesta. Sabes justamente encontré unas indicaciones sobre ello y lo hice pero aun tengo dificultades.
    Sabes yo tengo instalado el ODT para .NET al parecer al no ser un Cliente Oracle estándar es que me da esos detalles.
    Voy a probar instalando el cliente estándar y te comento como me va.
    Saludos,
    Paco.

  76. Anónimo
    • 29 marzo, 2014
    • 5:46 pm
    • Reply

    Hola javier te comento mi problema aver si me podrias ayudar:

    Veras estoy usando el software de Oracle JDeveloper Studio 12.1.2.0.0
    y quiero conectar mi proyecto a una base de datos de Microsoft Access, no encuentro la manera de hacerlo me pordrias ayudar de antemano muchas gracias. tu blog es muy interesante.

    Alberto R.

    Saludos

  77. Javier Morales
    • 29 marzo, 2014
    • 10:47 pm
    • Reply

    Hola Alberto,

    ¿Has probado a crear un ODBC a tu bbdd access?

    Un saludo,
    Javier

  78. Ilich Martinez
    • 5 septiembre, 2014
    • 10:14 pm
    • Reply

    Estoy siguiento todos los pasos de tu articulo y me tope con un error con el cual espero me puedas apoyar.

    El Error se me presenta al crear el DBLink:

    ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

    Ya probe haciendo un TNSPING y si me responde correctamente:
    Esto tengo en el TNSNames:

    SIOA_MIG =
    (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = desarrollo)(PORT = 1521))
    )
    (CONNECT_DATA =
    (SERVICE_NAME = SIOA_MIG)
    (HS = OK)
    )
    )

    Esto tengo en el Listener:
    SID_LIST_LISTENER =
    (SID_LIST =
    (SID_DESC =
    (SID_NAME = PLSExtProc)
    (ORACLE_HOME = C:oracleproduct10.2.0db_1)
    (PROGRAM = extproc)
    )
    (SID_DESC =
    (ORACLE_HOME = C:oracleproduct10.2.0db_1)
    (SID_NAME = sioa_mig)
    (PROGRAM = hsodbc)
    )
    )

    LISTENER =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = desarrollo)(PORT = 1521))
    (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
    )

    Y por ultimo el archivo ini.ora creado:

    HS_FDS_CONNECT_INFO = sioa_mig
    HS_FDS_TRACE_LEVEL = 0
    HS_FDS_TRACE_FILE_NAME = sioa_mig.trc
    HS_AUTOREGISTER = TRUE

    Alguna sugerencia??

  79. Javier Morales
    • 5 septiembre, 2014
    • 10:24 pm
    • Reply

    cual es la salida de un lsnrctl status y lsnrctl services ??

  80. Javier Morales
    • 5 septiembre, 2014
    • 10:25 pm
    • Reply

    El error indica que el nombre de servicio que resuelve tu entrada de tns no coincide con un servicio existence en el listener… Comprueba que no sea cosa de mayusculas/minusculas…

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.