sql oracle PL / SQL出错:语句被忽略

时间:2014-05-23 16:49:01

标签: sql oracle

这个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;

编辑:修改了代码上的错字。

2 个答案:

答案 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中的行。

<强>参考

Check if record exists on OTN forum