我如何循环思考每个数据库字段以查看范围是否正确

How do I loop thought each DB field to see if range is correct

我在 soapUI 中有这样的回复:

 <pointsCriteria>
    <calculatorLabel>Have you registered for inContact, signed up for marketing news from FNB/RMB Private Bank, updated your contact details and chosen to receive your statements</calculatorLabel>
    <description>Be registered for inContact, allow us to communicate with you (i.e. update your marketing consent to 'Yes'), receive your statements via email and keep your contact information up to date</description>
    <grades>
       <points>0</points>
       <value>No</value>
    </grades>
    <grades>
       <points>1000</points>
       <value>Yes</value>
    </grades>
    <label>Marketing consent given and Online Contact details updated in last 12 months</label>
    <name>c21_mrktng_cnsnt_cntct_cmb_point</name>
 </pointsCriteria>

有很多很多点条件,我使用下面的 xquery 给我该字段的 DB 值和范围:

<return>
{
for $x in //pointsCriteria
return <DBRange>
<db>{data($x/name/text())}</db> 
<points>{data($x//points/text())}</points>
</DBRange>
}
</return>

我得到以下回复

<return><DBRange><db>c21_mrktng_cnsnt_cntct_cmb_point</db><points>0 1000</points></DBRange>

最后一位位于 属性 传输中。我需要 SQL 来恢复该数据库字段不在该点范围内的所有行(在这种情况下字段只能是 0 或 1000),我的问题是我不知道如何遍历每个 DBRange/DBrange 以这种方式?请帮忙

我不确定我是否真的理解你的问题,但我认为你想在你的数据库中使用特定的 table 进行查询,并在你的 <db> 字段中定义列名您的 xml,并将相同 xml 的 <points> 字段中定义的值用作值。

所以你可以尝试使用 groovy TestStep,首先解析你的 Xml 并取回你的列名和你的分数。如果值用空格 space 分隔,要遍历点,您可以创建一个 split(" ") 来获取列表,然后使用 each() 遍历该列表中的点。然后使用 groovy.sql.Sql 您可以在您的数据库中执行查询。

只有一件事,您需要将供应商数据库的 JDBC drivers 放入 $SOAPUI_HOME/bin/ext 中,然后重新启动 SOAPUI 以便它可以加载必要的驱动程序 类.

所以下面的代码方法可以实现你的目标:

import groovy.sql.Sql
import groovy.util.XmlSlurper
// soapui groovy testStep requires that first register your
// db vendor drivers, as example I use oracle drivers...
com.eviware.soapui.support.GroovyUtils.registerJdbcDriver( "oracle.jdbc.driver.OracleDriver")
// connection properties db (example for oracle data base)
def db = [
    url : 'jdbc:oracle:thin:@db_host:d_bport/db_name',
    username : 'yourUser',
    password : '********',
    driver : 'oracle.jdbc.driver.OracleDriver'
]
// create the db instance
def sql = Sql.newInstance("${db.url}", "${db.username}", "${db.password}","${db.driver}")

def result = '''<return>
    <DBRange>
        <db>c21_mrktng_cnsnt_cntct_cmb_point</db>
        <points>0 1000</points>
    </DBRange>
   </return>'''

def resXml = new XmlSlurper().parseText(result)
// get the field
def field = resXml.DBRange.db.text()
// get the points
def points = resXml.DBRange.points.text()
// points are separated by blank space,
// so split to get an array with the points
def pointList = points.split(" ")
// for each point make your query
pointList.each {
    def sqlResult = sql.rows "select * from your_table where ${field} = ?",[it]
    log.info sqlResult
}

sql.close();

希望这对您有所帮助,

再次感谢@albciff 的帮助,我不得不将其添加到多维数组中(我将 field 重命名为 column 并且 result 是一个大的 return来自上面的 Xquery)

def resXml = new XmlSlurper().parseText(result)
//get the columns and points ranges
def Column = resXml.DBRange.db*.text()
def Points = resXml.DBRange.points*.text()
//sorting it all out into a multidimensional array (index per index)
count = 0
bigList = Column.collect
{
    [it, Points[count++]]
}
//iterating through the array
bigList.each
{//creating two smaller lists and making it readable for sql part later
    def column = it[0]
    def points = it[1]
    //further splitting the points to test each
    pointList = points.split(" ")
    pointList.each
    {//test each points range per column
        def sqlResult = sql.rows "select * from my_table where ${column} <> ",[it]
        log.info sqlResult
    }
}
sql.close();
return;