在查询中没有返回任何结果,worklight SQL Adapter

时间:2015-06-11 05:52:04

标签: oracle ibm-mobilefirst worklight-adapters

我创建了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:

  1. preparedMACAddresses会产生类似的结果。 “XX:XX:XX:XX:XX”, “YY:YY:YY:YY:YY”
  2. 我也试过这样做preparedMACAddresses。 'xx:xx:xx:xx:xx','yy:yy:yy:yy:yy',但这也无效。
  3. 如果我创建var checkOwner = WL.Server.createSQLStatement("SELECT * FROM shopowners WHERE macaddress = ?");并将其中一个mac地址传递给查询,则返回resultSet。
  4. 我的worklight工作室版本 6.1.0.01-20140418-0637

1 个答案:

答案 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,所以你只需要传递一次绑定参数;你可以直接在正则表达式子句中使用它,但因为它会被引用两次你必须传递两次。