具有自动值的oracle PL/SQL
大家好,我有一个关于在oracle中计算列中的值的问题 我有这张桌子具有自动值的oracle PL/SQL,oracle,plsql,Oracle,Plsql,大家好,我有一个关于在oracle中计算列中的值的问题 我有这张桌子 NAME PROCESS1 PROCESS2 WEIGHT TOTAL_WEIGHT ITEM1 0 0 10 ITEM2 1 1 10 ITEM3 1 1 15 因此,我在这里尝试的是基于PL/SQL中的process1和process2生成total_weig
NAME PROCESS1 PROCESS2 WEIGHT TOTAL_WEIGHT
ITEM1 0 0 10
ITEM2 1 1 10
ITEM3 1 1 15
因此,我在这里尝试的是基于PL/SQL中的process1和process2生成total_weight中的值。因为稍后我需要在PHP页面中显示总权重的总和。因此,项目2的总重量应为20,项目3的总重量应为30。我应该使用生成总重量值的过程吗?我希望在用户更改Process1或process2中的值时更新该值。请帮帮我,我是个新手
select name, process1, process2, weight, (process1+process2)*weight total_weight
from table
我看不出PL/SQL必须在这方面发挥作用的原因,除非我误解了需求
我看不出PL/SQL必须在这方面发挥作用的原因,除非我误解了要求。据我所知,您希望在流程1或流程2中的值发生变化时更新字段
总权重。因此,理想情况下,您必须为此使用触发器
触发器用于根据初始事件触发操作
因此,对于您的情况,初始事件是“进程1或进程2的值更改
”,预期操作是“基于更改的值自动更新总重量字段
”
但是,对于您的需求,触发器是不必要的,而开销是完全不必要的。因此,与其在表中增加一个字段,不如使用如下所示的select查询,它将在运行时计算值并显示实时值
SELECT NAME,
PROCESS1,
PROCESS2,
WEIGHT ,
(WEIGHT * (PROCESS1 + PROCESS2)) AS TOTAL_WEIGHT
FROM MY_TABLE
输出将是:
NAME | PROCESS1 | PROCESS2 | WEIGHT | TOTAL_WEIGHT
------------------------------------------------------------
ITEM1 | 0 | 0 | 10 | 0
ITEM2 | 1 | 1 | 10 | 20
ITEM3 | 1 | 1 | 15 | 30
您可以使用类似于resultSet.getLong(“TOTAL_WEIGHT”)的东西来使用这个总重量代码>
或者,如果您非常特别需要该字段,则可以修改更新查询以包括
UPDATE MY_TABLE SET FIELD1=VALUE1, FIELD2=VALUE2, ... ,
TOTAL_WEIGHT = (WEIGHT * (PROCESS1 + PROCESS2))
WHERE SOME_CONDITION;
据我所知,您希望在流程1或流程2中的值发生变化时更新字段TOTAL_WEIGHT
。因此,理想情况下,您必须为此使用触发器
触发器用于根据初始事件触发操作
因此,对于您的情况,初始事件是“进程1或进程2的值更改
”,预期操作是“基于更改的值自动更新总重量字段
”
但是,对于您的需求,触发器是不必要的,而开销是完全不必要的。因此,与其在表中增加一个字段,不如使用如下所示的select查询,它将在运行时计算值并显示实时值
SELECT NAME,
PROCESS1,
PROCESS2,
WEIGHT ,
(WEIGHT * (PROCESS1 + PROCESS2)) AS TOTAL_WEIGHT
FROM MY_TABLE
输出将是:
NAME | PROCESS1 | PROCESS2 | WEIGHT | TOTAL_WEIGHT
------------------------------------------------------------
ITEM1 | 0 | 0 | 10 | 0
ITEM2 | 1 | 1 | 10 | 20
ITEM3 | 1 | 1 | 15 | 30
您可以使用类似于resultSet.getLong(“TOTAL_WEIGHT”)的东西来使用这个总重量代码>
或者,如果您非常特别需要该字段,则可以修改更新查询以包括
UPDATE MY_TABLE SET FIELD1=VALUE1, FIELD2=VALUE2, ... ,
TOTAL_WEIGHT = (WEIGHT * (PROCESS1 + PROCESS2))
WHERE SOME_CONDITION;
如果您使用的是11g或更高版本,最安全的处理方法是将TOTAL_WEIGHT设置为计算列。CREATETABLE语句将变成
CREATE TABLE MY_TABLE
(PROCESS1 NUMBER,
PROCESS2 NUMBER,
WEIGHT NUMBER,
TOTAL_WEIGHT NUMBER GENERATED ALWAYS AS (NVL((PROCESS1+PROCESS2)*WEIGHT, 0)));
通过这种方式,应用程序不需要知道如何计算总权重-它总是正确的
分享和享受。如果您使用的是11g或更高版本,最安全的处理方法是将TOTAL_WEIGHT设置为计算列。CREATETABLE语句将变成
CREATE TABLE MY_TABLE
(PROCESS1 NUMBER,
PROCESS2 NUMBER,
WEIGHT NUMBER,
TOTAL_WEIGHT NUMBER GENERATED ALWAYS AS (NVL((PROCESS1+PROCESS2)*WEIGHT, 0)));
通过这种方式,应用程序不需要知道如何计算总权重-它总是正确的
共享和享受。在Oracle表设计中声明虚拟(计算)列
我同意到目前为止所说的大部分内容,并作了一些额外的阐述。我的起始表设计看起来很相似,但对于某些用例来说也不准确,如下所述
CREATE TABLE "PROCESSED_PRODUCT_WEIGHT" (
"PRODUCT_NAME" VARCHAR2(40) NOT NULL,
"PROCESS1" NUMBER,
"PROCESS2" NUMBER,
"WEIGHT" NUMBER,
"TOTAL_WEIGHT" NUMBER GENERATED ALWAYS AS
((PROCESS1 + PROCESS2)*WEIGHT) VIRTUAL,
"RECORDED_DATE" DATE,
CONSTRAINT "PROCESSED_PRODUCT_WEIGHT_PK"
PRIMARY KEY ("PRODUCT_NAME", "RECORDED_DATE")
)
/
以前的建议和假设
表绑定属性属性:使用的表构造也称为虚拟列
。它运行良好,因为总权重的定义完全依赖于同一表格中包含的其他值
SQL查询关联计算:另一方面,两者都建议修改针对数据库执行的每个SQL查询中的值
假设单位产品质量在生产周期内不发生变化,这两种情况都可能起作用
这种假设不灵活的一个例子是,如果产品由每单位体积质量不同的单位组成
因为在OP中没有提及,考虑这种可能性:
- 产品项目1、项目2和项目3的单位重量可变李>
- 它们都是在咖啡包装厂生产的李>
- 每个项目可以是一种类型的咖啡豆及其来源李>
- “过程”可以是豆类的“处理”,如脱咖啡因、烘焙或调味李>
“单元”可以是不同尺寸的包装。这意味着包装体积将直接影响每件产品的质量(称为“重量”)
识别单元尺寸变化影响的测试用例
每个测试用例都显示了虚拟柱如何不满足每个产品的单位尺寸和质量随时间变化的可能性
测试用例一:
2015年2月14日的生产观察
测试用例二:
2014年3月14日处理的每单位质量仅增加,从而使生产的总质量发生偏差,因为之前生产的项目数量通过虚拟列定义乘以更大的值
测试用例三:
数据输出和结果
以上是与所有三个测试用例相关的测试结果。对于用例cr,结果值不正确