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