2

有人可以帮我修复该代码。它不在 PL/SQL (SQLPLUS @script.sql) 上运行,给出 SP2-0552:未声明绑定变量“NEW”。

脚本.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;

声明 counter1 整数;counter2 整数;

开始 SELECT COUNT(*) INTO counter1 FROM ALL_TABLES WHERE TABLE_NAME='SYSTEMDATALOG' AND 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;';

结尾;

4

1 回答 1

2

一个问题是您正在混合 PL/SQL(一个匿名 PL/SQL 块)和 DDL。虽然您可以在 PL/SQL 中编写 DML 语句(SELECT/INSERT/UPDATE/DELETE),但您不能直接在 PL/SQL 中编写 DDL(CREATE/DROP 等)。

您需要在匿名 PL/SQL 块之外运行 DDL 语句或使用 EXECUTE IMMEDIATE '<statement>';.

至于:NEW我认为当你解决其他问题时它会消失的错误。如果没有,请尝试添加:

SET SCAN OFF

在 SQL*Plus 文件的开头。

于 2013-08-07T13:32:37.330 回答