这个SQL代码给了我错误"错误在第2行:PL / SQL:语句被忽略",我正在研究SQL oracle application express / APEX:我尝试了我能想到的一切,它每次都给我不同的问题。
CREATE or replace TRIGGER remove_artista
instead of delete on V_ARTISTA
REFERENCING old AS orow
FOR EACH ROW
BEGIN
if exists(select * from Utilizadores where pessoaID = orow.pessoaID) then
delete from Pessoas where pessoaID = orow.pessoaID;
ELSE
delete from Artistas where pessoaID = orow.pessoaID;
delete from Pessoas where pessoaID = orow.pessoaID;
end if;
END;
观点:
create or replace view v_artista as
select
pessoaID, nome_p, sexo, data_nasc, nome_art, biografica
from Pessoas natural inner join Artistas;
编辑:修改了代码上的错字。
答案 0 :(得分:3)
我从触发器收到的完整错误如下:
LINE/COL ERROR
-------- -----------------------------------------------------------------
2/1 PL/SQL: Statement ignored
2/4 PLS-00204: function or pseudo-column 'EXISTS' may be used inside
a SQL statement only
基本上,问题是你不能像你一样说if exists(...)
。甲骨文不允许你。
相反,请尝试将Utilizadores
表中匹配的行数选择为局部变量,然后在if
语句中使用该行:
CREATE or replace TRIGGER remove_artista
instead of delete on V_ARTISTA
REFERENCING old AS orow
FOR EACH ROW
DECLARE
l_count INTEGER;
BEGIN
select count(*)
into l_count
from Utilizadores
where pessoaID = :orow.pessoaID;
if l_count > 0 then
delete from Pessoas where pessoaID = :orow.pessoaID;
ELSE
delete from Artistas where pessoaID = :orow.pessoaID;
delete from Pessoas where pessoaID = :orow.pessoaID;
end if;
END;
我还需要将orow
替换为:orow
。在进行此更改后,您的触发器也会为我编译。
答案 1 :(得分:2)
我认为您不能使用IF EXISTS构造来检查是否存在行。您可以使用SELECT COUNT(*) INTO <a variable>
。但是,您可能不需要检查是否存在行。以下代码可能会起作用:
CREATE OR REPLACE TRIGGER remove_artista
INSTEAD OF DELETE ON V_ARTISTA
FOR EACH ROW
BEGIN
DELETE FROM PESSOAS
WHERE PESSOAID = :OLD.PESSOAID;
DELETE FROM Artistas
WHERE PESSOAID = :OLD.PESSOAID
AND NOT EXISTS (SELECT 1 FROM UTILIZADORES WHERE PESSOAID = :OLD.PESSOAID);
END;
任何情况下都会删除PESSOAS
中的行。仅当ARTISTAS
中不存在PESSOAID
时,才会删除UTILIZADORES
中的行。
<强>参考强>: