【问题标题】:Problem with sequence in oracleoracle中的序列问题
【发布时间】:2011-07-31 10:28:33
【问题描述】:

首先,我在 perl 脚本中的 oracle 中创建了一个序列。我收到一个错误,指出序列已创建错误。有没有办法重置序列(创建或替换不起作用)

create or replace sequence test_seq start with 1900 increment by 1 nomaxvalue

sprintf("INSERT INTO Custodian_New (Loginid,Type, Id, User, TimeCreated, RcNumber) values ('%s',1, %d, '%s', %d, '%s')", seq_name.nextVal,$dd, $Name, time(), $rc_num); 

perl 脚本中的上述语句为序列打印:'test_seqnextVal'。 所以报错

DBD::Oracle::db do failed: ORA-01722: invalid number (DBD ERROR: error possibly near <*>seq_name )occurs.

请就问题所在提出建议?谢谢。

【问题讨论】:

  • 我认为您将不得不删除并再次创建序列,替换将不起作用
  • 为什么要重置序列?
  • seq_name.nextval 也应该用双引号吗?您不希望在 %s 周围加上单引号,它会尝试插入字符串“seq_name.nextVal”而不是会生成的数字。

标签: perl oracle programming-languages ora-01722


【解决方案1】:

对于 ORA-01722,您的 sprintf%s 周围有单引号,因此它会尝试将字符串 "seq_name.nextVal" 插入数字字段而不是序列中的值;该字符串无法转换为数字,因此出现错误。您可以删除单引号:

sprintf("INSERT INTO Custodian_New (Loginid, Type, Id, User, TimeCreated, RcNumber) values (%s, 1, %d, '%s', %d, '%s')", "seq_name.nextVal", $dd, $Name, time(), $rc_num);

或者直接嵌入序列,因为动态构建它似乎没有任何意义:

sprintf("INSERT INTO Custodian_New (Loginid, Type, Id, User, TimeCreated, RcNumber) values (seq_name.nextVal, 1, %d, '%s', %d, '%s')", $dd, $Name, time(), $rc_num);

或者更好的是,使用绑定变量并将其设置为$dd 等。我也会使用sysdate 而不是传入time(),但不知道这是否真的有什么不同。

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2011-11-21
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2014-06-30
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      相关资源
      最近更新 更多