2010-11-29 4 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; 
/

오류 :이 두꺼비뿐만 아니라 SQL Developer에서 발생

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: 

합니다.

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 문이 정확히 하나의 행을 반환해야합니다. 더 많거나 적은 행은 오류를 발생시킵니다. 또 다른 방법은 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;