【问题标题】:Oracle SQL*Plus Variable DeclarationOracle SQL*Plus 变量声明
【发布时间】:2015-04-16 23:24:25
【问题描述】:

我终其一生都无法找到我想要的行为:

旧:插入 build_pc 值 (&&buildA, 35,40,32,29,26,22,22,null,13,11,7,1,999) 新:插入 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。

Google 说使用 set,但会抛出这个:

SQLPLUS 命令跳过:set buildA = build_id_seq.nextval

【问题讨论】:

    标签: sql oracle variables sqlplus


    【解决方案1】:

    据我了解,您想在 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);
    

    希望这会有所帮助!

    【讨论】:

    • 我不知道我们使用的是什么,但它似乎是 12c:Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production。您的解决方案正是我正在寻找的,但我得到了一些奇怪的行为。当我以相同的方式创建第二个变量 buildB 时,它会抛出未声明,但经过几次尝试后开始正常工作。我不知道发生了什么变化。
    • 嗨。我很高兴它有所帮助。如果它仍然以这种奇怪的方式工作,也许您可​​以使用 buildB 发布您的代码,所以我可以看看这种行为的原因。
    • 在与我的讲师(CS 本科生)进一步讨论后,我的方法很遥远。我误解了交易,因此它不会对代码失败或行为异常感到惊讶。不过,对于我问的问题,您的回答很棒。将标记回答。再次感谢。
    【解决方案2】:

    你应该使用define而不是set作为替代变量:

    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 使用与子记录中的外键相同的值。

    【讨论】:

      猜你喜欢
      • 2012-07-29
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多