2012-07-24 65 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;