Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Autoincremento no oracle com seq e trigger - instrução sql inválida


Suspeito que o problema é que sua ferramenta cliente está lendo cada ponto e vírgula como o final de um comando, fazendo com que o código PL/SQL (que requer ponto e vírgula como terminadores de instrução) seja transmitido incorretamente para o servidor.

Ao remover o ponto e vírgula, a instrução é enviada corretamente ao servidor, mas você acaba com um objeto inválido porque o PL/SQL está incorreto.

Eu dupliquei seu problema no SQL Fiddle. Então eu mudo o terminador de instrução para / em vez de ; e alterei o código para usar uma barra para executar cada instrução, e funcionou sem erros:
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;
/