2014-02-17 104 views
0

我试图创建一个函数/触发器,它可以在不需要编写查询的情况下更新表supply中的status_comunal_wasteORACLE PLSQL函数/触发器

编辑:

TRAFFIC (date),(input_quant),(output_quant),(status) 
SUPPLY (input_quant), (output_quant),(status_comunal_waste) 

后,我导入日期,输入,输出,状态数据到表中的流量, 与触发AIR的数据也被导入到表供应,与列execption USER_CHANGES,DATE_CHANGES,USER_DELETE,DATE_DELETE,以模仿“用户”决定更改或添加数据时“用户”所做的更改。

到目前为止,我已经试过这样的事情

create or replace TRIGGER supply_after_insert 
after INSERT 
ON traffic 
FOR EACH ROW 

DECLARE 

Status_comunal_waste VARCHAR2(20); 

BEGIN 

SELECT SUM(input_quant) - SUM(output_quant) 
into Status_comunal_waste 
    FROM traffic 
    WHERE (key_num_code =200101); 

INSERT INTO supply 
(Status_comunal_waste) VALUES (Status_comunal_waste); 
END; 

编辑:

同时,我从创建一个触发器功能切换,这是迄今为止写的:

create or replace 
FUNCTION stat_comunal_waste (key_num_code number) 

return number 

is 

status_comunal_waste NUMBER; 

BEGIN 
if (key_num_code = 200101) THEN 

SELECT SUM (input_quant) - SUM (output_quant) 
into status_comunal_waste 
    FROM traffic 
    WHERE key_num_code =200101; 
    end if; 

    return status_comunal_waste; 
END; 

功能编译没有错误,但现在我得到错误的包装

CREATE OR REPLACE PACKAGE Paket 
IS 
function stat_comunal_waste (key_num_code number) 
return status_comunal_waste; 
end Paket; 
/

错误(3,1):PL/SQL:忽略声明

错误(4,8):PLS-00488: 'status_comunal_waste' 必须是一个类型

+0

什么是“没有运气”的意思是 - 你得到编译错误,运行时错误,而不是你预期的结果?当你说这个表叫做'supply'时,你为什么要插入'status'中,而且你没有显示任何一个名为'Status_comunal_waste'的表。你说你想更新一些东西,但是你正在做一个插入。真的不是很清楚发生了什么,或者为什么。 –

+0

我的歉意,我写了一个不正确的声明和错误的列名(我之前使用过)。我会编辑它。正如你所说的那样,它会**插入到'supply'中。编译触发器,但它不会做我认为会的:我手动尝试更改列中的一个信息,但它不会显示“Supply(status_comunal_waste)”表中的更改。 Supply表中存在三列,所有这些列都需要更新,其中一列是'status_comunal_waste'列,所以我试图为每个列设置一个触发器。我从触发器切换到创建功能,我现在编辑我的帖子。 – Sasa

+0

PLS-00488仅仅是因为你的'return status_comunal_waste'而不是'return number',因为这个消息显示了真的。但这似乎是一个侧面问题。我不明白你为什么说你有单独的触发器,或者你为什么谈论更新(三个值),但显示一个* insert *只设置一个值。也许显示一些现有的数据,你插入什么,以及你希望数据看起来像什么后会有所帮助。 –

回答

1

这个查询可能是错误的。

SELECT SUM(input_quant) - SUM(output_quant) into Status_comunal_waste 
FROM traffic WHERE key_num_code =200101); 

确保您获得正确的值。尝试替换下面的代码上面的查询,并给它一个尝试

select SUM(input_quant) into input_q FROM traffic WHERE key_num_code =200101; 
select SUM(output_quant) into output_q FROM traffic WHERE key_num_code =200101; 
diff := input_q - output_q; 

最终插入物将是这样的:

INSERT INTO status (Status_comunal_waste) VALUES (diff);