IN 查询未返回任何结果,工作灯 SQL 适配器

IN query not returning any result, worklight SQL Adapter

我已经创建了 SQL 适配器来使用 Oracle DB,并使用 Worklight 6.1。

以下是SQL适配器的代码:

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 地址之一传递给查询,它将返回结果集。
  4. 我的worklight studio版本是6.1.0.01-20140418-0637

您正在传递带有 ? 的单个标量绑定值和单个逗号分隔值字符串。您的查询正在查找 MAC 为 "xx:xx:xx:xx:xx","yy:yy:yy:yy:yy" 的行,而不是任何与所寻址的个人相匹配的行。 IN 不会自动将您的字符串分解为标记。

有多种方法可以实现,但我不确定你的平台支持什么;例如,我看不到您可以传递单个字符串的 Oracle 数组(例如 sys.odcivarchar2list),这些字符串被视为 table。

如果您可以更改查询,那么这里有一种方法可能会奏效。你可以用这样的东西来标记你的字符串:

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