0

我正在制作一个包含每个月收入的表格。
为此,我使用了一个内部带有插入语句的 for 循环。
我遇到的麻烦是将数字转换为一个月,然后转换为字符。

这就是我的代码的样子:

BEGIN  
FOR i IN 1..12   
LOOP  
    INSERT INTO REVENUE ( TO_CHAR(TO_DATE(i, 'MM'), 'MON') || '2009'  
    , select sum(transaction_amount)  

但是当我运行它时,我收到一条错误消息:

      INSERT INTO REVENUE ( TO_CHAR(TO_DATE(i, 'MM'), 'MON') || '2009'  
                                     *  
ERROR at line 4:
ORA-06550: line 4, column 31:
PL/SQL: ORA-00917: missing comma

我在这里做错了什么?

4

1 回答 1

1

go-oleg 是对的,问题不是串联,而是你syntax for the insert statement的错误。您缺少valuesvalues 子句中的关键字:

BEGIN  
FOR i IN 1..12   
LOOP  
    INSERT INTO REVENUE VALUES ( TO_CHAR(TO_DATE(i, 'MM'), 'MON') || '2009'  
    , select sum(transaction_amount)
...  

或者理想情况下指定要插入的列名:

BEGIN  
FOR i IN 1..12   
LOOP  
    INSERT INTO REVENUE ( <column1>, <column2> )
    VALUES ( TO_CHAR(TO_DATE(i, 'MM'), 'MON') || '2009'  
    , select sum(transaction_amount)  
    ...

因为您没有values关键字,所以解析器认为括号包含一个列列表,因此当它从 - 看到下一个左括号时会感到困惑to_char- 错误针对括号,如果它以 ma 开头,则为 char 31选项卡,这也可以解释为什么标记错误位置的星号出现在稍微错误的位置。它期望有一个逗号作为列列表中的分隔符。它显然还没有达到评估 ' to_char' 是否是有效的列名。

实际上,您用于第二个值的选择表明您可能正在尝试使用子查询版本;根据您在该声明的其余部分中所做的其他事情,您可能想要:

BEGIN  
FOR i IN 1..12   
LOOP  
    INSERT INTO REVENUE ( <column1>, <column2> )
    SELECT TO_CHAR(TO_DATE(i, 'MM'), 'MON') || '2009'  
    , sum(transaction_amount)
    FROM <some other table>
    ...

我怀疑你可以用一个插入而不是循环来做到这一点,但如果没有看到整个事情就很难确定。

于 2013-07-05T23:49:18.020 回答