4 Stimmen

Verwendung von Variablen in PLSQL SELECT-Anweisung

Ich habe eine Abfrage, die auf ReportStartDate und ReportEndDate abfragt, so dass ich dachte, ich würde Variablen in PLSQL verwenden. Ich bin mir nicht sicher, was ich hier übersehe, aber ich erhalte einen Fehler:

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;
/

Der Fehler ist:

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:

Dies geschieht sowohl in Toad als auch in SQL Developer.

Wie werden die Variablen in meiner WHERE-Klausel richtig verwendet?

7voto

Sathyajith Bhat Punkte 20487

Sie können SQL-Anweisungen nicht direkt in einem PL/SQL-Block verwenden (es sei denn, Sie verwenden EXECUTE IMMEDIATE ). Die Spalten müssen in Variablen geholt werden ( was PL/SQL Ihnen mit PLS-00428: an INTO clause is expected in this SELECT statement Fehler). Sie müssen also Ihre Anweisungen wie folgt umschreiben.

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 

Fügen Sie auf jeden Fall Exception Handlers hinzu, da PL/SQL erwartet, dass nur 1 Zeile zurückgegeben wird. Wenn die Anweisung keine Zeilen zurückgibt, stoßen Sie auf eine NO_DATA_FOUND Ausnahme - und wenn die Anweisung zu viele Zeilen abruft, stoßen Sie auf eine TOO_MANY_ROWS Ausnahme.

4voto

Dan Punkte 10758

Die Frage, die Sie beantworten müssen, lautet: Was wollen Sie tun mit den ausgewählten Daten?

Sathya gab Ihnen einen Ansatz - deklarieren Sie Variablen in Ihrem PL/SQL-Block und wählen Sie die Spalten INTO diese Variablen. Beachten Sie, dass dies voraussetzt, dass die SELECT-Anweisung genau eine Zeile zurückgibt - mehr oder weniger Zeilen führen zu einem Fehler. Eine andere Möglichkeit besteht darin, Auflistungstypen mit der Option BULK COLLECT zu deklarieren: http://oracletoday.blogspot.com/2005/11/bulk-collect_15.html

Eine weitere Möglichkeit ist, dass die Prozedur einen Cursor zurückgibt. Dies ist dann sinnvoll, wenn der aufrufende Code erwartet, dass er die von der Prozedur ausgewählten Daten abrufen kann:

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;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X