如何仅使用 2 个光标从 2 个表格中获取水果总数及其相应的颜色 + 卡路里? PL/SQL

How can I get the total of Fruits and their corresponding color + calories from 2 tables using only 2 cursors? PL/SQL

我有 2 个 table:

FruitColor (Fruit Color)
  Yellow
  Orange
  Red
  Green  

-

Fruit (Fruit, Calories, Fruit Color)
Apple  100    red
Banana 150    yellow
Orange 125    orange
Mango  200    orange
Pineapple 250 yellow
Grapefruit 90 orange
Durian 300    green

我需要能够匹配颜色并添加该颜色类别中的水果数量,以及卡路里总数...所以输出应该类似于...

The Total Number of Fruits that are orange is 3, with 415 calories. 

这必须在 2 个游标中完成。我似乎无法弄清楚如何抓取一行,将其添加到一个变量,然后继续遍历 table 直到它找到另一行相同颜色,将它添加到同一个变量直到它找不到另一种相同类型的水果,然后重新开始并寻找添加另一种水果及其卡路里的总和。

非常感谢您的帮助。 我当前的 PL/SQL 代码基本上毫无价值,因为我已经 2 天没有得到任何地方......

这里有几个示例可能符合您的任务目标,具体取决于那里允许的内容。两者将使用相同的数据,因此将首先设置:

创建表并添加数据:

CREATE TABLE FRUIT_COLOR(
  COLOR_NAME VARCHAR2(32) NOT NULL PRIMARY KEY
);

INSERT INTO FRUIT_COLOR VALUES ('Yellow');
INSERT INTO FRUIT_COLOR VALUES ('Orange');
INSERT INTO FRUIT_COLOR VALUES ('Red');
INSERT INTO FRUIT_COLOR VALUES ('Green');

CREATE TABLE FRUIT(
  FRUIT_NAME VARCHAR2(64) NOT NULL PRIMARY KEY,
  CALORIES NUMBER,
  COLOR_NAME VARCHAR2(32) NOT NULL REFERENCES FRUIT_COLOR(COLOR_NAME)
);

INSERT INTO FRUIT VALUES ('Apple',100,'Red');
INSERT INTO FRUIT VALUES ('Banana',150,'Yellow');
INSERT INTO FRUIT VALUES ('Orange',125,'Orange');
INSERT INTO FRUIT VALUES ('Mango',200,'Orange');

INSERT INTO FRUIT VALUES ('Pineapple',200,'Yellow');
INSERT INTO FRUIT VALUES ('Grapefruit',90,'Orange');
INSERT INTO FRUIT VALUES ('Durian',300,'Green');

然后创建 pl/sql 块。如果您的任务仅限制您定义 2 个游标(但您可以多次 fetch/process 数据),那么可能只需要嵌套循环。

在第一个示例中,我们将在隐式游标中逐一遍历每种颜色,对于每一种颜色,我们将在另一个隐式游标中逐一遍历每种水果,记录我们走的时候积累了多少水果和卡路里。这效率不高,但很简单。

但这可能违反了 only two cursor 赋值规则,因为内部隐式游标需要多次耗尽。

DECLARE
  V_CALORIES_COUNT NUMBER;
  V_COLOR_COUNT NUMBER;
  BEGIN

  <<COLOR_LOOP>>
  FOR COLOR_POINTER IN (SELECT COLOR_NAME FROM FRUIT_COLOR ORDER BY COLOR_NAME ASC)
    LOOP
  V_CALORIES_COUNT := 0;
    V_COLOR_COUNT := 0;

    <<FRUIT_LOOP>>
    FOR FRUIT_POINTER IN (SELECT CALORIES, COLOR_NAME FROM FRUIT)
      LOOP
      IF FRUIT_POINTER.COLOR_NAME = COLOR_POINTER.COLOR_NAME
        THEN
        V_CALORIES_COUNT := V_CALORIES_COUNT + FRUIT_POINTER.CALORIES;
        V_COLOR_COUNT := V_COLOR_COUNT + 1;
      END IF;
    END LOOP FRUIT_LOOP;
    DBMS_OUTPUT.PUT_LINE(UTL_LMS.FORMAT_MESSAGE('The Total Number of Fruits that are %s is %s, with %s calories. ',COLOR_POINTER.COLOR_NAME,TO_CHAR(V_COLOR_COUNT),TO_CHAR(V_CALORIES_COUNT)));
  END LOOP COLOR_LOOP;

END;
/

然后运行它:

The Total Number of Fruits that are Green is 1, with 300 calories.
The Total Number of Fruits that are Orange is 3, with 415 calories.
The Total Number of Fruits that are Red is 1, with 100 calories.
The Total Number of Fruits that are Yellow is 2, with 350 calories.

PL/SQL procedure successfully completed.

如果您真的只想遍历每个游标一次,一种方法是在进行时将计数累积到键控数据结构中。在此示例中,我将使用(两个)地图,其中颜色作为键,数字作为值,随着光标迭代而累积。

然后最后打印出地图的内容。 (也许这也是作弊,因为它创建了额外的数据结构)

DECLARE
  TYPE COLOR_NAME_COUNT IS TABLE OF NUMBER INDEX BY VARCHAR2(64);
  V_FRUIT_COUNT COLOR_NAME_COUNT;
  V_CALORIE_COUNT COLOR_NAME_COUNT;
  V_COLOR_KEY VARCHAR2(64);
BEGIN
  FOR COLOR_POINTER IN (SELECT COLOR_NAME FROM FRUIT_COLOR ORDER BY COLOR_NAME ASC)
  LOOP
    V_FRUIT_COUNT(COLOR_POINTER.COLOR_NAME) := 0;
    V_CALORIE_COUNT(COLOR_POINTER.COLOR_NAME) := 0;
  END LOOP;

  FOR FRUIT_POINTER IN (SELECT CALORIES, COLOR_NAME FROM FRUIT ORDER BY COLOR_NAME ASC)
  LOOP
    V_FRUIT_COUNT(FRUIT_POINTER.COLOR_NAME) := V_FRUIT_COUNT(FRUIT_POINTER.COLOR_NAME) + 1;
    V_CALORIE_COUNT(FRUIT_POINTER.COLOR_NAME) := V_CALORIE_COUNT(FRUIT_POINTER.COLOR_NAME) + FRUIT_POINTER.CALORIES;
  END LOOP;

  V_COLOR_KEY := V_FRUIT_COUNT.FIRST;
  LOOP
    EXIT WHEN V_COLOR_KEY IS NULL;
    DBMS_OUTPUT.PUT_LINE(UTL_LMS.FORMAT_MESSAGE('The Total Number of Fruits that are %s is %s, with %s calories. ',V_COLOR_KEY,TO_CHAR(V_FRUIT_COUNT(V_COLOR_KEY)),TO_CHAR(V_CALORIE_COUNT(V_COLOR_KEY))));
    V_COLOR_KEY := V_FRUIT_COUNT.NEXT(V_COLOR_KEY);
  END LOOP;

END;
/

和运行它:

The Total Number of Fruits that are Green is 1, with 300 calories.
The Total Number of Fruits that are Orange is 3, with 415 calories.
The Total Number of Fruits that are Red is 1, with 100 calories.
The Total Number of Fruits that are Yellow is 2, with 350 calories.

PL/SQL procedure successfully completed.