tags:

views:

1104

answers:

3

I am looking for something similar to the Ant sql task but that will accept a JDBC url of the format:

jdbc:oracle:thin:@TNS_NAME

One possible approach seems to be to write my own Ant task that uses an OracleDataSource to create the Connection, but is there a way to do this straight in Ant?

EDIT: Thanks for the responses so far guys. I hope it helps if I elaborate a bit more on the error I'm getting.

My Ant task looks as follows:

<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>

This fails with the error:

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

Replacing the url with "jdbc:oracle:thin:@HOST:PORT:INSTANCE" works fine, and I can also tnsping the tns name used above, so I know it's valid.

A: 

If you mean that you want a "thick" connection that uses tnsnames.ora and not the thin driver, then you can wrap a call to sqlplus in the xml file:

<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>

... is the basic idea.

[where userid, password, and tnsalias are defined in your properties file]

This obviously means you'll have to have at least the Instant Client stack installed.

dpbradley
A: 

Since we don't now yet, what the exact problem is, I can only assume that this might help:

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

Jens Schauder
This link has been very useful for me in the past, but in this particular case I am trying to connect from within Ant. Do I still need to specify the oracle.net.tns_admin system property? If so, how would I do that? I have updated my question with the way I am currently using it. Thanks for the help.
zakvdm
I would think so. You do it like this: <sysproperty key="test.property" value="blue" />which I copied from here: http://ideoplex.com/id/372/setting-java-system-properties-with-ant
Jens Schauder
A: 

Are you sure it's NETWORK/ADMIN and not network/admin?

Unix filesystems are usually case sensitive - (assuming it's on Unix).

CaptainPicard
You're quite right, it is actually "network/admin". However, I have tried both and it made no difference. I'm wondering if there isn't a better way to pass the property to the sql task (when I call the java target, I use a 'sysproperty', but the sql task doesn't seem to support this...).
zakvdm