2010-08-31 33 views
0
VARIABLE StayWorkflow_Id_max number; 

BEGIN 
    SELECT max(StayWorkflow_Id)+1 into :StayWorkflow_Id_max from MVStayWorkflow; 
END; 
/

insert into MVStayWorkflow (StayWorkflow_Id, Stay_Id, Passage_Id, 
      User_Id, RespUnit_Id, Resource_Id, WorkflowAction, CurrentState, 
      PreviousState, WorkflowTime, UserStamp, TimeStamp) 
     values (:StayWorkflow_Id_max, 98485, 129844, 1, '', '', 11, 7, 7, to_char(sysdate, 'YYYYMMDD HH:MI:SS'), 1, to_char(sysdate, 'YYYYMMDD HH:MI:SS')); 

insert into MVStayWorkflow (StayWorkflow_Id, Stay_Id, Passage_Id, 
      User_Id, RespUnit_Id, Resource_Id, WorkflowAction, CurrentState, 
      PreviousState, WorkflowTime, UserStamp, TimeStamp) 
     values (:StayWorkflow_Id_max+1, 66311, 114593, 1, '', '', 11, 7, 7, to_char(sysdate, 'YYYYMMDD HH:MI:SS'), 1, to_char(sysdate, 'YYYYMMDD HH:MI:SS')); 

insert into MVStayWorkflow (StayWorkflow_Id, Stay_Id, Passage_Id, 
      User_Id, RespUnit_Id, Resource_Id, WorkflowAction, CurrentState, 
      PreviousState, WorkflowTime, UserStamp, TimeStamp) 
     values (:StayWorkflow_Id_max+2, 83742, 110157, 1, '', '', 11, 7, 7, to_char(sysdate, 'YYYYMMDD HH:MI:SS'), 1, to_char(sysdate, 'YYYYMMDD HH:MI:SS')); 

insert into MVStayWorkflow (StayWorkflow_Id, Stay_Id, Passage_Id, 
      User_Id, RespUnit_Id, Resource_Id, WorkflowAction, CurrentState, 
      PreviousState, WorkflowTime, UserStamp, TimeStamp) 
     values (:StayWorkflow_Id_max+3, 74421, 98685, 1, '', '', 11, 7, 7, to_char(sysdate, 'YYYYMMDD HH:MI:SS'), 1, to_char(sysdate, 'YYYYMMDD HH:MI:SS')); 

update SYSQLSequence set nextValue = :StayWorkflow_Id_max+4 where name = '_MVStayWorkflow_auto_'; 

commit; 

给了我这个错误:这个PL/SQL脚本有什么问题?

Error report: 
SQL Error: Missing IN or OUT parameter at index:: 1 
+0

哪个Oracle的版本?哪个客户? (Sql Developer?Sql Plus?) – onof 2010-08-31 06:39:45

+0

Oracle 11gR1服务器和客户端.. 我可以从sysqlsequence表中手动检查最新的stay_workflow_id,并且可以在插入脚本中使用该值之后对其进行更新,但这只能通过SQL开发人员。 在这里,我正在尝试通过sqlplus使用... – muddu83 2010-08-31 06:52:08

+0

如果您将其中一个答案标记为已接受,您可以获得信誉分数。 – Codo 2010-09-01 16:15:34

回答

3

你的代码是不是真的PL/SQL,但主要是A的SQL * plus脚本(特别是VARIABLE既不是PL/SQL也不是SQL)。

你为什么不让它纯粹的PL/SQL:

DECLARE 
    StayWorkflow_Id_max number; 

BEGIN 
    SELECT max(StayWorkflow_Id)+1 into StayWorkflow_Id_max from MVStayWorkflow; 

    insert into MVStayWorkflow (StayWorkflow_Id, Stay_Id, Passage_Id, 
      User_Id, RespUnit_Id, Resource_Id, WorkflowAction, CurrentState, 
      PreviousState, WorkflowTime, UserStamp, TimeStamp) 
     values (StayWorkflow_Id_max, 98485, 129844, 1, '', '', 11, 7, 7, to_char(sysdate, 'YYYYMMDD HH:MI:SS'), 1, to_char(sysdate, 'YYYYMMDD HH:MI:SS')); 

    insert into MVStayWorkflow (StayWorkflow_Id, Stay_Id, Passage_Id, 
      User_Id, RespUnit_Id, Resource_Id, WorkflowAction, CurrentState, 
      PreviousState, WorkflowTime, UserStamp, TimeStamp) 
     values (StayWorkflow_Id_max+1, 66311, 114593, 1, '', '', 11, 7, 7, to_char(sysdate, 'YYYYMMDD HH:MI:SS'), 1, to_char(sysdate, 'YYYYMMDD HH:MI:SS')); 

    insert into MVStayWorkflow (StayWorkflow_Id, Stay_Id, Passage_Id, 
      User_Id, RespUnit_Id, Resource_Id, WorkflowAction, CurrentState, 
      PreviousState, WorkflowTime, UserStamp, TimeStamp) 
     values (StayWorkflow_Id_max+2, 83742, 110157, 1, '', '', 11, 7, 7, to_char(sysdate, 'YYYYMMDD HH:MI:SS'), 1, to_char(sysdate, 'YYYYMMDD HH:MI:SS')); 

    insert into MVStayWorkflow (StayWorkflow_Id, Stay_Id, Passage_Id, 
      User_Id, RespUnit_Id, Resource_Id, WorkflowAction, CurrentState, 
      PreviousState, WorkflowTime, UserStamp, TimeStamp) 
     values (StayWorkflow_Id_max+3, 74421, 98685, 1, '', '', 11, 7, 7, to_char(sysdate, 'YYYYMMDD HH:MI:SS'), 1, to_char(sysdate, 'YYYYMMDD HH:MI:SS')); 

    update SYSQLSequence set nextValue = StayWorkflow_Id_max+4 where name = '_MVStayWorkflow_auto_'; 

    commit; 
