为了账号安全,请及时绑定邮箱和手机立即绑定

请问像下面那种情况怎么才能正确的返回一个布尔值?

请问像下面那种情况怎么才能正确的返回一个布尔值?

翻翻过去那场雪 2022-11-19 12:08:14
--库存信息CREATE TABLE STORAGE (WARE_ID VARCHAR2(10),STORAGE_COUNTS NUMBER(10),CONSTRAINTS STOR_PK_ID PRIMARY KEY(WARE_ID));--进货数量CREATE TABLE STOCK (WARE_ID VARCHAR2(10),STOCK_COUNTS NUMBER(10) NOT NULL,CONSTRAINTS STO_PK_ID PRIMARY KEY(WARE_ID));ALTER TABLE STOCKADD CONSTRAINTS STO_FK_COUNTS FOREIGN KEY(WARE_ID) REFERENCES STORAGE(WARE_ID);CREATE OR REPLACE TRIGGER BI_STOBEFORE INSERT OR UPDATEON STOCKFOR EACH ROWBEGINIF(EXISTS(SELECT STO.WARE_ID FROM STORAGE STOWHERE STO.WARE_ID = :NEW.WARE_ID))THENUPDATE STORAGE SET STORAGE.STORAGE_COUNTS = (STORAGE.STORAGE_COUNTS + :NEW.STOCK_COUNTS)WHERE STORAGE.WARE_ID = :NEW.WARE_ID;ELSE IF(NOT EXISTS(SELECT STO.WARE_ID FROM STORAGE STO, STOCK WHERE STO.WARE_ID = :NEW.WARE_ID))THENINSERT INTO STORAGE VALUES(:NEW.WARE_ID, :NEW.STOCK_COUNTS);END IF;END IF;END;TRIGGER SGL.BI_STO 编译错误错误:PLS-00204: 函数或伪列 'EXISTS' 只能在 SQL 语句中使用行:7文本:IF(EXISTS(SELECT STO.WARE_ID FROM STORAGE STO错误:PL/SQL: Statement ignored行:7文本:IF(EXISTS(SELECT STO.WARE_ID FROM STORAGE STO
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

这样应该就可以了,不过自治事务用在业务比较复杂的数据库里面是要慎用的,很容易引发死锁,
create
or
replace
trigger
stu_upd
after
update
on
score
referencing
old
as
old
new
as
new
for
each
row
declare
pragma
autonomous_transaction
;
t_savg
number(6,2);
begin
select
avg(score)
into
t_savg
from
score
where
sno=:new.sno;
update
student
set
savg=t_savg
where
sno=:new.sno;
commit
;
end;

 


查看完整回答
反对 回复 2022-11-24
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

主要原因是调用biu_document
触发器时,没有commit,所以执行
select
sum(money)
into
countmoney
from
(select
sto.counts
*
sto.price
money
from
stock
sto
where
sto.document_id
=
:new.document_id)
stock_moeny
时,返回的是null值。
触发器之间也不能传递参数,这里建议写存储过程吧
在biu_stock触发器中调用存储过程分别向document,affairs写数据。

 


查看完整回答
反对 回复 2022-11-24
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

用select into 如果 查询出来的是null值,应该会报错吧
试试下面这个:

CREATE OR REPLACE TRIGGER BI_STO
BEFORE INSERT OR UPDATE
ON STOCK
FOR EACH ROW  
declare
v_count int;
BEGIN
select count(*)
into v_count
from STORAGE STO
WHERE STO.WARE_ID = :NEW.WARE_ID;

if v_count > 0 then
UPDATE STORAGE
SET STORAGE_COUNTS = (STORAGE_COUNTS +:NEW.STOCK_COUNTS)
WHERE WARE_ID = :NEW.WARE_ID;
else
INSERT INTO STORAGE
VALUES(:NEW.WARE_ID,:NEW.STOCK_COUNTS);
end if;
END;


查看完整回答
反对 回复 2022-11-24
  • 3 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信