1

When I run the following simple route with a stored-procdure, it results in an exception: "java.sql.SQLException: Non supported SQL92 token at position"

The same route with embedded Derby datasources works as expected.

Question

Any ideas? Is something wrong with my "implementation" or is it a problem of the underlying jar files?

Stack:

  • camel 2.23.2
  • ojdbc7.jar
  • Spring XML

Route:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

    <!-- In Memory Database
  <jdbc:embedded-database id="myDataSource" type="DERBY">
    <jdbc:script location="classpath:/sql/createAndPopulateDatabase.sql"/>
  </jdbc:embedded-database>
  -->

    <bean id="oracleDataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@..."/>
        <property name="username" value="xx"/>
        <property name="password" value="yy"/>
    </bean>

    <bean id="sql-stored" class="org.apache.camel.component.sql.SqlComponent">
        <property name="dataSource" ref="oracleDataSource"/>
    </bean>

    <camelContext id="camel" 
        xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="direct:start"/>
            <setHeader headerName="in1">
                <constant>1</constant>
            </setHeader>
            <setHeader headerName="in2">
                <constant>1</constant>
            </setHeader>
            <to uri="sql-stored:INOUTDEMO(INTEGER ${headers.in1},INOUT INTEGER ${headers.in2} out1,OUT INTEGER out2)"/>
            <log message="Result: ${body}" loggingLevel="INFO" />
        </route>
    </camelContext>
</beans>

Stored-Procedure: I know that the procedure would not work in an oracle db, but the exception is thrown "long" before the involved classes / methods would recognize, that the procedure doesn't work / even exist.

CREATE PROCEDURE INOUTDEMO(IN1 INTEGER, INOUT IN2 INTEGER, OUT OUT1 INTEGER)
 PARAMETER STYLE JAVA
 LANGUAGE JAVA
 EXTERNAL NAME
'org.apache.camel.component.sql.stored.TestStoredProcedure.inoutdemo';

Stacktrace:

Caused by: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException; SQL state [99999]; error code [17034]; Nicht unterstütztes SQL92-Token in Position: 20; nested exception is java.sql.SQLException: Nicht unterstütztes SQL92-Token in Position: 20
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:89)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1414)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:632)
    at org.apache.camel.component.sql.SqlProducer.process(SqlProducer.java:116)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:76)
    at org.apache.camel.processor.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:186)
    at org.apache.camel.processor.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:86)
    at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:541)
    at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:506)
    at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:369)
    at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:506)
    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:229)
    at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:144)
    at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:161)
    ... 30 more

Caused by: java.sql.SQLException: Nicht unterstütztes SQL92-Token in Position: 20
    at oracle.jdbc.driver.OracleSql.handleODBC(OracleSql.java:1306)
    at oracle.jdbc.driver.OracleSql.parse(OracleSql.java:1192)
    at oracle.jdbc.driver.OracleSql.getSql(OracleSql.java:326)
    at oracle.jdbc.driver.OracleParameterMetaData.getParameterMetaData(OracleParameterMetaData.java:46)
    at oracle.jdbc.driver.OraclePreparedStatement.getParameterMetaData(OraclePreparedStatement.java:11621)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.getParameterMetaData(OraclePreparedStatementWrapper.java:1552)
    at org.apache.commons.dbcp2.DelegatingPreparedStatement.getParameterMetaData(DelegatingPreparedStatement.java:162)
    at org.apache.commons.dbcp2.DelegatingPreparedStatement.getParameterMetaData(DelegatingPreparedStatement.java:162)
    at org.apache.camel.component.sql.SqlProducer$2.doInPreparedStatement(SqlProducer.java:120)
    at org.apache.camel.component.sql.SqlProducer$2.doInPreparedStatement(SqlProducer.java:1)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617)
    ... 48 more
Sebastian
  • 11
  • 1

2 Answers2

0

For oracle procedure/function parameters it should be variable name followed by in/out followed by data type. E.g "out1 out integer"

djanoti
  • 303
  • 2
  • 8
0

The only way I made it "work" was like that:

<to uri="sql-stored: CALL HELLOWORLD(:#testValue,:#result)"/-->

With that - no IN, INOUT, OUT or type argument and "CALL" - it is at least possible to execute the stored procedure in the oracle db.

Unfortunately, I am still struggeling to map the return value op the stored procedure back to camel header oder body variable.

Sebastian
  • 11
  • 1