Plsql 用于在表上自动生成ID的序列和触发器PL/SQL脚本
有人能帮我修复那个代码吗。它不在PL/SQL SQLPLUS@script.SQL上运行,因此 SP2-0552:未声明绑定变量NEW Script.SQLPlsql 用于在表上自动生成ID的序列和触发器PL/SQL脚本,plsql,triggers,sequence,Plsql,Triggers,Sequence,有人能帮我修复那个代码吗。它不在PL/SQL SQLPLUS@script.SQL上运行,因此 SP2-0552:未声明绑定变量NEW Script.SQL prompt Creating Table SYSTEMDATALOG; declare counter1 integer; counter2 integer; begin SELECT COUNT(*) INTO counter1 FROM ALL_TABLES WHERE TABLE_NAME='SYS
prompt Creating Table SYSTEMDATALOG;
declare
counter1 integer;
counter2 integer;
begin
SELECT COUNT(*) INTO counter1 FROM ALL_TABLES WHERE TABLE_NAME='SYSTEMDATALOG' AND OWNER='MZMESDB';
if counter1 = 1 then
DROP TABLE SYSTEMDATALOG;
end if;
SELECT COUNT(*) INTO counter2 FROM ALL_SEQUENCES WHERE SEQUENCE NAME='SEQSYSTEMDATALOG';
if counter2 = 1 then
DROP SEQUENCE SEQSYSTEMDATALOGID;
endif;
CREATE TABLE "MZMESDB"."SYSTEMDATALOG" ( "ID" INTEGER NOT NULL ,
"DATETIME" DATE NOT NULL ,
"TYPE" VARCHAR2(64) NOT NULL,
"SEVERITY" INTEGER NOT NULL,
"SOURCE" VARCHAR2(64) NOT NULL,
"USER" VARCHAR2(64) NOT NULL,
"MESSAGE" VARCHAR2(1024), PRIMARY KEY ("ID") VALIDATE );
CREATE SEQUENCE SEQSYSTEMDATALOGID;
CREATE OR REPLACE TRIGGER TRIGSYSTEMDATALOGID
BEFORE INSERT ON SYSTEMDATALOG
FOR EACH ROW
BEGIN
SELECT SEQSYSTEMDATALOGID.NEXTVAL INTO :NEW.ID FROM DUAL;
END TRIGSYSTEMDATALOGID;
end;
/
提前感谢您的帮助
[最终守则]
提示创建表SYSTEMDATALOG
申报
计数器1整数;
计数器2整数
开始
从所有_表中选择COUNT*INTO counter 1,其中表_NAME='SYSTEMDATALOG'和OWNER='MZMESDB'
if counter1 = 1 then
execute immediate 'DROP TABLE SYSTEMDATALOG';
end if;
SELECT COUNT(*) INTO counter2 FROM ALL_SEQUENCES WHERE SEQUENCE_NAME='SEQSYSTEMDATALOG';
IF counter2 = 1 then
execute immediate 'DROP SEQUENCE SEQSYSTEMDATALOGID';
END IF;
execute immediate 'CREATE TABLE "MZMESDB"."SYSTEMDATALOG" (
"ID" INTEGER NOT NULL ,
"DATETIME" DATE NOT NULL ,
"TYPE" VARCHAR2(64) NOT NULL,
"SEVERITY" INTEGER NOT NULL,
"SOURCE" VARCHAR2(64) NOT NULL,
"USER" VARCHAR2(64) NOT NULL,
"MESSAGE" VARCHAR2(1024), PRIMARY KEY ("ID") VALIDATE )';
execute immediate 'CREATE SEQUENCE SEQSYSTEMDATALOGID';
execute immediate 'CREATE OR REPLACE TRIGGER TRIGSYSTEMDATALOGID
BEFORE INSERT ON SYSTEMDATALOG
FOR EACH ROW
BEGIN
SELECT SEQSYSTEMDATALOGID.NEXTVAL INTO :NEW.ID FROM DUAL;
END TRIGSYSTEMDATALOGID;';
结束 一个问题是,您混合了PL/SQL、匿名PL/SQL块和DDL。虽然可以在PL/SQL中编写DML语句SELECT/INSERT/UPDATE/DELETE,但不能直接在PL/SQL中编写DDL CREATE/DROP等 您需要在匿名PL/SQL块之外运行DDL语句,或者使用 立即执行 至于:NEW上的错误,我认为当您修复其他问题时,它将消失。如果没有,请尝试添加: 启动扫描
在SQL*PlUS文件的开头。我使用的是EXECUTE IMMEDIATE,但也没有成功。我更改了脚本,因为它不工作…您的立即执行代码中有一些语法错误:1。结束如果;是像endif一样的拼写错误;2.有些字符串常量没有撇号,SYSTEMDATALOG应该是“SYSTEMDATALOG”。Endif确实是一个错误。我试过引用和不引用,行为都是一样的。即使修复了尾端,如果我仍然遇到了符号;当我期待以下情况之一时:如果在PL/SQL处理器的最后一行。我尝试了它,尽管我与SELECT 1 FROM DUAL交换了所有DDL,并且当我修复了endif时,错误消息消失了。我已经更改了文章标题并添加了最终的工作代码。在这方面损失了一些时间,但这对其他人来说是有用的。谢谢你的帮助。