[英]Error on sql oracle PL/SQL: Statement ignored
这段SQL代码给我错误“第2行错误:PL / SQL:语句被忽略”,我正在处理SQL oracle应用程序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;
编辑:修复了代码上的小错字。
我从您的触发器收到的完整错误如下:
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(...)
。 Oracle不允许您这样做。
相反,尝试将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
替换:orow
。 进行此更改后,您的触发器也会为我编译。
我认为您不能使用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
, PESSOAS
将被删除。 仅当PESSOAID
中不存在ARTISTAS
才会删除PESSOAID
中的UTILIZADORES
。
参考文献 :
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.