我如何循环思考每个数据库字段以查看范围是否正确
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;
我在 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;