300分求解决方案--触发器

qufo 2003-03-27 10:45:48
我手头有一个程序,程序描述一企业进销交易。内有一 进货商品(goods)表,表中有goodsid,goodsname,goodsqty(商品数量),goodsprice(商品单价)。

程序中有一窗口,可以新增进货记录,填写goodsid,goodsname,goodsqty,goodsprice后可以"保存",则在表中新增一条记录。

现程序设计中没有对goodsprice的检查,导致部分人员可以新增一进货商品记录,数量为300,单价为零或空。而这与现实有一定差异。

现欲改正之,使操作员在新增进货商品记录时一定要填写确定的价格,而不可以是0或者空。

程序的源程序无法获得,所以寄希望于触发器,请问是否可以在数据中增加触发器来使得触发器检查新增的记录goodsprice是否为0或空,如果是0或空,则报错。

程序所使用后台数据库为oracle 8

另。oracle 8 中的那个什么console进入时倒底有什么用户名和密码?
我是初手,请问该如何设计,并请把代码贴出。最好有详细操作步骤,分会分次给出。
...全文
19 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sam7701 2003-03-31
  • 打赏
  • 举报
回复
這種情況完全可以不需要觸發器﹐在前端存檔的時候控制就可以了。 is null(變量) 或 len(trim(變量)) = 0
hong_flood 2003-03-30
  • 打赏
  • 举报
回复
同意Lastdrop(空杯) 的观点。
Lastdrop 2003-03-28
  • 打赏
  • 举报
回复
if :new.goodsprice is null and :new.goodsprice=0 then
raise e_null;
end if;

要改成
if :new.goodsprice is null OR :new.goodsprice=0 then
raise e_null;
end if;

应该是或条件!
qufo 2003-03-28
  • 打赏
  • 举报
回复
没反应呀,照样可以保存。为什么、
beckhambobo 2003-03-28
  • 打赏
  • 举报
回复
想了想,不可以用触发器实,不管触发器成功会否,语句还是执行,而且不会回滚。
当单击按钮事件,就调用此过程,而p_goodsid参数用一个方法去捕捉它.
create procedure name_pro(p_goodsid in varchar2,p_goodsprice in number)
as
e_null exception;
begin
if p_goodsprice is not null or lengthb(p_goodsprice)>0 then
update goods set goodsprice=p_goodsprice where goodsid=p_goodsid;
else
raise e_null;
end if;
exception
when e_null then
dbms_output.put_line('单价不能为空');
end;
/
newusers 2003-03-27
  • 打赏
  • 举报
回复
console进入时倒底有什么用户名和密码:sysman/oem_temp
使用insert after 行级触发器,
beckhambobo 2003-03-27
  • 打赏
  • 举报
回复
create trigger name_tri
before insert on goods
for each row
declare
e_null exception;
begin
if :new.goodsprice is null and :new.goodsprice=0 then
raise e_null;
end if;
select id.nextval into :new.goodsid from dual;
exception
when e_null then
--出错处理(检查当没插入goodsid,违反唯一性);
end;
/
beckhambobo 2003-03-27
  • 打赏
  • 举报
回复
create trigger name_tri
before insert on goods
for each row
declare
e_null exception;
begin
if :new.goodsprice is null then
raise e_null;
end if;
select id.nextval into :new.goodsid from dual;
exception
when e_null then
--出错处理(检查当没插入goodsid,唯范唯一性);
end;
/
maohaisheng 2003-03-27
  • 打赏
  • 举报
回复
使用check约束,一大插入0或者空值,数据库回出错
SQL> create table prod(
2 goodsid char(10),
3 goodsname char(10),
4 goodsqty char(10),
5 goodsprice number(10,6)
6 );

表已创建。

SQL>
SQL> alter table prod
2 add constraint check_goodsprice check (goodsprice is not null and goodsprice<>0);

表已更改。

SQL>
SQL> insert into prod values('1','a','a',0);
insert into prod values('1','a','a',0)
*
ERROR 位于第 1 行:
ORA-02290: 违反检查约束条件 (SYSTEM.CHECK_GOODSPRICE)
hong_flood 2003-03-27
  • 打赏
  • 举报
回复
楼上说的有些不太正确,由于在触发器截获了用户自定义异常。
这样即使是错误的数据,也会被提交。
应该在异常处理部分,再次引发异常或回滚,修改如下:

create trigger name_tri_update
before update on goods
for each row
declare
b number;--判定是否数字型
e_null exception;
begin
if :new.goodsprice is null and :new.goodsprice=0 then
raise e_null;
end if;
b:=:new.goodsprice;
exception
when e_null then
begin
dbms_output.put_line('此处不能为空');
raise; --rollback;
end;
when others then
begin
dbms_output.put_line('此处必需填数字');
raise; --rollback;
end;

end;
beckhambobo 2003-03-27
  • 打赏
  • 举报
回复
create trigger name_tri_update
before update on goods
for each row
declare
b number;--判定是否数字型
e_null exception;
begin
if :new.goodsprice is null and :new.goodsprice=0 then
raise e_null;
end if;
b:=:new.goodsprice;
exception
when e_null then
dbms_output.put_line('此处不能为空');
when others then
dbms_output.put_line('此处必需填数字');
end;
/
snowy_howe 2003-03-27
  • 打赏
  • 举报
回复
你的意思是一个人填数量,另一个人填单价?
如果是一人完成记录的话,最好用maohaisheng() 的方法。
qufo 2003-03-27
  • 打赏
  • 举报
回复


--出错处理(检查当没插入goodsid,唯范唯一性);

此处我只有回滚或报错。总之,不让他保存。

另外,问题没有描述清楚,因为是我新增记录,然后由另外一个人在另外一个程序中打开此表中此记录,然后填入价格后保存,所以需要的触发器是更新的触发器,而不是插入。是不是可以改成。


create trigger name_tri_update
before update on goods
~~~~~~
for each row
declare
e_null exception;
begin

..........

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