【问题标题】:Oracle: Statements running into each otherOracle:语句相互冲突
【发布时间】:2020-06-29 03:15:30
【问题描述】:

我不熟悉 Oracle,正在测试旧版本所需的自动递增触发器,其中 IDENTITY 尚不可用。

CREATE TABLE stuff (
    id int PRIMARY KEY,
    data varchar(255)
);

CREATE SEQUENCE stuff_sequence;
CREATE TRIGGER test
BEFORE INSERT ON stuff
FOR EACH ROW
BEGIN
    SELECT stuff_sequence.nextval INTO :new.id FROM dual;
END;

INSERT INTO stuff(data) VALUES('test');

使用 SQL Developer,我可以运行 CREATE TABLE 语句,然后运行 ​​CREATE SEQUENCE 语句,但是当我运行 CREATE TRIGGER 语句时,它也会突出显示 INSERT 语句,然后抱怨 `Encountered符号“插入”。显然,如果我尝试将全部内容作为单个脚本运行,我会得到同样的错误。

这里发生了什么,我该如何解决?

【问题讨论】:

    标签: oracle oracle-sqldeveloper database-trigger


    【解决方案1】:

    只需将/ 放在触发代码的末尾即可。代表上面代码的结束。

    CREATE TRIGGER test
    BEFORE INSERT ON stuff
    FOR EACH ROW
    BEGIN
        SELECT stuff_sequence.nextval INTO :new.id FROM dual;
    END;
    / -- this
    
    INSERT INTO stuff(data) VALUES('test');
    

    /在输入一个DML或DDL或PL/SQL过程中的意思是“终止当前语句,执行它并将它存储到SQLPLUS缓冲区”,而/需要在多行代码中表示该代码到此结束。

    干杯!!

    【讨论】:

    • 对不起,斜线是什么,为什么要使用它?是不是像微软的GO
    • 它代表写在它上面的代码的结尾。单个脚本中的每个 plsql 代码都需要以/ 结尾
    • 如果此答案解决了您的问题,请接受它,以便将该问题标记为已解决。
    • 我确实问过发生了什么。我不知道我正在编写任何这样的 plsql 代码,只是 SQL。答案没有解释为什么斜线在CREATE TRIGGER 之后而不是其他地方。对我来说,此时添加斜线,但其他任何地方看起来都不像一个神奇的咒语。
    • / 在输入 DML 或 DDL 或 PL/SQL 期间表示“终止当前语句,执行它并将其存储到 SQLPLUS 缓冲区”,并且在多行代码中需要 /表示代码到此结束。
    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多