首先我在perl脚本的oracle中创建了一个序列。我得到一个错误的statiing序列已经创建错误。有没有办法重置序列(创建或替换不工作)
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.
请告诉我有什么问题?谢谢。
答案 0 :(得分:3)
对于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()
,但不知道这是否真的使任何差异。
答案 1 :(得分:2)
有关序列重置的信息,请参阅How do I reset a sequence in Oracle?