【问题标题】:PL/SQL Block Finding number of suppliers for each nationPL/SQL 块查找每个国家的供应商数量
【发布时间】:2021-12-22 04:46:50
【问题描述】:

我还是 PLSQL 的新手,目前正在使用 TPCH Dataset 进行练习。我已经尝试了一段时间了,但我似乎无法理解它并且可以使用一些建议。数据集的粗略概述 here.

这是我目前的代码

DECLARE
countNationkey number (5);

BEGIN
    FOR QRow IN (   SELECT r_name, n_name, s_nationkey, r_regionkey, count(s_nationkey) INTO countNationkey
            FROM region, nation, supplier
            WHERE r_regionkey = n_regionkey
            AND n_nationkey = s_nationkey
            GROUP BY r_name, n_name, s_nationkey, r_regionkey
            HAVING count(s_nationkey) > 130 
            ORDER BY r_name )

    LOOP
            dbms_output.put_line( rpad('R_NAME', 15) || rpad('N_NAME', 15) || 
                            rpad('COUNT(S_NATIONKEY)', 20) || chr(10) );
            dbms_output.put_line('----------------------------------------------------------'); 
        dbms_output.put_line( rpad(QRow.r_name, 15) || rpad(QRow.n_name, 15) || rpad(countNationkey, 15) );
    END LOOP;
END;

但是,当我只尝试选择查询时,我得到了一个错误

    SELECT r_name, n_name, s_nationkey, r_regionkey, count(s_nationkey) INTO countNationkey
                                                                         *
ERROR at line 1:
ORA-00905: missing keyword

如果我删除INTO countNationkey,我知道countNationkey 没有任何价值,因此我将得到如下所示的输出。

R_NAME         N_NAME         COUNT(S_NATIONKEY)  

----------------------------------------------------------
ASIA           CHINA
R_NAME         N_NAME         COUNT(S_NATIONKEY)  

----------------------------------------------------------
ASIA           INDONESIA
R_NAME         N_NAME         COUNT(S_NATIONKEY)  

----------------------------------------------------------
EUROPE         GERMANY
R_NAME         N_NAME         COUNT(S_NATIONKEY)  

----------------------------------------------------------
MIDDLE EAST    SAUDI ARABIA

这是我想要的预期结果

R_NAME                     N_NAME                    COUNT(S_NATIONKEY)
------------------------- ------------------------- ------------------
ASIA                       INDONESIA                  131
ASIA                       CHINA                      145
MIDDLE                     EAST SAUDI ARABIA          132
EUROPE                     GERMANY                    132

真的需要一些帮助!提前致谢!

【问题讨论】:

    标签: sql oracle stored-procedures plsql procedure


    【解决方案1】:

    只需删除INTO 在 PL/SQL 中是必需的,但在 select 是游标的一部分时不需要(在您的情况下,这是一个游标 FOR 循环)。

    此外,您可以使用游标变量的名称 (QROW.countNationkey) 引用 countNationkey,这也意味着您不需要局部变量。

    所以:

    BEGIN
       FOR QRow IN (  SELECT r_name,
                             n_name,
                             s_nationkey,
                             r_regionkey,
                             COUNT (s_nationkey) countNationkey
                        FROM region, nation, supplier
                       WHERE     r_regionkey = n_regionkey
                             AND n_nationkey = s_nationkey
                    GROUP BY r_name,
                             n_name,
                             s_nationkey,
                             r_regionkey
                      HAVING COUNT (s_nationkey) > 130
                    ORDER BY r_name)
       LOOP
          DBMS_OUTPUT.put_line (
                RPAD ('R_NAME', 15)
             || RPAD ('N_NAME', 15)
             || RPAD ('COUNT(S_NATIONKEY)', 20)
             || CHR (10));
          DBMS_OUTPUT.put_line (
             '----------------------------------------------------------');
          DBMS_OUTPUT.put_line (
                RPAD (QRow.r_name, 15)
             || RPAD (QRow.n_name, 15)
             || RPAD (QROW.countNationkey, 15));
       END LOOP;
    END;
    

    【讨论】:

    • 非常感谢!不知道还能这么用QROW.countNationkey
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2019-06-24
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多