Oracle中的Where子句无法正常工作

3

我的存储过程如下:

CREATE OR REPLACE PROCEDURE     Proc_SearchRequests
(
RequestedBy LONG,
FromDate DATE DEFAULT NULL,
ToDate DATE DEFAULT NULL,
RequestedByDesignation VARCHAR2 DEFAULT NULL,
TypeId INT,
CurrentStatusId INT DEFAULT NULL, 
AmountFrom LONG DEFAULT NULL,
AmountTo LONG DEFAULT NULL,
cur_ExcelOutput OUT SYS_REFCURSOR
  )
AS   
BEGIN
OPEN cur_ExcelOutput FOR
SELECT cd.*,
emp.FIRSTNAME || ' ' || emp.LASTNAME   AS ADDEDBYNAME
FROM 
DETAILS cd
LEFT JOIN EMPLOYEES emp ON cd.ADDEDBY = emp.EMPLOYEEID
WHERE
cd.TYPEID=TypeId;   

END;

我将执行过程传递为以下内容:

我正在传递执行过程:

BEGIN
PROC_SEARCHREQUESTS (110, to_date ('2001-01-01', 'YYYY-MM-DD'), to_date ('9999-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS'), null, 2, 0, 0, 0, :cur_exceloutput$REFCURSOR);
END;

无论我传递什么TypeId值,我都会得到完整的数据而不是过滤后的数据。 如果我写"cd.TYPEID=2",我可以得到正确的结果,但是通过变量传递值并没有帮助。 可能出了什么问题?我是否漏掉了任何强制转换或其他内容?
2个回答

8
您出现了名称冲突。 变量与列具有相同的名称。请更改变量(参数)。
TypeId INT,

转换为

p_TypeId INT,

1
这实际上可行了...但我不理解原因...这个 "p_" 是什么意思? - user1181942
1
好的,我明白了。我不知道变量名不能与列名相同。谢谢。这增加了我的知识。 - user1181942
p来自参数,是一种命名约定。我只是更改了您变量的名称。 - Florin Ghita

4

在编写存储过程时,您总是希望采用某种命名约定来区分本地变量、过程参数和数据库列。由于标识符首先使用表中列的名称解析,然后使用本地变量或参数的名称解析,因此在 WHERE 子句的两侧都要注意。

WHERE cd.TYPEID=TypeId;   

解析为Details表的TypeID列。该查询不会查看参数TypeID中的值。

如果您采用标准命名约定(即使用p_前缀参数和l_前缀本地变量),您就不必担心引入范围解决错误。

以下内容应该可以正常工作(尽管您正在使用的数据类型非常不寻常-例如,LONG已被淘汰了很长时间,因此您应该在那里使用VARCHAR2(或者如果您确实需要超过32k,则使用CLOB,但这似乎是不太可能的,考虑到名称)。

CREATE OR REPLACE PROCEDURE     Proc_SearchRequests
(
  p_RequestedBy LONG,
  p_FromDate DATE DEFAULT NULL,
  p_ToDate DATE DEFAULT NULL,
  p_RequestedByDesignation VARCHAR2 DEFAULT NULL,
  p_TypeId INT,
  p_CurrentStatusId INT DEFAULT NULL, 
  p_AmountFrom LONG DEFAULT NULL,
  p_AmountTo LONG DEFAULT NULL,
  p_cur_ExcelOutput OUT SYS_REFCURSOR
)
AS   
BEGIN
  OPEN p_cur_ExcelOutput FOR
    SELECT cd.*,
           emp.FIRSTNAME || ' ' || emp.LASTNAME   AS ADDEDBYNAME
    FROM 
      DETAILS cd
      LEFT JOIN EMPLOYEES emp ON cd.ADDEDBY = emp.EMPLOYEEID
    WHERE
      cd.TYPEID=p_TypeId;   
END;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接