检查oracle sql

时间:2015-12-09 19:13:46

标签: sql oracle loops plsql logic

这是一种奇怪的情况,但我试图看看是否有一套完整的8'机器人部件'在一张桌子中,可以容纳所有这些。我应该能够弄清楚语法本身,但逻辑(种类)正在困扰我。

我需要弄清楚如何在oracle sql中完成它。

以下是该方案:

我已经达到了这样的程度:我将拥有3个数据表,一个用于机器人,一个用于存储零件,一个用于机器人零件。

表:

Robots
 RobotID NUMBER PK
 RobotName VARCHAR
 Status VARCHAR (either ready, or needs parts)

Storage
 PartSerial NUMBER PK
 PartType NUMBER (1-8)

Assigned
 RbPartSerial NUMBER PK
 RobotID NUMBER FK
 PartType NUMBER

因此,机器人可以处于就绪状态,这意味着如果您查看已分配的表,您将看到具有该RobotID的8个部分,所有部分都具有唯一的序列号,并且它们将具有部件类型1-8(每个部件中的一个)。 / p>

如果机器人具有需要部件的状态,则在“已分配”表中,您将看到0-7个具有机器人RobotID的部件。

所以我想要完成的是,检查是否有任何机器人需要部件(简单),找出他们需要的部件(中等),然后检查存储器是否有这些部件,从存储器中删除它们,然后移动如果机器人得到了所需的所有部件,我将它们的状态改为准备好(硬)。

到目前为止我所写的内容(只是写下我将如何解释它,希望它有意义):

while (check if max(status) is 'needs parts' (or min, whatever returns needs parts))

  --runs until it finds a part missing
  counter = 1
  while(missing)
    if (parttype = counter && RobotID = current Robot) in Assigned
      counter++
    else
      missing = false

  check if PartType(counter) is in storage

  if it is then 
    delete from Storage, insert into Assigned with RobotID

  --checking to see if it has all parts
  for i 1-8
    check for robotID and i (in Assigned)
    if no
      toggle boolean to false

  --if the boolean is true that means it found all the parts
  if boolean = true
    status = 'ready'

但是现在我怎么才能让它只运行直到它无法移动任何部件,如果存储器为空,我可以让初始while循环也停止,但如果我需要部件类型3,但我有部件类型怎么办? 2在存储中,它将无限循环。

同样对于我所知,我的逻辑可能完全错误,如果你有一个更简单的解决方案请分享。这是在扼杀我的大脑。

1 个答案:

答案 0 :(得分:0)

我的建议是做以下事情:

1)创建一个零件类型表,可以由存储和分配表引用。这样做的好处是,如果机器人突然开始使用9个零件而不是8个零件,您只需要将零件类型添加到表格中。

CREATE TABLE part_types (
  PartType INTEGER NOT NULL,
  Description VARCHAR2(256)
);

2)我认为您希望PL / SQL基本上执行以下操作:

DECLARE
  lPart storage%ROWTYPE;
BEGIN
  --loop through all of the robots in need of parts
  FOR lRobot IN (
    SELECT *
    FROM   robots
    WHERE  status = 'needs parts'
  )
  LOOP
    --loop through the part types still required by the robot
    FOR lPartType IN (
      select *
      FROM   part_types
      WHERE  PartType NOT IN(
        SELECT PartType
        FROM   assigned
        WHERE  robotID = lRobot.id
      )
    )
    LOOP
      BEGIN
        --get the first part in storage for the given part type and store this in the lPart variable
        SELECT PartSerial
        INTO lPart.PartSerial
        FROM (
          SELECT *
          FROM   storage
          WHERE  part_type = lPartType.PartType
        )
        WHERE rownum=1;

        --call your assign procedure which would handle the following things
        --a) assign the part to the robot
        --b) remove the part from storage
        assignPartToRobot(pRobotID => lRobot.id, pPartSerial => lPart.PartSerial);
      EXCEPTION
        WHEN no_data_found THEN
          --this is really bad practice, sorry
          NULL;
      END;
    END LOOP;

    --check if the robot has all of the parts and then move it to the ready status. Replace this with your logic.
    IF robotHasAllParts(pRobotID => lRobotID) THEN
      moveToReadyStatus(pRobotIT => lRobotID);
    END IF;
  END LOOP;
end;

我没有广泛测试,因为我没有数据,但它应该工作。希望它可以帮助你。