Oracle 遇到“PLS-00302:必须声明组件‘数量’”,尽管表中声明了‘数量’列

Oracle 遇到“PLS-00302:必须声明组件‘数量’”,尽管表中声明了‘数量’列,oracle,stored-procedures,plsql,sum,oracle10g,Oracle,Stored Procedures,Plsql,Sum,Oracle10g,我试图在光标上迭代以获得一些值,我的方法与。代码如下: SET SERVEROUTPUT ON; DECLARE sold_phone_id Sale.phone_id%TYPE; sold_count number; BEGIN FOR row IN ( SELECT Sale.phone_id, SUM(Sale.quantity) FROM Sale GROUP BY

我试图在光标上迭代以获得一些值,我的方法与。代码如下:

SET SERVEROUTPUT ON;

DECLARE
    sold_phone_id Sale.phone_id%TYPE;
    sold_count number;

BEGIN
    FOR row IN (
                SELECT Sale.phone_id, SUM(Sale.quantity)
                FROM Sale
                GROUP BY Sale.phone_id
            )
    LOOP
        sold_phone_id := row.phone_id;
        sold_count := row.quantity;
        DBMS_OUTPUT.PUT_LINE(sold_phone_id || ' ' || sold_count);
    END LOOP;


END;
/ 
但是,我遇到了以下错误:

 sold_count := row.quantity;
                                  *
ERROR at line 13:
ORA-06550: line 13, column 21:
PLS-00302: component 'QUANTITY' must be declared
ORA-06550: line 13, column 3:
PL/SQL: Statement ignored
我已按以下方式申报了我的销售表:

CREATE TABLE Sale(
    id number,
    phone_id number,
    quantity number,
    sale_date date,
    seller_id number,
    PRIMARY KEY(id),
    FOREIGN KEY(seller_id) REFERENCES Seller(id)
);

子查询不返回此列。对总和使用别名:


子查询不返回此列。对总和使用别名:


在for循环查询中使用以下代码部分: SUMSale.quantity作为临时变量


然后在第15行使用row.TEMPVARIABLE而不是row.quantity。

在for循环查询中使用以下代码部分: SUMSale.quantity作为临时变量

然后在第15行使用row.TEMPVARIABLE,而不是row.quantity。

需要注意一点。行实际上是按ANSI SQL标准SQL:11和SQL:16列出的。虽然现在Oracle可以决定以一种非常具体的方式使用它,特别是如果SQL标准这样做,这将使您的使用无效。这可能会产生一个非常令人困惑的错误。简言之,最好避免列出任何单词。Try:从v$reserved_单词中选择*;只是要小心一点。行实际上是按ANSI SQL标准SQL:11和SQL:16列出的。虽然现在Oracle可以决定以一种非常具体的方式使用它,特别是如果SQL标准这样做,这将使您的使用无效。这可能会产生一个非常令人困惑的错误。简言之,最好避免列出任何单词。Try:从v$reserved_单词中选择*;
BEGIN
    FOR row IN (
                SELECT phone_id, SUM(quantity) as quantity   --> here
                FROM Sale
                GROUP BY Sale.phone_id
            )
    LOOP
        sold_phone_id := row.phone_id;
        sold_count := row.quantity;
        DBMS_OUTPUT.PUT_LINE(sold_phone_id || ' ' || sold_count);
    END LOOP;
END;
/