Mule JDBC端点在执行SQL查询时导致异常

Mule JDBC端点在执行SQL查询时导致异常,sql,mule,mule-studio,mssql-jdbc,Sql,Mule,Mule Studio,Mssql Jdbc,我在骡子身上遇到了一个奇怪的问题。。我在Mule中公开了一个Web服务,它执行简单的CRUD操作。。 现在的问题是有一个SQL查询:- 如果不存在,请从sysobjects中选择*,其中name='getData'和xtype='U'创建表getData ID int not NULL、name varchar50 NULL、AGE int NULL、DESIGNATION varchar50 NULL 此查询的作用是检查数据库中是否存在该表。。如果存在,则离开;如果不存在,则创建一个具有相同名

我在骡子身上遇到了一个奇怪的问题。。我在Mule中公开了一个Web服务,它执行简单的CRUD操作。。 现在的问题是有一个SQL查询:-

如果不存在,请从sysobjects中选择*,其中name='getData'和xtype='U'创建表getData ID int not NULL、name varchar50 NULL、AGE int NULL、DESIGNATION varchar50 NULL

此查询的作用是检查数据库中是否存在该表。。如果存在,则离开;如果不存在,则创建一个具有相同名称和相同字段的新表

现在,我想在执行insert DB操作之前使用此查询。。也就是说,如果该表存在,那么它将离开该表,并将向其中插入数据。。如果它不存在,那么它将首先创建表,然后向其中插入数据。。 因此,我的骡子流程如下:

 <jdbc-ee:connector name="Database_Global" dataSource-ref="DB_Source" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database">
<jdbc-ee:query key="CheckTableExistsQuery" value="if not exists (select * from sysobjects where name='getData' and xtype='U')create table getData (ID int NOT NULL, NAME varchar(50) NULL,AGE int NULL,DESIGNATION varchar(50) NULL)"/>
<jdbc-ee:query key="InsertQuery" value="INSERT INTO getData(ID,NAME,AGE,DESIGNATION)VALUES(#[flowVars['id']],#[flowVars['name']],#[flowVars['age']],#[flowVars['designation']])"/> 
</jdbc-ee:connector>

<flow name="MuleDbInsertFlow1" doc:name="MuleDbInsertFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="mainData" doc:name="HTTP"/>
<cxf:jaxws-service service="MainData" serviceClass="com.test.services.schema.maindata.v1.MainData"  doc:name="SOAPWithHeader" />
<component class="com.test.services.schema.maindata.v1.Impl.MainDataImpl" doc:name="JavaMain_ServiceImpl"/>
<mulexml:object-to-xml-transformer doc:name="Object to XML"/>
<choice doc:name="Choice">
  <when expression="#[message.inboundProperties['SOAPAction'] contains 'insertDataOperation']">
    <processor-chain doc:name="Processor Chain">
    <logger message="INSERTDATA" level="INFO" doc:name="Logger"/>
    <jdbc-ee:outbound-endpoint exchange-pattern="request-response" queryKey="CheckTableExistsQuery" queryTimeout="-1" connector-ref="Database_Global" doc:name="Database (JDBC)"/>
    <jdbc-ee:outbound-endpoint exchange-pattern="request-response" queryKey="InsertQuery" queryTimeout="-1" connector-ref="Database_Global" doc:name="Database (JDBC)"/>

//remaining code ......
请帮帮我。。请让我知道如何执行查询

如果不存在,请从sysobjects中选择*,其中name='getData'和xtype='U'创建表getData ID int not NULL、name varchar50 NULL、AGE int NULL、DESIGNATION varchar50 NULL


成功地。。。为什么它不是从Mule JDBC端点执行的,而它是从Java代码中的JDBCTemplate执行的呢。。。查询,因此不知道如何处理它

要解决此问题,您需要:

创建您自己的org.mule.transport.jdbc.sqlstrategy.SqlStatementStrategyFactory,方法是细分并添加额外的行为以支持此类查询, 弹簧将其注射到弹簧中。
因此,根据David的建议,最终在Java组件中使用if not exists查询,在Mule流中使用Groovy组件,并为我工作

我遇到了完全相同的错误。事实上,当Mule不知道该做什么时,不受支持的SQL查询甚至缺少queryKey:

java.lang.IllegalArgumentException:未找到SQL语句的SQL策略

在我的例子中是后者,我的测试套件jdbc:connector在类路径中丢失,所以我添加了它

在您的情况下,请尝试如下重写查询。这一个对我有用:

DROP TABLE if exists your_table; 
CREATE TABLE your_table(...
Check table exists and create it */
        String checkTableExists=getQueryByKey("CheckTableExistsQuery"); // Query for check existing table
        jdbcTemplate.execute(checkTableExists); //Create Table If not exists

try {

                String insertDataIntoDB = getQueryByKey("InsertQuery");
                jdbcTemplate.update(insertDataIntoDB, ID, NAME, AGE,
                        DESIGNATION);
                dataResponse.setResponse("Data inserted Successfully");
            } catch (DataIntegrityViolationException e) {
                SQLException sql = (SQLException) e.getCause();
                e.printStackTrace();
                throw sql;
            } catch (Exception e) {
                e.printStackTrace();
                throw e;
            }
DROP TABLE if exists your_table; 
CREATE TABLE your_table(...