Pregunta

He escrito un script PHP para extraer una consulta de una base de datos Oracle y escribir resultados en un archivo CSV. Estoy usando Zend Framework para conectarme a la base de datos. Sé que las credenciales son correctas, ya que puedo conectarme a través del terminal usando SQLPLUS.

Este es el error:

Zend_Db_Adapter_Exception: SQLSTATE[HY000]: pdo_oci_handle_factory: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor (/home/http/php-5.3.3/ext/pdo_oci/oci_driver.c:579) in /opt/http/Zend/ZendFramework-1.10.3/library/Zend/Db/Adapter/Pdo/Abstract.php on line 144

He tratado de investigar, pero no hay soluciones sólidas. Leí que podría estar asociado con tnsnames.ora, pero no pude encontrar ese archivo en el servidor. He usado Zend antes en otros proyectos sin ningún problema.

FYI: No tengo raíz, así que no puedo hacer mucha magia en el servidor.

¿Cuáles son tus sugerencias?

¿Fue útil?

Solución

Ese es un error de error común de Oracle, no hay nada que ver con Zend o incluso PHP. Por lo general, recibo este mensaje en SQLDegeloper o Toad. Consulte tnsnames.ora, oyente.ora, sqlnet.ora, archivos de registro, etc. e intente conectarse con una aplicación de cliente. (Si no funciona, puede informarlo a los administradores)

Otros consejos

Necesita crear un archivo llamado tnsnames.ora en su $ORACLE_HOME/network/admin carpeta y póngala tu sid.

O si no puede crear su tnsnames.ora, intente configurar su configuración de DB usando esta sintaxis:

$config = new Zend_Config(
array(
'database' => array(
'adapter' => 'oracle',
'params' => array(
    'dbname'=> '(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = hostname.domain.tld)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = service_name)))',
    'username' => 'dev',
    'password' => 'pwd')
    )
)
);
$db = Zend_Db::factory($config->database);
Zend_Db_Table::setDefaultAdapter($db);

Aunque es mejor crear tnsnames.ora con su configuración de DB.

Para aquellos que no usan el marco Zend, pero con un problema similar, se puede encontrar una solución a este problema en http://docs.php.net/manual/en/ref.pdo-oci.php#64756

$tns = "  
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = yourip)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
       ";
$db_username = "youname";
$db_password = "yourpassword";
try{
    $conn = new PDO("oci:dbname=".$tns,$db_username,$db_password);
}catch(PDOException $e){
    echo ($e->getMessage());
}

Si está utilizando SID para conectarse, cambie

(SERVICE_NAME = orcl) 

a

(SID = yourSid) 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top