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
   );

CREATE TABLE 语句的文档中进一步描述了语法。如果您不使用 11g,您可以使用表格顶部的视图来实现相同的逻辑。

如果您不想使用视图或虚拟列,那么我只能建议您根本不要存储这些数据。

于 2013-02-19T13:14:25.710 回答