Oracle 中的 Cursor - 传递参数后,select 不过滤结果行
Cursor in Oracle - after passing parameters, select does not filter result rows
我遇到了以下参数光标的奇怪问题。
我是这样定义游标的:
CURSOR cur_action ( product_code VARCHAR2(100) , action_master_list VARCHAR2(100))
IS
SELECT
act.ACTION_DETAIL_KEY,
act.ACTION_MASTER_KEY,
act.PRODUCT_CODE,
act.REF_ACTION_DETAIL_KEY
FROM XMLTABLE(action_master_list) x
JOIN ETDW.MFE_AR_ACTION_DETAILS act ON TO_NUMBER(x.COLUMN_VALUE) = act.ACTION_MASTER_KEY
WHERE 1=1
AND act.LAST_FLAG = 'Y'
AND act.PRODUCT_CODE = product_code;
然后我按以下方式使用它:
OPEN cur_action ( iFromProductCode , iActionMasterKeyList);
LOOP
FETCH cur_action BULK COLLECT INTO vActionDetailKey, vActionMasterKey, vProductCode, vRefActionDetailKey LIMIT 100;
FOR j IN 1..cur_action%ROWCOUNT
LOOP
dbms_output.put_line('vActionDetailKey: ' || vActionDetailKey (j) ||' vActionMasterKey: '|| vActionMasterKey (j) || ' vProductCode: ' || vProductCode (j));
END LOOP;
END LOOP;
结果似乎未过滤。它没有 return 3 行作为预期结果(当我 运行 在外部 procedure/pl 块中时,此结果是 return 使用游标查询输入的),但它 returns 列表中操作的所有行。 看来,WHERE 条件“act.PRODUCT_CODE = product_code”没有应用。 为什么?
谢谢
为什么?因为您将参数命名为与列相同,所以 Oracle 将其读取为 where 1 = 1
,即根本没有过滤。
将参数重命名为例如
CURSOR cur_action ( par_product_code V
----
this
之后,
AND act.PRODUCT_CODE = par_product_code;
----
this
我遇到了以下参数光标的奇怪问题。
我是这样定义游标的:
CURSOR cur_action ( product_code VARCHAR2(100) , action_master_list VARCHAR2(100))
IS
SELECT
act.ACTION_DETAIL_KEY,
act.ACTION_MASTER_KEY,
act.PRODUCT_CODE,
act.REF_ACTION_DETAIL_KEY
FROM XMLTABLE(action_master_list) x
JOIN ETDW.MFE_AR_ACTION_DETAILS act ON TO_NUMBER(x.COLUMN_VALUE) = act.ACTION_MASTER_KEY
WHERE 1=1
AND act.LAST_FLAG = 'Y'
AND act.PRODUCT_CODE = product_code;
然后我按以下方式使用它:
OPEN cur_action ( iFromProductCode , iActionMasterKeyList);
LOOP
FETCH cur_action BULK COLLECT INTO vActionDetailKey, vActionMasterKey, vProductCode, vRefActionDetailKey LIMIT 100;
FOR j IN 1..cur_action%ROWCOUNT
LOOP
dbms_output.put_line('vActionDetailKey: ' || vActionDetailKey (j) ||' vActionMasterKey: '|| vActionMasterKey (j) || ' vProductCode: ' || vProductCode (j));
END LOOP;
END LOOP;
结果似乎未过滤。它没有 return 3 行作为预期结果(当我 运行 在外部 procedure/pl 块中时,此结果是 return 使用游标查询输入的),但它 returns 列表中操作的所有行。 看来,WHERE 条件“act.PRODUCT_CODE = product_code”没有应用。 为什么?
谢谢
为什么?因为您将参数命名为与列相同,所以 Oracle 将其读取为 where 1 = 1
,即根本没有过滤。
将参数重命名为例如
CURSOR cur_action ( par_product_code V
----
this
之后,
AND act.PRODUCT_CODE = par_product_code;
----
this