【问题标题】:"PL/SQL: ORA-00984: column not allowed here" error when inserting a date from function从函数插入日期时出现“PL/SQL:ORA-00984:此处不允许列”错误
【发布时间】:2016-10-10 22:59:01
【问题描述】:

我有以下 SQL 脚本来使用 PL/SQL 用随机数据填充“Billings”表:

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 语句中的日期部分,但日期函数返回正确的值。我不知道如何让它工作。

提前致谢

【问题讨论】:

  • 看起来我们有不同的行号,哪一行是44?

标签: sql oracle date plsql insert


【解决方案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;

【讨论】:

  • 如果我这样做,随机日期函数将无法在循环中工作。它在每 28 行中插入相同的日期。试图将其移动到循环中,但我得到:ORA-01843: not a valid month
  • @DavidAdders 我明白你现在想要做什么;您希望循环的每次迭代都有一个新的随机日期。为什么不尝试直接从 INSERT 语句中调用自定义函数?
  • 感谢您的更新,刚刚尝试过,但得到以下信息:PLS-00231:函数 'GETRANDOMDATE' 可能无法在 SQL 中使用; PL/SQL: ORA-00904: : 无效标识符。奇怪
  • 您需要将您的函数getRandomDate() 定义为独立的。请参阅here 了解更多信息。完成此操作后,错误应该会消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多