【问题标题】:encountering "PLS-00302: component 'QUANTITY' must be declared" although the column 'quantity' is declared in the table遇到“PLS-00302:必须声明组件 'QUANTITY'”尽管在表中声明了列 'quantity'
【发布时间】:2021-01-06 04:13:25
【问题描述】:

我试图遍历光标以获取一些值,我的方法类似于this answer。代码如下:

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

我已通过以下方式声明了我的 Sale 表:

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)
);

【问题讨论】:

    标签: oracle stored-procedures plsql sum oracle10g


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您的子查询不返回此列。为sum() 使用别名:

      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;
      /
      

      【讨论】:

      • 请注意。 ROW 实际上被列为Oracle reserved word 和按ANSI SQL 标准(SQL:11 和SQL:16)。虽然它没有任何危害,但现在 Oracle 可以决定以非常特定的方式使用它,特别是如果 SQL 标准这样做,那将使您的使用无效。这可能会造成非常混乱的错误。简而言之,最好避免列出任何单词。试试:select * from v$reserved_words;
      猜你喜欢
      • 2019-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2015-04-26
      • 2021-08-13
      相关资源
      最近更新 更多