2016-06-10 153 views
2

插入日期時,我有以下SQL腳本,以填補使用PL/SQL隨機數據的「佈告」表:「PL/SQL:ORA-00984:列在這裏不允許」錯誤從功能

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; 

我收到以下錯誤:

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 

的錯誤是在INSERT語句中的日期部分,但日期函數返回正確的值。我不知道如何使它工作。

在此先感謝

+0

看起來我們有不同的行號,哪一行是44? –

回答

1

我相信是由你INSERT聲明中意外地使用了錯誤的變量名稱造成的錯誤:如果你仔細觀察,你會發現,你聲明的變量稱爲dgRandomDate

dgRandomDate := getRandomDate(dgStartDate, dgEndDate); 

然而,這裏是你在INSERT聲明通過什麼:

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

你可能打算這樣做:

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

更新:

我看不出什麼毛病從INSERT語句中調用用戶定義的函數,所以嘗試這樣做:

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

如果我這樣做,隨機日期函數將不會在循環中工作。它在每28行中插入相同的日期。試圖把它在循環內移動,但我得到了:ORA-01843:不是有效月份 –

+0

@DavidAdders我明白你現在正在嘗試做什麼;您需要爲循環的每次迭代創建一個新的隨機日期。爲什麼不嘗試直接從'INSERT'語句調用你的自定義函數呢? –

+0

感謝您的更新,只是試過,但得到了以下:PLS-00231:函數'GETRANDOMDATE'可能不會在SQL中使用; PL/SQL:ORA-00904::無效標識符。奇怪的 –

相關問題