2016-06-10 2 views
2

Einfügen Ich habe den folgenden SQL-Skript eine ‚Billings‘ Tabelle mit Zufallsdaten mit PL/SQL zu füllen:Fehler „PL/SQL: ORA-00984 Spalt hier nicht erlaubt“, wenn Sie ein Datum aus Funktion

DECLARE 
    dgStartDate  DATE; 
    dgEndDate  DATE; 
    dgRandomDate DATE; 

FUNCTION getRandomDate(pStartDate IN DATE, pEndDate IN DATE) RETURN DATE 
    IS 
     dRandomDate  DATE; 
     piStartNumber PLS_INTEGER; 
     piEndNumber  PLS_INTEGER; 
    BEGIN 
     piStartNumber := TO_NUMBER(TO_CHAR(pStartDate, 'J')); 
     piEndNumber := TO_NUMBER(TO_CHAR(pEndDate, 'J')); 

     dRandomDate := TO_DATE(TRUNC(DBMS_RANDOM.VALUE(piStartNumber, piEndNumber)), 'J'); 

     RETURN dRandomDate; 
    END; 

BEGIN 
    dgStartDate := TO_DATE('01/01/2012', 'DD/MM/YYYY'); 
    dgEndDate := TO_DATE('31/12/2015', 'DD/MM/YYYY'); 

    dgRandomDate := getRandomDate(dgStartDate, dgEndDate); 
FOR loop_counter IN 1..28 LOOP 
INSERT INTO billings(id_billing, id_account, total_billing, due_billing) 
VALUES (loop_counter, '123456', round(DBMS_RANDOM.VALUE(0,2000),2), TO_CHAR(dRandomDate, 'DD/MM/YYYY')); 
END LOOP; 
COMMIT; 
END; 

ich erhalte die folgende Fehlermeldung:

ORA-06550: line 45, column 76: 
PL/SQL: ORA-00984: column not allowed here 
ORA-06550: line 44, column 1: 
PL/SQL: SQL Statement ignored 

der Fehler in dem Datumsteil in der INSERT-Anweisung ist, aber die Datumsfunktion des richtigen Wert zurückkehrt. Ich weiß nicht, wie ich es zum Laufen bringen soll.

Vielen Dank im Voraus

+0

Sieht aus wie haben wir verschiedene Zeilennummern, welche Zeile ist 44? –

Antwort

1

Ich glaube, Ihr Fehler wird durch versehentlich mit dem falschen Variablennamen in Ihrer INSERT Anweisung verursacht werden: Wenn Sie genau hinsehen, werden Sie feststellen, dass Sie eine Variable dgRandomDate genannt erklärt:

dgRandomDate := getRandomDate(dgStartDate, dgEndDate); 

Allerdings ist hier, was Sie in Ihrer INSERT Anweisung übergeben:

TO_CHAR(dRandomDate, 'DD/MM/YYYY') 

Sie haben wahrscheinlich gedacht, dies zu tun:

TO_CHAR(dgRandomDate, 'DD/MM/YYYY') 

Update:

Ich sehe nichts falsch mit Ihrer benutzerdefinierten Funktion aus dem Innern der INSERT Anweisung aufrufen, so versuchen, dies zu tun:

BEGIN 

FOR loop_counter IN 1..28 LOOP 
INSERT INTO billings(id_billing, id_account, total_billing, due_billing) 
VALUES (loop_counter, '123456', round(DBMS_RANDOM.VALUE(0,2000),2), 
     TO_CHAR(getRandomDate(TO_DATE('01/01/2012', 'DD/MM/YYYY'), 
           TO_DATE('31/12/2015', 'DD/MM/YYYY')), 'DD/MM/YYYY')); 
END LOOP; 
COMMIT; 
END; 
+0

Wenn ich das tue, würde die zufällige Datumsfunktion in der Schleife nicht funktionieren. Es fügt das gleiche Datum in alle 28 Zeilen ein. Versucht, es innerhalb der Schleife zu bewegen, aber ich habe: ORA-01843: kein gültiger Monat –

+0

@DavidAdders Ich verstehe, was Sie jetzt tun wollen; Sie möchten ein neues zufälliges Datum für jede Iteration der Schleife. Warum versuchen Sie nicht einfach, Ihre benutzerdefinierte Funktion direkt von der INSERT-Anweisung aufzurufen? –

+0

Danke für das Update, habe gerade versucht, aber habe folgendes: PLS-00231: Funktion 'GETRANDOMDATE' darf nicht in SQL verwendet werden; PL/SQL: ORA-00904:: Ungültiger Bezeichner. Weird –

Verwandte Themen