2009-07-03 4 views
5

Je cherche quelque chose de similaire à la tâche sql Ant mais accepte une URL JDBC du format:Comment puis-je me connecter à une base de données Oracle à partir de Ant en utilisant le nom tns?

jdbc:oracle:thin:@TNS_NAME

Une approche possible semble être d'écrire ma propre tâche Ant qui utilise un OracleDataSource pour créer la Connexion, mais y a-t-il un moyen de le faire directement dans Ant?

EDIT: Merci pour les réponses jusqu'à présent les gars. J'espère que cela aidera si j'élabore un peu plus sur l'erreur que je reçois.

Ma tâche Ant se présente comme suit:

<target name="MyTarget" > 
    <property name="oracle.net.tns_admin" value="/opt/oracle/product/10.2.0.1/NETWORK/ADMIN" /> 
    <property name="jdbc.driver" value="ojdbc5.jar" /> 
    <property name="jdbc.i18n.support" value="orai18n.jar" /> 
    <property name="jdbc.driver.class" value="oracle.jdbc.OracleDriver" /> 
    <path id="sql.class.path"> 
     <pathelement location="${jdbc.driver}" /> 
     <pathelement location="${jdbc.i18n.support}" /> 
    </path> 

    <sql driver="${jdbc.driver.class}" url="jdbc:oracle:thin:@THE_TNS_NAME" userid="USER" password="PASSWORD" classpathref="sql.class.path" > 
     <![CDATA[ 
     #SOME ARBITRARY SQL HERE 
     ]]> 
    </sql> 
</target> 

Cela échoue avec l'erreur:

java.sql.SQLException: Io exception: Unknown host specified

Remplacement de l'URL avec "jdbc: oracle: thin: @HOST: PORT: INSTANCE" œuvres bien, et je peux aussi tnsping le nom de tns utilisé ci-dessus, donc je sais que c'est valide.

+0

Cela devrait fonctionner avec la tâche Ant sql habituelle, n'est-ce pas? Y a-t-il un problème à l'utiliser de cette façon? – Stobor

+0

Ce serait parfait si cela fonctionnait, mais je dois faire quelque chose de mal. J'ai mis à jour la question avec mon script Ant - y a-t-il un défaut? – zakvdm

+0

Êtes-vous connecté avec Oracle ou MySQL? –

Répondre

6

Travaillait juste avec ceci aujourd'hui et est tombé sur la pièce manquante. L'emplacement TNS doit être défini comme une propriété du système comme indiqué ici: Oracle thin JDBC to TNS name

To establish an Oracle thin JDBC connection to a TNS alias (tnsname), make sure you pass the oracle.net.tns_admin system property to the JVM. Its value should be the directory in which your tnsnames.ora file is located. After that, you can just pass the TNS alias in place of the host name in the JDBC URL.

E.g. if you simply try to connect to jdbc:oracle:thin:@MYDB, which is in your tnsnames.ora file, you’ll get an SQLException with a detail message of Io exception: Unknown host specified. If you fire up the JVM with a -Doracle.net.tns_admin=/oracle/10g/NETWORK/ADMIN, or use System.setProperty(String,String) after startup, the connection will be established successfully.

Après avoir fait cela, j'ai pu se connecter avec succès en utilisant l'alias TNS seul.

+0

Merci pour votre réponse! Cela fait tellement longtemps que j'ai eu ce problème que je peux à peine me souvenir des détails, mais votre réponse semble très prometteuse, :) – zakvdm

0

Si vous voulez dire que vous voulez une connexion « épaisse » qui utilise tnsnames.ora et non le conducteur mince, alors vous pouvez envelopper un appel à sqlplus dans le fichier xml:

<target name="myTarget"> 
    <!-- login.sql should have sqlcode exit so failonerror will fail build --> 
    <exec executable="sqlplus" failonerror="true"> 
     <arg value="${userid}/${password}@${tnsalias}"/> 
     <arg value="@myScript"/> 
    </exec> 
</target> 

... est l'idée de base.

[où userid, mot de passe et tnsalias sont définis dans votre fichier de propriétés]

Cela signifie évidemment que vous devrez avoir au moins la pile Instant Client installé.

0

Puisque nous ne maintenant encore, quel est le problème exact est, je ne peux que supposer que cela pourrait aider:

http://theblasfrompas.blogspot.com/2008/04/jdbc-thin-connection-using-tnsnamesora.html

+0

Ce lien m'a été très utile dans le passé, mais dans ce cas précis, j'essaie de me connecter depuis Ant. Dois-je toujours spécifier la propriété système oracle.net.tns_admin? Si oui, comment ferais-je cela? J'ai mis à jour ma question avec la façon dont je l'utilise actuellement. Merci pour l'aide. – zakvdm

+0

Je le pense. Vous le faites comme ceci: que j'ai copié d'ici: http: // ideoplex.com/id/372/setting-java-system-properties-with-ant –

0

Etes-vous sûr de son réseau/ADMIN et non network/admin?

Les systèmes de fichiers Unix sont généralement sensibles à la casse (en supposant que c'est sous Unix).

+0

Vous avez tout à fait raison, c'est en fait "réseau/admin". Cependant, j'ai essayé les deux et cela n'a fait aucune différence. Je me demande s'il n'y a pas de meilleur moyen de passer la propriété à la tâche sql (quand j'appelle la cible java, j'utilise un 'sysproperty', mais la tâche sql ne semble pas supporter cela ...) . – zakvdm