Oracle SYS_REFCURSOR正在返回表中的所有行,而不考虑IN参数

Oracle SYS_REFCURSOR正在返回表中的所有行,而不考虑IN参数,oracle,stored-procedures,plsql,sys-refcursor,Oracle,Stored Procedures,Plsql,Sys Refcursor,我在这里面临一个奇怪的问题 PROCEDURE USL_EMPLOYEEBYID ( EMPLOYEE_ID IN NUMBER, EMPIDCURSOR OUT SYS_REFCURSOR ) AS BEGIN OPEN EMPIDCURSOR FOR SELECT emp.employee_id,emp.employee_name,emp.present_address,emp.permanent_address,emp.status FROM

我在这里面临一个奇怪的问题

PROCEDURE USL_EMPLOYEEBYID (  
  EMPLOYEE_ID IN NUMBER,
  EMPIDCURSOR OUT SYS_REFCURSOR  
)  
AS  
BEGIN  
OPEN EMPIDCURSOR FOR  
   SELECT emp.employee_id,emp.employee_name,emp.present_address,emp.permanent_address,emp.status 
   FROM Employee_Info emp 
   WHERE emp.employee_id = EMPLOYEE_ID;
END;
这个程序应该在输入员工Id时给我一个员工。但是它返回所有员工


我做错了什么?

在您的查询中,Oracle将
员工ID
解释为
员工ID
列,而不是输入参数,您可以找到更多信息;这样,您的
其中
条件类似于
a=a

更改参数名称以将其与表列区分开来:

PROCEDURE USL_EMPLOYEEBYID (  
  p_EMPLOYEE_ID IN NUMBER,
  po_EMPIDCURSOR OUT SYS_REFCURSOR  
)  
AS  
BEGIN  
OPEN po_EMPIDCURSOR FOR  
   SELECT emp.employee_id,emp.employee_name,emp.present_address,emp.permanent_address,emp.status 
   FROM Employee_Info emp 
   WHERE emp.employee_id = p_EMPLOYEE_ID;
END;

这是一个很好的实践,在代码中始终知道您是否在处理输入参数、局部变量、列等等

非常感谢。我之前没有注意到这点。@Abdullah Al-Nahian-另一个好的(也是常见的)做法是在所有标识符之前加一个限定符,以显示所有内容的来源。在您的代码中有
emp.employee\u id
,显示这是来自
emp
表。类似地,您可以在右侧编写
usl_employeebyid.employee_id
,以明确显示这是指过程参数,不会出现混淆-您将得到预期的结果。这既不比Aleksej建议的好也不比他建议的差,这只是解决同一问题的另一种方式。