这是一种奇怪的情况,但我试图看看是否有一套完整的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在存储中,它将无限循环。
同样对于我所知,我的逻辑可能完全错误,如果你有一个更简单的解决方案请分享。这是在扼杀我的大脑。
答案 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;
我没有广泛测试,因为我没有数据,但它应该工作。希望它可以帮助你。