0

私はテーブルを持っていますPersonにはpersonName、personIdが含まれ、プライマリを指定せずにテーブルにいくつかの値を追加しました。テーブルPersonの値は次のとおりです。

 ('muni',1)   
 ('Ganesh',1) 

主キーをpersonIdとして追加し、列を自動生成として変更する必要があります。そこで、トリガーを生成するための次のクエリによってシーケンスを生成しようとしました。

declare           
id  number;     
begin  
select max(rownum)+1 into id from Person;  
execute immediate 'create sequence personseq start with '||to_char(id);  
end;

値がテーブルにあるときに上記のクエリを実行すると、正しく実行されますが、テーブルにエントリがないことを意味する空のテーブルがある場合、上記のクエリはシーケンスを生成していません。

ifステートメントでも試してみました。

declare  
id  number;  
begin  
select max(rownum)+1 into id from Person;  
if (id=null) then  
execute immediate 'create sequence personseq start with '||to_char(1);  
else  
execute immediate 'create sequence personseq start with '||to_char(id);  
end if;  
end;

システムはエラー番号がORA01722であると言います。これは私が無効な番号を付けた番号を示します。しかし、どこに間違いがあるのか​​わかりませんか?
どんな助けでも大歓迎です。

4

3 に答える 3

1

これを試して

select nvl(max(rownum),0)+1 into id from Person; 

テーブルが空の場合、max(rownum)はnullを返し、nullを値に追加すると、常にnullが返されるため、0 + 1がnullではなく1を返すように、nullを0に変換する必要があります。

于 2013-03-19T04:07:19.420 に答える
1

upd:count/rownumよりも重要な欠陥に気づきました。

id=null。絶対にしないでください、これは機能しません。

次の方法で、値がnullかどうかを確認しますid is null

NULLS

を使用しcount(*)ます。

12:03:55 SYSTEM@saz-dev> create table person as
12:04:05   2  select 'muni' name, 1 attribute from dual union all
12:04:32   3  select 'ganesh' name, 1 attribute from dual;

Table created.

Elapsed: 00:00:00.07
12:04:47 SYSTEM@saz-dev> ed
Wrote file S:\tools\buffer.sql

  1  declare
  2  id  number;
  3  begin
  4  select count(*)+1 into id from person;
  5  execute immediate 'create sequence personseq start with '||to_char(id)||' increment by 1';
  6* end;
12:05:52   7  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.06
12:05:53 SYSTEM@saz-dev> select object_name from user_objects where object_name = 'PERSONSEQ';

OBJECT_NAME
---------------------------------------
PERSONSEQ

Elapsed: 00:00:00.08
12:06:16 SYSTEM@saz-dev> truncate table person;

Table truncated.

Elapsed: 00:00:00.32
12:06:27 SYSTEM@saz-dev> drop sequence personseq;

Sequence dropped.

Elapsed: 00:00:00.20
12:06:33 SYSTEM@saz-dev>  declare
12:06:38   2   id  number;
12:06:38   3   begin
12:06:38   4   select count(*)+1 into id from person;
12:06:38   5   execute immediate 'create sequence personseq start with '||to_char(id)||' increment by 1';
12:06:38   6   end;
12:06:39   7  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.03
12:06:40 SYSTEM@saz-dev> select personseq.nextval from dual;

   NEXTVAL
----------
         1

Elapsed: 00:00:00.04
于 2013-03-19T04:07:39.547 に答える
0

このように一度シーケンスを作成します

CREATE SEQUENCE person_seq
 START WITH     1000
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;


新しいレコードを挿入するたびに-'person_seq.nextval 'を使用するよりも

人に挿入(name、id)values('abc'、person_seq.nextval)

于 2013-03-19T04:07:08.220 に答える