我创建了SQL适配器以使用Oracle DB,并使用Worklight 6.1。
以下是SQL Adapter的代码:
var checkOwner = WL.Server.createSQLStatement("SELECT * FROM shopowners WHERE macaddress IN (?)");
function checkShopOwners ( deviceList ){
WL.Logger.warn("In checkShopOwners");
var allDeviceJSONArray = JSON.parse(deviceList);
var preparedMACAddresses = "";
for ( var macaddress in allDeviceJSONArray ) {
WL.Logger.warn(allDeviceJSONArray[macaddress]);
preparedMACAddresses += "\"" + allDeviceJSONArray[macaddress] + "\",";
}
preparedMACAddresses = preparedMACAddresses.substring(0, preparedMACAddresses.length - 1);
WL.Logger.warn(preparedMACAddresses);
var options = {
preparedStatement : checkOwner,
parameters : [ preparedMACAddresses ]
};
var result = WL.Server.invokeSQLStatement(options);
WL.Logger.warn("result : " + JSON.stringify(result));
if ( result.isSuccessful ) {
WL.Logger.warn("Shop owner selected");
}
else {
WL.Logger.warn("result : " + JSON.stringify(result));
}
}
此查询不返回任何结果。我将deviceList作为JSON数组传递,其中包含设备的MAC地址。
我的数据库中有一个MAC地址,但它仍然没有返回任何结果。
任何帮助都将不胜感激。
P.S:
preparedMACAddresses
会产生类似的结果。 “XX:XX:XX:XX:XX”, “YY:YY:YY:YY:YY”preparedMACAddresses
。 'xx:xx:xx:xx:xx','yy:yy:yy:yy:yy',但这也无效。checkOwner = WL.Server.createSQLStatement("SELECT * FROM shopowners WHERE macaddress = ?");
并将其中一个mac地址传递给查询,则返回resultSet。答案 0 :(得分:1)
您使用?
传递单个标量绑定值,并使用逗号分隔值的单个字符串。您的查询正在寻找MAC为"xx:xx:xx:xx:xx","yy:yy:yy:yy:yy"
的行,而不是任何与所寻址的个人匹配的行。 IN
不会自动将您的字符串分解为令牌。
有多种方法可以实现这一目标,但我不确定您的平台会支持什么;例如,我没有看到您可以传递被视为表的单个字符串的Oracle数组(例如sys.odcivarchar2list)。
如果您可以更改查询,可以使用以下方法。您可以使用以下内容标记字符串:
WITH cte1 AS (
SELECT ? AS mac_list FROM dual
),
cte2 AS (
SELECT regexp_substr(mac_list, '[^,]+', 1, level) AS macaddress
FROM cte1
CONNECT BY regexp_substr(mac_list, '[^,]+', 1, level) IS NOT NULL
)
SELECT * FROM cte2;
将绑定变量设置为字符串xx:xx:xx:xx:xx,yy:yy:yy:yy:yy
(每个元素周围没有单引号或双引号!),它给出了:
MACADDRESS
--------------
xx:xx:xx:xx:xx
yy:yy:yy:yy:yy
因此,您的真实查询可以加入,例如:
WITH cte1 AS (
SELECT ? AS mac_list FROM dual
),
cte2 AS (
SELECT regexp_substr(mac_list, '[^,]+', 1, level) AS macaddress
FROM cte1
CONNECT BY regexp_substr(mac_list, '[^,]+', 1, level) IS NOT NULL
)
SELECT * FROM cte2 JOIN shopowners ON shopowner.macaddress = cte2.macaddress;
我在这里使用了两个CTE,所以你只需要传递一次绑定参数;你可以直接在正则表达式子句中使用它,但因为它会被引用两次你必须传递两次。