2010-11-29 21 views
3

ReportStartDateとReportEndDateでクエリを実行するので、PLSQLで変数を使用すると考えました。わからない私はここで行方不明ですが、私はエラーを取得:PLSQL SELECTステートメントで変数を使用

CLEAR; 
DECLARE 
    varReportStartDate Date := to_date('05/01/2010', 'mm/dd/yyyy'); 
    varReportEndDate Date := to_date('05/31/2010', 'mm/dd/yyyy'); 
BEGIN 

    SELECT 
      'Value TYPE', 
      1 AS CountType1, 
      2 AS CountType2, 
      3 AS CountType3 
    FROM DUAL; 

    SELECT COUNT (*) 
    FROM CDR.MSRS_E_INADVCH 

    WHERE 1=1 
    AND ReportStartDate = varReportStartDate 
    AND ReportEndDate = varReportEndDate 
    ; 
END; 
/

エラーは次のとおりです。

Error starting at line 2 in command: 
Error report: 
ORA-06550: line 6, column 5: 
PLS-00428: an INTO clause is expected in this SELECT statement 
ORA-06550: line 8, column 5: 
PLS-00428: an INTO clause is expected in this SELECT statement 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

これはヒキガエルにだけでなく、SQL Developerで起こります。

WHERE句で変数を使用する適切な方法は何ですか?

答えて

7

EXECUTE IMMEDIATEを使用しない限り)SQL文をPL/SQLブロックで直接使用することはできません。列は変数にフェッチする必要があります(これはPL/SQLがPLS-00428: an INTO clause is expected in this SELECT statementエラーであなたに伝えているものです)。したがって、以下のように文を書き直す必要があります。

SELECT 
     'Value TYPE', 
     1 AS CountType1, 
     2 AS CountType2, 
     3 AS CountType3 
INTO 
    V_VALUE_TYPE, 
    V_CountType1, 
    V_CountType2, 
    V_CountType3 
FROM DUAL; 

SELECT COUNT(*) 
    INTO V_COUNT  
FROM CDR.MSRS_E_INADVCH 
WHERE 1=1 
AND ReportStartDate = varReportStartDate 
AND ReportEndDate = varReportEndDate 

PL/SQLは、1行のみが返されることを期待しているので、例外ハンドラを追加してください。文が行を返さない場合は、NO_DATA_FOUND例外が発生し、文が多すぎる行をフェッチすると、TOO_MANY_ROWS例外が発生します。

4

あなたが答えなければならない質問は何ですか?を選択していますか?

SathyaはあなたのPL/SQLブロック内の変数を宣言し、それらの変数を列INTOを選択するというアプローチを提供しました。これは、SELECT文が正確に1つの行を返す必要があることに注意してください。多かろうとも少ない行がエラーをスローします。別の方法は、BULK COLLECTオプションを使用してコレクション型を宣言することです。http://oracletoday.blogspot.com/2005/11/bulk-collect_15.html

さらに別のオプションは、プロシージャにカーソルを戻すことです。これは、呼び出しコードが、プロシージャが選択したデータをフェッチできると期待している場合に便利です。

PROCEDURE GET_MY_REPORT(varReportStartDate in date, varReportEndDate in date, cur out sys_refcursor) is 
begin 
    OPEN cur FOR SELECT * 
    FROM CDR.MSRS_E_INADVCH 
    WHERE 1=1 
    AND ReportStartDate = varReportStartDate 
    AND ReportEndDate = varReportEndDate; 
END GET_MY_REPORT; 
関連する問題