Oracle SQL*加上变量声明
Oracle SQL*Plus Variable Declaration
我这辈子都找不到我想要的行为:
old:insert into build_pc
values (&&buildA, 35,40,32,29,26,22,22,null,13,11,7,1,999)
new:insert into build_pc
values (build_id_seq.nextval, 35,40,32,29,26,22,22,null,13,11,7,1,999)
1 rows inserted.
作为 SQL 交易的一部分,我试图保存一个变量,还有一个整数 ID 号,以便它可以在交易中的几个地方输入。问题是 SQLDev 太聪明了,每次都转换回 nextval 函数,而不是只存储一个 int。
Google 说使用 set,但是抛出这个:
SQLPLUS Command Skipped: set buildA = build_id_seq.nextval
据我了解,您想在 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你不需要SELECT序列的值,你可以使用:
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);
希望对您有所帮助!
您应该使用 define 而不是 set 作为替换变量:
define buildA = build_id_seq.nextval
...但无论您在何处引用 &buildA
,它都会被逐字替换,每次递增序列。
您可以使用绑定变量或 new_value 语法,但您可能只想在第一次使用时引用 build_id_seq.nextval
,并在随后的所有操作中引用 build_id_seq.currval
引用,而不是尝试自己存储它。
- CURRVAL: Returns the current value of a sequence
- NEXTVAL: Increments the sequence and returns the next value
因此,当您调用 nextval 时,序列会增加,并且在同一会话中对 currval 的后续调用会获得相同的值,而不会再次增加。
这对于创建 parent/child 记录很有用,例如,您使用 nextval 创建主键值,然后使用 currval 将相同的值用作子记录中的外键。
我这辈子都找不到我想要的行为:
old:insert into build_pc values (&&buildA, 35,40,32,29,26,22,22,null,13,11,7,1,999) new:insert into build_pc values (build_id_seq.nextval, 35,40,32,29,26,22,22,null,13,11,7,1,999) 1 rows inserted.
作为 SQL 交易的一部分,我试图保存一个变量,还有一个整数 ID 号,以便它可以在交易中的几个地方输入。问题是 SQLDev 太聪明了,每次都转换回 nextval 函数,而不是只存储一个 int。
Google 说使用 set,但是抛出这个:
SQLPLUS Command Skipped: set buildA = build_id_seq.nextval
据我了解,您想在 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你不需要SELECT序列的值,你可以使用:
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);
希望对您有所帮助!
您应该使用 define 而不是 set 作为替换变量:
define buildA = build_id_seq.nextval
...但无论您在何处引用 &buildA
,它都会被逐字替换,每次递增序列。
您可以使用绑定变量或 new_value 语法,但您可能只想在第一次使用时引用 build_id_seq.nextval
,并在随后的所有操作中引用 build_id_seq.currval
引用,而不是尝试自己存储它。
- CURRVAL: Returns the current value of a sequence
- NEXTVAL: Increments the sequence and returns the next value
因此,当您调用 nextval 时,序列会增加,并且在同一会话中对 currval 的后续调用会获得相同的值,而不会再次增加。
这对于创建 parent/child 记录很有用,例如,您使用 nextval 创建主键值,然后使用 currval 将相同的值用作子记录中的外键。