2012-07-24 66 views
2
不工作第

我的存储过程是这样的:凡在甲骨文

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”我得到正确的结果,但传递值varible不起作用。

什么可能是错的?我是否缺少任何铸件或其他东西?

回答

7

你有名字冲突。该变量与列的名称相同。 变量(参数)

TypeId INT, 

更改为

p_TypeId INT, 
+1

这实际上工作......但我不明白原因......什么是这个“p_”? – user1181942 2012-07-24 05:45:40

+1

好的我知道了..我不知道变量名称不能与列名称相同..谢谢..这增加了我的知识.. – user1181942 2012-07-24 05:47:37

+0

p来自参数。是一个命名约定。我刚刚更改了变量的名称。 – 2012-07-24 05:48:23

4

当你写一个存储过程,你总是希望有某种命名约定来区分局部变量,过程参数,并数据库列。由于标识使用在表中的列名,然后使用一个局部变量或参数的名称,首先解决了WHERE条款

WHERE cd.TYPEID=TypeId; 

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

如果您采用标准命名约定(即使用p_和局部变量l_作为前缀参数),则不必担心引入范围解析错误。

像这样的东西应该工作(虽然你正在使用的数据类型,所以你真的应该使用VARCHAR2有(或CLOB,如果你漂亮unusual-- LONG,例如,已经被废弃了很长一段时间真的需要超过32K,这似乎不太可能给出的名称))。

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;