我有一个API,它将使用DBReport Mediator解析并将20000+行插入到oracle数据库表中。我的api代码:
<api xmlns="http://ws.apache.org/ns/synapse" name="AllMembers" context="/AllMembers">
<resource methods="GET">
<inSequence>
<send>
<endpoint>
<http uri-template="https://xxxxxxxxxxxxxxxxxxxxxx"/>
<property name="Authorization" value="Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" scope="transport"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<dbreport useTransaction="true">
<connection>
<pool>
<dsName>xxxxxxxxx</dsName>
</pool>
</connection>
<statement>
<sql>DELETE FROM MEMBERS_API_TBL </sql>
</statement>
</dbreport>
<foreach id="foreach_1" expression="//jsonObject">
<sequence>
<dbreport useTransaction="true">
<connection>
<pool>
<dsName>xxxxxxxxx</dsName>
</pool>
</connection>
<statement>
<sql>INSERT INTO MEMBERS_API_TBL VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)</sql>
<parameter expression="//status" type="VARCHAR"/>
<parameter expression="//xxxx" type="VARCHAR"/>
<parameter expression="//account_id" type="NUMERIC"/>
<parameter expression="//fields//xxxx" type="VARCHAR"/>
<parameter expression="//fields//xxxx" type="VARCHAR"/>
<parameter expression="//fields//xxxxx" type="VARCHAR"/>
<parameter expression="//fields//xxxxxx" type="VARCHAR"/>
<parameter expression="//fields//xxxxx" type="VARCHAR"/>
<parameter expression="//fields//xxxxx" type="VARCHAR"/>
<parameter expression="//fields//xxxxx" type="VARCHAR"/>
<parameter expression="//fields//xxxxx" type="VARCHAR"/>
<parameter expression="//member_id" type="NUMERIC"/>
<parameter expression="//email" type="VARCHAR"/>
<parameter expression="get-property('SYSTEM_DATE')" type="VARCHAR"/>
</statement>
</dbreport>
</sequence>
</foreach>
<respond/>
</outSequence>
</resource>
</api>
执行时,我得到ORA-01000:超过了最大打开游标,我的默认数据库OPEN游标限制为1000,但是我必须插入20K +行,有没有一种方法可以在WSO2 EI中做到这一点而无需修改数据库打开光标限制。
有什么建议吗?
答案 0 :(得分:0)
当我将其设置为“ False”时,它可以正常工作。
答案 1 :(得分:0)
几周前,我也遇到了类似的问题。不幸的是,没有任何数据库通过使用“插入值”语法允许每次运行不超过1000次插入。
相反,我使用Insert into((列名)选择'columnOne','columnTwo',....'columnN'UNION ALL选择'columnOne','columnTwo',....'columnN'....
在这里,每个select语句都包含列值,并且UNION ALL连接了多个行插入。
<iterate continueParent="true" expression="$body//*[local-name()='rootElement']" sequential="true">
<target>
<sequence>
<property expression="//ColumnOne//text()" name="ColumnOne" scope="default" type="STRING" />
<property expression="//ColumnTwo/text()" name="ColumnTwo" scope="default" type="STRING" />
<property expression="//ColumnN/text()" name="ColumnN" scope="default" type="STRING" />
<property name="Quotes" scope="default" type="STRING" value="'" />
<filter regex="false" source="boolean(get-property('operation','concat-data'))">
<then>
<property expression="fn:concat('Insert into TableName(ColumnOne,ColumnTwo,....,ColumnN) values ','(',get-property('Quotes'),get-property('ColumnOne'),get-property('Quotes'),',',get-property('Quotes'),get-property('ColumnTwo'),get-property('Quotes'),',',get-property('Quotes'),get-property('ColumnN'),get-property('Quotes'),')')" name="concat-data" scope="operation" type="STRING" />
</then>
<else>
<property expression="fn:concat(get-property('operation','concat-data'),',','(',get-property('Quotes'),get-property('ColumnOne'),get-property('Quotes'),',',get-property('Quotes'),get-property('ColumnTwo'),get-property('Quotes'),',',get-property('Quotes'),get-property('ColumnN') ,get-property('Quotes'),')')" name="concat-data" scope="operation" type="STRING" />
</else>
</filter>
</sequence>
</target>
</iterate>
<property expression="get-property('operation','concat-data')" name="BulkInsertQuery" scope="default" type="STRING" />
您可以在数据库调解器查询中提取属性BulkInsertQuery作为参数。