删除时Oracle触发器的SQL错误

删除时Oracle触发器的SQL错误,oracle,triggers,delete-row,Oracle,Triggers,Delete Row,我是Oracle的第一个新手,使用Netbean IDE 8,如果Room Table包含酒店的房间详细信息,我会尝试阻止从酒店表中删除酒店。这两个表位于两个不同的站点上,因此必须使用触发器。我尝试了下面的代码,但它在第6、10、13、14行抛出了类似下面的sql错误 [异常,错误代码6550,SQLState 65000]ORA-06550:第4行, 第19列:PLS-00049:坏绑定变量ORA-06550:第4行,第4列 30:PLS-00103:期望文件结束时遇到文件结束符号 其中: 表

我是Oracle的第一个新手,使用Netbean IDE 8,如果Room Table包含酒店的房间详细信息,我会尝试阻止从酒店表中删除酒店。这两个表位于两个不同的站点上,因此必须使用触发器。我尝试了下面的代码,但它在第6、10、13、14行抛出了类似下面的sql错误

[异常,错误代码6550,SQLState 65000]ORA-06550:第4行, 第19列:PLS-00049:坏绑定变量ORA-06550:第4行,第4列 30:PLS-00103:期望文件结束时遇到文件结束符号 其中:

表结构是

CREATE TABLE Hotel
(
  HotelID number not null,
  HotelName varchar2(100) not null,
  HotelType varchar2(10) not null,
  ConstrYear varchar2(10) null,
  Country varchar2 (100) not null,
  City varchar2 (50) not null,
  Address varchar2 (100) not null, 
  ContactNo varchar2(50) not null,
  Email varchar2(100) null,
  CONSTRAINT Hotel_pk PRIMARY KEY (HotelID)
);
房间呢

CREATE TABLE Room 
(
 RoomID number not null, 
 HotelID raw(16) not null, 
 RoomNo number not null,
 RoomType varchar2(20) not null, 
 Price numeric(10,2) not null, 
 RoomDesc varchar2(255) not null, 
 CONSTRAINT Room_pk PRIMARY KEY (RoomID),
);
我做错了什么?请帮忙

CREATE OR REPLACE TRIGGER CHECK_Room
BEFORE DELETE on Hotel
FOR each ROW
declare
  rowcount number;
begin
  SELECT COUNT(HotelID) INTO rowcount 
  from ROOM@site1
  where HotelID = :OLD.HotelID;
  if rowcount>0 
  THEN
     Raise_Application_Error (-20100, 'This Hotel has room details in Room table.');
  end if;
end;

如果您的数据库链接状态良好,下面的内容应该适合您。 我建议不要使用保留字作为变量名。一个常见的约定是在变量名前面加v,如本例所示。 我还建议通过数据库链接限定模式名称。_用户与_OTHER_数据库一样是此处的占位符。请根据需要替换为site1等。 首先在两个数据库中创建表:

--This database
CREATE TABLE HOTEL(HOTELID NUMBER);
--(On the other database)
CREATE TABLE ROOM(HOTELID NUMBER);
-- ... Set up database link

CREATE OR REPLACE TRIGGER CHECK_ROOM
BEFORE DELETE ON HOTEL
FOR EACH ROW
  DECLARE
    V_ROWCOUNT NUMBER;
  BEGIN
    SELECT COUNT(HOTELID)
    INTO V_ROWCOUNT
    FROM THE_USER.ROOM@THE_OTHER_DATABASE
    WHERE ROOM.HOTELID = :OLD.HOTELID;
    IF V_ROWCOUNT > 0
    THEN
      Raise_Application_Error(-20100, 'This Hotel has room details in Room table.');
    END IF;
  END;
  /
然后测试它:

--Here
INSERT INTO HOTEL VALUES(19);
COMMIT;
--There
INSERT INTO ROOM VALUES(19);
COMMIT;
然后:


一个错误-您正在声明rowcount变量,但在rowcnt>0时使用。还可以使用set define off命令来避免绑定变量错误。PLS-00049错误表明您的酒店表没有名为HotelId的列。你能把两个表的结构都加到你的问题中吗?PLS-00103错误可能只是因为您没有跟踪/号,但行号参考有点奇怪。你在哪个客户机上运行这个,如何运行?不知道它是否只是没有正确处理PL/SQL代码,并且被分号弄糊涂了。我使用的是NetBean IDE 8。rowcont>0是一个输入错误。我使用的是rowcount>0。没有一个示例显示PL/SQL。我仍然怀疑分号会把它弄错。您是否使用“执行命令”方法?我可能值得从脚本文件中尝试“运行文件”方法,但我怀疑它是否有用。我建议你用一个不同的IDE,比如免费的。或者只是SQL*Plus。或者,如果你真的不能,编写你自己的简单Java程序,在JDBC*8-Thanks@AlexPoole上运行它。是的,这似乎是NetBeans的问题。我使用SQL开发人员并工作。它抛出错误,但至少它编译并工作了。我尝试了您在这里展示的内容,并在相同的连接上进行了尝试,但仍然存在如下错误,[异常,错误代码6550,SQLState 65000]ORA-06550:第5行,第26列:PLS-00049:坏绑定变量ORA-06550:第5行,第37列:PLS-00103:在预期以下情况之一时遇到文件结尾符号:Thank@Mohammed您是否有权访问SQLPlus、SQLcl或SQLDeveloper等客户端,以将另一个工具中的行为与netbeans进行比较?除了PLSQL文本之外,Alex Poole还有一个很好的问题要考虑编辑。如果您可以访问另一个客户机,那么最好看看这种行为是否会重复。另外,您能为我确认一下,当您尝试此操作时,您是否运行了上面的整个示例,包括createtables,只替换了schema和db链接?谢谢你,谢谢你。是的,除了delete函数外,还立即运行了整个脚本,包括createtable。替换了架构和数据库链接。我没有任何其他IDE,但我将尝试获取一个IDE并让您知道其行为。谢谢@MohammedS听起来不错,我将等待在另一个编辑器中听到它的行为。我相信Alex Poole有一些建议,但我也会添加SQLcl。它是免费的,由oracle支持,并且是轻量级的。这是一个java命令行应用程序。你可以在这里试试:谢谢@alexgibbs。我在sqldeveloper上试过,它确实有效,但编译时出错了。触发器阻止删除,但也会引发错误。输出如下所示。我现在正在试用SQLcl。从命令中的第1行开始出错-从酒店错误报告中删除-SQL错误:ORA-20100:此酒店在房间表中有房间详细信息。ORA-06512:在USER.CHECK_ROOM,第10行ORA-04088:执行触发器“USER.CHECK_ROOM”时出错
DELETE FROM HOTEL;
DELETE FROM HOTEL
            *
ERROR at line 1:
ORA-20100: This Hotel has room details in Room table.