oracle中的序列问题

时间:2011-04-07 07:02:22

标签: perl oracle programming-languages ora-01722

首先我在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.

请告诉我有什么问题?谢谢。

2 个答案:

答案 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?