Plsql 用于在表上自动生成ID的序列和触发器PL/SQL脚本

Plsql 用于在表上自动生成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

有人能帮我修复那个代码吗。它不在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='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时,错误消息消失了。我已经更改了文章标题并添加了最终的工作代码。在这方面损失了一些时间,但这对其他人来说是有用的。谢谢你的帮助。