2015-12-09 51 views
0

我能想到的最好的解释是:我试图给每个机器人一个唯一的ID。然后,当我运行程序时,我只需要给机器人一个名称和ID。状态是为我生成的。以递增值插入

但是,由于找不到正确的方法来做到这一点,我正在达到总阻碍。我已经尝试过对行进行计数并将其放入临时文件中。这是行不通的。每次运行它时都会创建一个新行。所以,我应该总是得到一个新的身份证。但我可能做错了。

我得到这个错误:

Error(23,44): PL/SQL: ORA-00984: column not allowed here

下面是该过程:

CREATE OR replace PROCEDURE Checkbot 
(nameinput IN VARCHAR2) 
IS 
    partfound NUMBER(4); 
    foundall BOOLEAN; 
    tempid NUMBER; 
BEGIN 

--Where I am having issues: 

    SELECT Count(*) 
    INTO tempid 
    FROM robotinventory; 
    INSERT INTO robotinventory VALUES (tempid, nameinput, NULL); 

    foundall := TRUE; 
    FOR i IN 1..8 LOOP 
    partfound := 0; 
    SELECT Max(prtserial) 
    INTO partfound 
    FROM partinventory 
    WHERE parttypeid = i; 

    IF partfound > 0 THEN 
     DELETE FROM partinventory 
     WHERE prtserial = partfound; 
     INSERT INTO robotprt VALUES (tempid, idinput, i); 
    ELSE 
     foundall := FALSE; 
    END IF; 
    END LOOP; 


    IF foundall THEN 
     UPDATE robotinventory 
     SET status = 'ready for assembly' 
     WHERE robotid = tempid; 
    ELSE 
     UPDATE robotinventory 
     SET status = 'waiting on parts' 
     WHERE robotid = tempid; 
    END IF; 

    END;/ 

机器人库存表:

CREATE TABLE RobotInventory 
(RobotID Number(4) PRIMARY KEY, 
RobotName VARCHAR2(24), 
Status VARCHAR2(64)); 

我的代码以前的版本,拿出我做了什么在我的错误,我的目标是用一个自动递增的数字替换idInput:

create or replace procedure checkbot 
(idInput in number, nameInput in varchar2) 
is 
    partFound number(4); 
    foundAll boolean; 
begin 
    insert into robotInventory values (idInput, nameInput, null); 
    foundAll := true; 
    for i in 1..8 loop 
    partFound := 0; 
    select max(prtSerial) 
    into partFound 
    from partInventory 
    where ParttypeID = i; 

    if partFound > 0 then 
     delete from partInventory 
     where prtSerial = partFound; 
     insert into robotPrt values (partFound, idInput, i); 
    else 
     foundAll := false; 
    end if; 
    end loop; 


    if foundAll then 
     update robotInventory 
     set status = 'ready for assembly' 
     where robotID = idInput; 
    else 
     update robotInventory 
     set status = 'waiting on parts' 
     where robotID = idInput; 
    end if; 

    END; 
/
+0

工作的人谁的代码是好奇:http://pastebin.com/L5WBr4Br – Kevin

回答

1

创建一个序列(在下面调用seq)并在INSERT SQL中使用它来填充robot_id。

INSERT INTO robotinventory VALUES (seq.nextval, nameinput, NULL); 

查看Oracle文档,了解如何更详细地创建序列。以下是您可以更改以适应您的需求的示例。

create sequence seq 
start with 1 
increment by 1 
maxvalue 9999; 

HTH

+0

错误说我不能在这里使用一个序列,并指出,有一个外键robotid另一个表 – Kevin

+0

已更新的代码显示实际的工作代码,它在底部,但我仍然需要找出如何增加。 – Kevin