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:
-
preparedMACAddresses
结果是这样的。 "xx:xx:xx:xx:xx","yy:yy:yy:yy:yy"
- 我也试过
preparedMACAddresses
这样。 'xx:xx:xx:xx:xx'、'yy:yy:yy:yy:yy',但这也不起作用。
- 如果我创建 var
checkOwner = WL.Server.createSQLStatement("SELECT * FROM shopowners WHERE macaddress = ?");
并将 mac 地址之一传递给查询,它将返回结果集。
- 我的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,因此您只需传递一次绑定参数;您可以直接在正则表达式子句中使用它,但由于它会被引用两次,因此您必须传递它两次。
我已经创建了 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:
-
preparedMACAddresses
结果是这样的。 "xx:xx:xx:xx:xx","yy:yy:yy:yy:yy" - 我也试过
preparedMACAddresses
这样。 'xx:xx:xx:xx:xx'、'yy:yy:yy:yy:yy',但这也不起作用。 - 如果我创建 var
checkOwner = WL.Server.createSQLStatement("SELECT * FROM shopowners WHERE macaddress = ?");
并将 mac 地址之一传递给查询,它将返回结果集。 - 我的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,因此您只需传递一次绑定参数;您可以直接在正则表达式子句中使用它,但由于它会被引用两次,因此您必须传递它两次。