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 の場合、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);

または、さらに良いことに、バインド変数を使用して、それらを$ddetc に設定します。sysdateを渡す代わりに使用することもできますtime()が、それが本当に違いを生むかどうかはわかりません。

于 2011-04-07T08:17:10.423 に答える
2

シーケンスのリセットについては、「 Oracle でシーケンスをリセットするにはどうすればよいですか?」を参照してください。

于 2011-04-07T08:04:59.077 に答える