java - Oracle 从其他列计算结果中更新列

标签 java database oracle prepared-statement

我有一个具有以下结构的表 passenger

CREATE TABLE passenger (
  id NUMERIC(12,0) NOT NULL,
  station VARCHAR(3), 
  adult NUMERIC(3,0), 
  child NUMERIC(3,0), 
  infant NUMERIC(3,0),
  crew NUMERIC(3,0) DEFAULT 0,
  paying NUMERIC(4,0), 
  non_paying NUMERIC(4,0),  
  total_passenger NUMERIC(3,0), 
  PRIMARY KEY (id)
);

初始记录如下。

id  | station | adult | child | infant | crew | paying | non_paying | total_passenger
100 | GWN     | 20    | 4     | 1      | 2    | 24     | 3          | 27

paying 字段的值是通过将adultchild 值相加计算得出的。而且,通过对 infantcrew 求和,我可以获得 non_paying 值。然后我可以对 payingnon_paying 字段求和以获得 total_passenger

问题是,当我更新 adultchildinfantcrew 字段时,可能每个字段的NULL值,数据库是否可以重新计算payingnon_payingtotal_passenger而不需要更新手动?

我尝试了以下查询但结果出乎意料。

UPDATE passenger
SET adult = NVL(NULL, adult),
    child = NVL(6, child),
    infant = NVL(3, infant),
    crew = NVL(NULL, crew),
    paying = adult + child,
    non_paying = infant + crew,
    total_passenger = paying + non_paying
WHERE id = 100;

NULL 关键字来自准备语句参数,它可能是空值。如何自动更新最后三个字段?

最佳答案

您可以使用触发器在 UPDATE 发生后对 passenger 表进行额外更新:

CREATE OR REPLACE TRIGGER update_passenger
AFTER UPDATE OF passenger
FOR EACH ROW
BEGIN
   UPDATE passenger
   SET
       paying = NVL(:NEW.adult, 0) + NVL(:NEW.child, 0),
       non_paying = NVL(:NEW.infant, 0) + NVL(:NEW.crew, 0),
       total_passenger = NVL(:NEW.adult, 0) + NVL(:NEW.child, 0) +
                         NVL(:NEW.infant, 0) + NVL(:NEW.crew, 0)
END;

要使用触发器,您只需像往常一样对 passenger 进行更新。如果您将 adultchildinfantcrew 字段更新为 NULL 对于给定的记录,我的触发器将在计算总计时将 NULL 视为 0

关于java - Oracle 从其他列计算结果中更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34647378/

相关文章:

java - 类似python的Java IO库?

java - 使用数据库和JAVA创建简单的工作流引擎

java - 在 java 中访问静态变量时,类是否会加载到内存中?

python - 似乎无法转储 mysql 数据库

Oracle "create table as"空值

java - 为什么这个 AngularJS 调用会导致 400 错误请求错误(Spring 后端)

java - 如何用hibernate指向其他表的ID?

node.js - Mongoose - 在一个函数调用中删除多个文档

oracle sql varray 包含一个元素

sql - 为什么此 CREATE TABLE 语句会导致 "ORA-00922 missing or invalid option"?