Using variables in PLSQL SELECT statement

后端 未结 2 663
时光说笑
时光说笑 2020-12-11 20:29

I have a query that queries on ReportStartDate and ReportEndDate so I thought I would use variables in PLSQL. Not sure what I am missing here, but I get an error:

         


        
相关标签:
2条回答
  • 2020-12-11 20:56

    You cannot use SQL statements directly in a PL/SQL block ( unless you use EXECUTE IMMEDIATE). The columns will need to be fetched into variables ( which is what PL/SQL is telling you with PLS-00428: an INTO clause is expected in this SELECT statement error). So you'll have to rewrite your statements as below.

    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 
    

    Be sure to add Exception Handlers, since PL/SQL expects only 1 row to be returned. If the statement returns no rows, you'll hit a NO_DATA_FOUND exception - and if the statement fetches too many rows, you'll hit a TOO_MANY_ROWS exception.

    0 讨论(0)
  • 2020-12-11 21:03

    The question you have to answer is what do you want to do with the data that has been selected?

    Sathya gave you one approach - declare variables in your PL/SQL block and select the columns INTO those variables. Note that this requires that the SELECT statement returns exactly one row - any more or less rows will throw an error. Another way is to declare collection types using the BULK COLLECT option: http://oracletoday.blogspot.com/2005/11/bulk-collect_15.html

    Yet another option is to have the procedure return a cursor. This is useful in the case where the calling code expects to be able to fetch the data that the procedure has selected:

    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;
    
    0 讨论(0)
提交回复
热议问题