2

私はこのようなOracleテーブルを持っています:

create table tms_transaction_tbl
(
trans_id number primary key,
location_id number,
trans_date date,
resource_id number,
ts_id number,
max_value number,
booked_units number default 0,
remaining number default (select max_value-booked_units),
booked number not null ,
user_id number,
trans_time timestamp
);

ご覧のとおり、残りのデフォルト値を(max_value-booked_units)に設定しようとしました

remainging number default (select max_value-booked_units),

しかし、それは私にこのエラーを与えますこのエラー

ora-22818:subquery expression not allowed here
4

2 に答える 2

3

DEFAULT 式で他の列を参照することはできません

これはOracleドキュメントのスニペットです

デフォルト列値の制限事項 DEFAULT 式には、PL/SQL 関数や他の列、疑似列 CURRVAL、NEXTVAL、LEVEL、PRIOR、ROWNUM、または完全に指定されていない日付定数への参照を含めることはできません。

于 2013-02-19T12:56:14.197 に答える
2

SELECTをデフォルト値として使用することはできません。定数である必要があります。

Oracle 11gを使用している場合、これが仮想列の目的です。それらを挿入したり更新したりすることはできませんが、データベースに事前に計算された列を提供してください。

create table tms_transaction_tbl
 ( trans_id number primary key,
   location_id number,
   trans_date date,
   resource_id number,
   ts_id number,
   max_value number,
   booked_units number default 0,
   remaining number generated always as ( max_value - booked_units ) virtual,
   booked number not null ,
   user_id number,
   trans_time timestamp
   );

構文については、 CREATETABLEステートメントのドキュメントで詳しく説明されています。11gを使用していない場合は、テーブルの上部を表示して同じロジックを実現できます。

ビューまたは仮想列を使用したくない場合は、このデータをまったく保存しないことをお勧めします。

于 2013-02-19T13:14:25.710 に答える