Oracle SQL * Plus变量声明

时间:2015-04-16 15:05:31

标签: sql oracle variables sqlplus

我不能为我的生活找到我想要的行为:

  

old:插入build_pc   值(&& buildA,35,40,32,29,26,22,22,null,13,11,7,1,999)   new:插入build_pc   值(build_id_seq.nextval,35,40,32,29,26,22,22,null,13,11,7,1,999)   已插入1行。

作为SQL事务的一部分,我尝试保存变量,还有整数ID号,以便可以在整个事务中的几个位置输入。问题是SQLDev太聪明了,每次都转换回nextval函数而不是只存储一个int。

谷歌说使用套装,但这引发了这个:

  

SQLPLUS命令跳过:设置buildA = build_id_seq.nextval

2 个答案:

答案 0 :(得分:3)

据我了解,您希望在SQL Plus中使用绑定变量。请试试这个:

variable buildA NUMBER;
exec select build_id_seq.nextval into :buildA from dual;
insert into build_pc values (:buildA, 35,40,32,29,26,22,22,null,13,11,7,1,999);

如果你使用11g你不需要选择序列的值,你可以使用:

variable buildA NUMBER;
exec :buildA := build_id_seq.nextval;
insert into build_pc values (:buildA, 35,40,32,29,26,22,22,null,13,11,7,1,999);

希望这有帮助!

答案 1 :(得分:1)

您应该使用define而不是设置替换变量:

define buildA = build_id_seq.nextval

...但是,只要您引用&buildA,就会逐字替换,每次都会递增序列。

您可以使用绑定变量或new_value语法,但您可能只想在第一次使用时引用build_id_seq.nextval,并在所有后续引用中引用build_id_seq.currval,而不是试图自己存储它。

作为the documentation says

  
      
  • CURRVAL:返回序列的当前值
  •   
  • NEXTVAL:递增序列并返回下一个值
  •   

因此,当您调用nextval时,序列会递增,并且在同一会话中对currval的后续调用将获得相同的值,而不会再次递增。

这对于创建父/子记录很有用,例如,使用nextval创建主键值然后currval使用相同的值作为子记录中的外键。