END; 
/
+0

谢谢你,科多!它工作顺利! :-) – muddu83 2010-09-01 08:04:01

0

我看不出有什么明显的错误,其涉及的错误消息。

但是,如果SYSQLSequence是一个序列,那么直接更新它是不寻常的 - 至少 - 在某些Oracle版本中可能不允许。我认为你必须做这样的事情,而不是:

alter sequence SYSQLSequence 
increment by 4; 

更新:好吧,这是有缺陷太多,所以我已经划出来。

+0

同样,我只是试图一次执行一个脚本,但它也给我一个错误: 错误报告: SQL错误:ORA-00934:此处不允许使用组功能 00934. 00000 - “组功能在这里不允许” INSERT INTO MVStayWorkflow(StayWorkflow_Id,Stay_Id,Passage_Id, USER_ID,RespUnit_Id,RESOURCE_ID,WorkflowAction,CurrentState, PreviousState,WorkflowTime,UserStamp,时间戳) 值(MAX(StayWorkflow_Id)+1,66311 ,114593,1,'','',11,7,7,to_char(sysdate,'YYYYMMDD HH:MI:SS'),1,to_char(sysdate,'YYYYMMDD HH:MI:SS')); – muddu83 2010-08-31 06:53:56

+1

muddu83没有使用序列。尽管如此,我想提一下*改变序列XY增量4 *不会使序列增加4,但会改变所有未来NEXTVAL调用的增量大小。如果您使用大量数字,这可能会严重错误。 – Codo 2010-08-31 07:42:20

1

正如wallyk指出的那样,您生成身份证的方式很腥。通常情况下,它是这样的:

create sequence StayWorkflow_Id nocache; /* you only do that once */ 

insert into MVStayWorkflow (StayWorkflow_Id, Stay_Id, Passage_Id, 
     User_Id, RespUnit_Id, Resource_Id, WorkflowAction, CurrentState, 
     PreviousState, WorkflowTime, UserStamp, TimeStamp) 
    values (StayWorkflow_Id.nextval, 98485, 129844, 1, '', '', 11, 7, 7, 
      to_char(sysdate, 'YYYYMMDD HH:MI:SS'), 1, to_char(sysdate, 'YYYYMMDD HH:MI:SS')); 


insert into MVStayWorkflow (StayWorkflow_Id, Stay_Id, Passage_Id, 
     User_Id, RespUnit_Id, Resource_Id, WorkflowAction, CurrentState, 
     PreviousState, WorkflowTime, UserStamp, TimeStamp) 
    values (StayWorkflow_Id.nextval, 66311, 114593, 1, '', '', 11, 7, 7, 
      to_char(sysdate, 'YYYYMMDD HH:MI:SS'), 1, to_char(sysdate, 'YYYYMMDD HH:MI:SS')); 


... 

只是使用StayWorkflow_Id.nextval每次得到一个新的独特的ID,而不必担心竞争条件

+0

谢谢!我们有一个单独的SYSQLSEQUENCE表,其中包含所有序列名和下一个值列表,我希望stayworkflow_id从那里取下一个值,然后用下一个值更新序列表,然后为下一个插入序列重复该循环... – muddu83 2010-08-31 07:27:36

+0

但是你没有这样做,你正在从现有表格行中选取最高值,而不是从专用表中选取。如果行已被删除,您可能会得到一个比序列表所占的数字更小的数字。您可以通过使用'for update'子句从序列表中选择下一个值来避免竞争条件,但与您的日期一样,存储为字符串会让您的生活变得比需要的更难。 – 2010-08-31 08:19:01

+0

忘记在前面的问题中提到这一点......是不是因为日期格式而不是'HH24'使用'HH'丢失了一些重要信息? – 2010-08-31 08:20:09