1

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

请建议我有什么问题?谢谢。

4

2 回答 2

3

对于 ORA-01722,您的sprintfis 在 . 周围有单引号%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(),但不知道这是否真的有什么不同。

于 2011-04-07T08:17:10.423 回答
2

对于序列重置,请参阅如何在 Oracle 中重置序列?

于 2011-04-07T08:04:59.077 回答