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」と書くと、適切な結果が得られますが、変数に値を渡すことは役に立ちません。

何が間違っている可能性がありますか?..私はキャスティングまたは何か他のものを逃していますか?

4

2 に答える 2

8

名前の衝突があります。変数の名前はcolumnと同じです。変数(パラメータ)を変更する

TypeId INT,

の中へ

p_TypeId INT,
于 2012-07-24T05:40:54.180 に答える
4

ストアド プロシージャを記述するときは、ローカル変数、プロシージャ パラメーター、およびデータベース列を区別するために、何らかの命名規則が必要です。WHERE識別子は、最初にテーブル内の列の名前を使用して解決され、次にローカル変数またはパラメーターの名前を使用して解決されるため、句の両側

WHERE cd.TYPEID=TypeId;   

TypeIDテーブルの列に解決されDetailsます。このクエリは、 parameter の値を調べませんTypeID

p_標準の命名規則 (つまり、パラメーターの前に を付け、ローカル変数に を付けるl_) を採用すれば、スコープ解決のバグの発生を心配する必要はありません。

このようなものは機能するはずです(ただし、使用しているデータ型はかなり珍しいですLONG-たとえば、 は長い間非推奨になっているため、実際にはVARCHAR2そこを使用する必要があります(または、CLOB本当に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;
于 2012-07-24T05:48:18.210 に答える