我有一个从 Oracle Express 导出的SQL文件(很可能是Navicat Lite),并且有创建触发器的查询 .
但是在使用APEX( SQL Workshop - > SQL Script )导入文件后,触发器未成功创建,没有错误 .
查询是这样的,它们肯定是有效的,当我用 SQL Command 手动运行这些查询时,我可以成功创建触发器 .
创建或替换TRIGGER“RESENV” . “AREA_ID_AUTOINCREMENT”在插入“RESENV”之前 . “区域”将旧的“旧”称为“新”为每个行(new.id为空)开始选择area_id_seq.nextval为:来自双重的new.id;结束;;
-- ----------------------------
-- Checks structure for table "RESENV"."AREA"
-- ----------------------------
ALTER TABLE "RESENV"."AREA" ADD CHECK ("ID" IS NOT NULL);
ALTER TABLE "RESENV"."AREA" ADD CHECK ("NAME" IS NOT NULL);
-- ----------------------------
-- Checks structure for table "RESENV"."DATASET"
-- ----------------------------
ALTER TABLE "RESENV"."DATASET" ADD CHECK ("SYSTEM_ID" IS NOT NULL);
ALTER TABLE "RESENV"."DATASET" ADD CHECK ("AREA_ID" IS NOT NULL);
ALTER TABLE "RESENV"."DATASET" ADD CHECK ("TABLE_NAME" IS NOT NULL);
ALTER TABLE "RESENV"."DATASET" ADD CHECK ("CREATED" IS NOT NULL);
-- ----------------------------
-- Triggers structure for table "RESENV"."IDX"
-- ----------------------------
CREATE OR REPLACE TRIGGER "RESENV"."IDX_ID_AUTOINCREMENT" BEFORE INSERT ON "RESENV"."IDX" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW ENABLE WHEN (new.id is null)
begin
select idx_id_seq.nextval into :new.id from dual;
end;;
-- ----------------------------
-- Checks structure for table "RESENV"."IDX"
-- ----------------------------
ALTER TABLE "RESENV"."IDX" ADD CHECK ("ID" IS NOT NULL);
-- ----------------------------
-- Triggers structure for table "RESENV"."SYSTEM"
-- ----------------------------
CREATE OR REPLACE TRIGGER "RESENV"."SYSTEM_ID_AUTOINCREMENT" BEFORE INSERT ON "RESENV"."SYSTEM" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW ENABLE WHEN (new.id is null)
begin
select SYSTEM_ID_SEQ.nextval into :new.id from dual;
end;;
-- ----------------------------
-- Checks structure for table "RESENV"."SYSTEM"
-- ----------------------------
ALTER TABLE "RESENV"."SYSTEM" ADD CHECK ("ID" IS NOT NULL);
ALTER TABLE "RESENV"."SYSTEM" ADD CHECK ("SYSTEM_CREATED" IS NOT NULL);
ALTER TABLE "RESENV"."SYSTEM" ADD CHECK ("SYSTEM_MODIFIED" IS NOT NULL);
ALTER TABLE "RESENV"."SYSTEM" ADD CHECK ("USER_ID" IS NOT NULL);
-- ----------------------------
-- Checks structure for table "RESENV"."UNIT"
-- ----------------------------
ALTER TABLE "RESENV"."UNIT" ADD CHECK ("ID" IS NOT NULL);
ALTER TABLE "RESENV"."UNIT" ADD CHECK ("NAME" IS NOT NULL);
ALTER TABLE "RESENV"."UNIT" ADD CHECK ("GD_ID" IS NOT NULL);
ALTER TABLE "RESENV"."UNIT" ADD CHECK ("AREA_ID" IS NOT NULL);
-- ----------------------------
-- Checks structure for table "RESENV"."USERS"
-- ----------------------------
ALTER TABLE "RESENV"."USERS" ADD CHECK ("ID" IS NOT NULL);
ALTER TABLE "RESENV"."USERS" ADD CHECK ("NAME" IS NOT NULL);
ALTER TABLE "RESENV"."USERS" ADD CHECK ("PASSWORD" IS NOT NULL);
-- ----------------------------
-- Checks structure for table "RESENV"."VLUE"
-- ----------------------------
ALTER TABLE "RESENV"."VLUE" ADD CHECK ("ID" IS NOT NULL);
ALTER TABLE "RESENV"."VLUE" ADD CHECK ("UNIT_ID" IS NOT NULL);
ALTER TABLE "RESENV"."VLUE" ADD CHECK ("IDX_ID" IS NOT NULL);
ALTER TABLE "RESENV"."VLUE" ADD CHECK ("IDX_VALUE" IS NOT NULL);
我尝试了很多次,结果相同 .
为什么会这样?这是APEX的错误吗?
更新
我在SQL文件的末尾显示了上面的这些行(在创建表和插入数据的行之前),但APEX将所有这些行视为ONE语句,并且只创建了一个代码如上所述的触发器(当然触发器的代码中有错误,但APEX在运行SQL脚本时没有提到 .
我尝试使用Navicat导入转储文件(使用 Execute SQL file 函数) . 错误列出,我认为应该没问题 .
更新2
事实证明我必须在每个 create trigger 语句的末尾添加斜杠 / ,否则每个脚本文件中只能创建一个触发器 . see this questin
但是触发器仍然存在上述语句和斜杠的错误 .
代码是:
create or replace TRIGGER "RESENV"."SYSTEM_ID_AUTOINCREMENT" BEFORE INSERT ON "RESENV"."SYSTEM" REFERENCING OLD AS "OLD" NEW AS "NEW" FOR EACH ROW WHEN (new.id is null)
begin
select SYSTEM_ID_SEQ.nextval into :new.id from dual;
end;;
错误是: Line 3 Position 5, PLS-00103: Encountered the symbol ";"
我不知道为什么navcat会像这样导出 .
更新
事实证明,双分号导致了这个问题 . 删除一个后,不再有任何错误 .