0

オラクル シーケンスは、自動増加する数値を返すように設計されています。入れた値プールから返されるカスタマイズされたシーケンスを実装できるのではないかと思っているので、何を返すことが期待されるかをシーケンスに伝えることができます。

とにかくこれを実装するには?または、トリガー、オラクル関数などを追加するなどの代替手段はありますか?

または、値を保存するテーブルを使用することもできますが、orrace シーケンスのように最適なパフォーマンスを実現する方法は次のとおりです。

I have this, but not sure is it the best one.
create table your_table(
   gap_from int,
   gap_to int
);

insert into your_table values(99999, 9998888);
insert into your_table values(2, 7);
insert into your_table values(200, 10000);
insert into your_table values(10001, 300000);

create table2 as  select
          gap_from,
          1 + nvl(sum(gap_to - gap_from + 1) over (order by gap_from rows between unbounded preceding and 1 preceding), 0) as seq_from,
          sum(gap_to - gap_from + 1) over (order by gap_from) as seq_to
        from your_table;

create sequence your_new_seq;


create or replace function get_PK_inside_gap return number as
  new_seq_val number;
  PK_inside_gap number;
begin
  select your_new_seq.nextval into new_seq_val from dual;
  execute immediate '
    select
      new_seq_val + gap_from - seq_from
    from
      (select :1 as new_seq_val from dual)
      join (
       table2 
      ) on new_seq_val between seq_from and seq_to'
  into PK_inside_gap using new_seq_val;
  return PK_inside_gap;
end;
4

4 に答える 4

1

5 から 10 の範囲の値のみを返すには:

 create sequence seq1 start with 5 maxvalue 10;

100000 から 999990 までの値のみを 10 刻みで返すには:

 create sequence seq2 start with 100000 maxvalue 999990 increment 10;
于 2013-03-10T16:08:09.387 に答える
0

必要なエントリを含むテーブルを作成し、パフォーマンスを向上させるためにテーブルをメモリに固定します。値が「使用済み」になったら、それらを更新してステータス フラグを設定できます。

メモリに固定されたテーブルからのクエリでは、クエリは「使用されていない」最小のエントリを選択できます。または、その柔軟性が必要だと述べたように、クエリを他の基準で選択させることもできます。

于 2013-03-10T16:00:12.697 に答える
0

通常のシーケンスを作成し、ギャップ リストに従ってその結果を変更できます。

create table your_table(
   gap_from int,
   gap_to int
);

insert into your_table values(99999, 9998888);
insert into your_table values(2, 7);
insert into your_table values(200, 10000);
insert into your_table values(10001, 300000);

create sequence your_new_seq;


create or replace function get_PK_inside_gap return number as
  new_seq_val number;
  PK_inside_gap number;
begin
  select your_new_seq.nextval into new_seq_val from dual;
  execute immediate '
    select
      new_seq_val + gap_from - seq_from
    from
      (select :1 as new_seq_val from dual)
      join (
        select
          gap_from,
          1 + nvl(sum(gap_to - gap_from + 1) over (order by gap_from rows between unbounded preceding and 1 preceding), 0) as seq_from,
          sum(gap_to - gap_from + 1) over (order by gap_from) as seq_to
        from your_table
      ) on new_seq_val between seq_from and seq_to'
  into PK_inside_gap using new_seq_val;
  return PK_inside_gap;
end;

ここで、使用されていない PK のシーケンスを取得するために呼び出しget_PK_inside_gapます: 2,3,4,5,6,7,200,201,...

于 2013-03-10T16:09:05.660 に答える
0

おい、これはあなたを助けるかもしれないと思う.通常、シーケンスを作成すると、パラメータで開始を割り当てることができないので、そのシーケンスを削除して再作成することをお勧めします;

create or replace
procedure SEQ_alter(start_with in number,end_with in number,seq_name varchar2)
   as
   sql_qury varchar2(148);
   drop_qury varchar2(148);
   begin
   drop_qury:='drop sequence '||seq_name ;
   execute immediate drop_qury;
   sql_qury:='create sequence '||seq_name|| ' start with '|| to_number(start_with ) ||' maxvalue '|| to_number(end_with);

   execute immediate sql_qury;
   end;
于 2013-03-11T07:39:37.923 に答える