当前位置: 首页 > 面试题库 >

使用seq和Trigger在Oracle中自动递增-无效的SQL语句

司徒高丽
2023-03-14
问题内容

我是oracle的新手,来自MySQL,我试图通过序列和触发器使autoincrement在Oracle中工作,以便每次执行插入操作时,它都会使字段增加1。

CREATE SEQUENCE proposals_seq MINVALUE 1 
START WITH 1 INCREMENT BY 1 CACHE 10;

CREATE OR REPLACE TRIGGER proposals_before_insert
BEFORE INSERT
   ON proposals
   FOR EACH ROW
BEGIN
    SELECT proposals_seq.nextval INTO :new.proposal_id FROM dual;
END;

但是,当我运行脚本时,出现错误:

Error code 900, SQL state 42000: ORA-00900: invalid SQL statement

如果我删除“;” 在select语句之后,我没有任何错误,直到尝试将数据插入表中,然后才出现此错误:

INSERT INTO proposals (target_audience, line_of_business, activity_description, cost, comments, objectives_and_results) 
    VALUES ('test', 'test', 'test', 15, 'test', 'test');

Error code 4098, SQL state 42000: ORA-04098: trigger 'PROPOSALS_BEFORE_INSERT' is invalid and failed re-validation

我正在使用以下版本的Oracle:Oracle数据库11g企业版11.2.0.1.0版-64位生产

我发现的所有文章似乎都是这样做的,并且在这里也给出了答案:如何在Oracle上使用AUTO_INCREMENT创建ID?

可能是因为我使用的是Oracle版本吗?我还有另一种方法可以自动增加此值吗?还是我必须按照我的sql中的顺序手动增加?

我的桌子看起来像这样:

CREATE TABLE proposals (
    proposal_id INT NOT NULL,
    target_audience VARCHAR2(50) NOT NULL,
    line_of_business VARCHAR2(50),
    activity_description VARCHAR2(250) NOT NULL,
    cost DECIMAL(19, 4) NOT NULL,
    comments VARCHAR2(250),
    objectives_and_results VARCHAR2(250),
    PRIMARY KEY (proposal_id)
);

问题答案:

我怀疑问题在于您的客户端工具正在读取每个分号作为命令的结尾,从而导致PL / SQL代码(需要分号作为语句终止符)被错误地传输到服务器。

当您删除分号时,该语句已正确发送到服务器,但是由于PL / SQL错误,您最终将获得无效的对象。

我在SQL Fiddle上重复了您的问题。然后,我将语句终止符更改为/;然后将代码更改为使用斜杠html" target="_blank">执行每个语句,并且它的工作没有错误:

CREATE TABLE proposals (
    proposal_id INT NOT NULL,
    target_audience VARCHAR2(50) NOT NULL,
    line_of_business VARCHAR2(50),
    activity_description VARCHAR2(250) NOT NULL,
    cost NUMBER(19, 4),
    comments VARCHAR2(250),
    objectives_and_results VARCHAR2(250),
    PRIMARY KEY (proposal_id)
)
/

CREATE SEQUENCE proposals_seq MINVALUE 1 
START WITH 1 INCREMENT BY 1 CACHE 10
/

CREATE OR REPLACE TRIGGER proposals_before_insert
BEFORE INSERT ON proposals FOR EACH ROW
BEGIN
    select proposals_seq.nextval into :new.proposal_id from dual;
END;
/


 类似资料:
  • 问题内容: 我现在正在一家公司中使用全球DBA的无限智慧,他创建了一个表,该表将一个int用作ID字段,但是不会自动递增该数字。 我要从.Net传递一个表值参数,因为它随时有大约100或更多行的数据正在传递,并且我不想杀死该应用程序,破坏网络或SQL Server。 这是我的存储过程 我希望这会为我带来一些帮助,就像我对此进行测试时一样 这就是我回来的 (影响1行) (影响1行) (影响1行) (

  • 问题内容: 我创建了下表,但出现错误; “ AUTO_INCREMENT”附近的语法不正确。 的SQL 我想我做对了所有事情。有人可以帮我吗? 问题答案: 它不在SQL Server中。 尝试以下方法:

  • 当我从我之前的文章“使用Oracle将三个表与PIVOT结合起来”中的代码,并在SQL开发人员中点击“运行脚本”时,一切都非常完美,但是当我试图从PHP文件中执行相同的脚本时,我得到了“ORA-00900无效的SQL语句”-错误。SQL开发人员“运行语句”也无法执行代码。我的代码似乎不在“SQL语句”语法中? 用于将sql脚本放入变量的PHP代码: 然后我将$sql变量传递给函数以获得结果: 那么

  • 问题内容: 嗨,我想使用Java在mongodb中自动递增。我对此完全陌生。在文档中,我找到了这样的解决方案: 谁能建议我如何使用Java做到这一点?我对此完全陌生。 问题答案: 首先使用“ 创建自动递增序列字段”,您应该使用mongoDB shell创建集合,并且集合应为: 因此,您将获得包含如下字段的集合,现在在Java中创建函数,并且此函数具有作为字符串的参数,因此如下所示: } 上面的函数

  • 本文向大家介绍Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例,包括了Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例的使用技巧和注意事项,需要的朋友参考一下 问题:在SQL Server数据库中,有自增列这个字段属性,使用起来也是很方便的。而在Oracle中却没有这个功能,该如何实现呢? 答:在Oracle中虽然没有自增