Oracle SQL автоматически создает VARCHAR с приращением PK - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь написать таблицу Oracle SQL таким образом, чтобы при вставке строки (через форму Oracle APEX) PK автоматически заполнялся типом varchar, который автоматически увеличивается. Например. TNT00000001, TNT00000002, TNT00000003 ...

 create table sample (
Tnt_ID CHAR(8) NOT NULL,
wtv NUMBER(3)
);

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

CREATE OR REPLACE TRIGGER sample_on_insert
  BEFORE INSERT ON sample
  FOR EACH ROW
BEGIN
  SELECT CONCAT('TNT', LPAD(Tnt_ID_Auto.nextval, 5, '0'))
  INTO :new.Tnt_ID
  FROM dual;
END;

Когда я пытаюсь запустить это:

INSERT INTO SAMPLE (wtv) VALUES (1);

Я получаю сообщение об ошибке

PLS-00103: Обнаружен символ "ВСТАВКА"

Ответы [ 2 ]

3 голосов
/ 03 апреля 2020

Это хороший вариант использования для столбцов IDENTITY и VIRTUAL . Таким образом, нет необходимости в дополнительных SEQUENCE и TRIGGER .

Демо:

CREATE TABLE sample (
    serial_no NUMBER GENERATED ALWAYS AS IDENTITY,
    tnt_id GENERATED ALWAYS AS (CONCAT('TNT', LPAD(serial_no, 5, '0'))) VIRTUAL,
    wtv    NUMBER(3)
);

insert into sample (wtv) values(100);
insert into sample (wtv) values(200);
insert into sample (wtv) values(300);

Результат:

select * from sample;

 SERIAL_NO TNT_ID                         WTV
---------- ----------------------- ----------
         1 TNT00001                       100
         2 TNT00002                       200
         3 TNT00003                       300

Как это работает:

  1. NUMBER GENERATED ALWAYS AS IDENTITY: автоматически создается необходимая последовательность, начинается с 1 и увеличивается на 1 по умолчанию.
  2. GENERATED ALWAYS AS VIRTUAL: создается виртуальный столбец, значения которого рассчитываются автоматически с использованием других значений столбца. В этой демонстрации он использует столбец идентификаторов.
  3. LPAD: Это обеспечит заполнение нулями слева при увеличении значения столбца, но также будет гарантировать, что при увеличении числа оно не увеличит длину строки.
  4. CONCAT: это приведет к TNT выше указанного значения.
0 голосов
/ 03 апреля 2020

Если вы хотите узнать, что не так с вашими запросами, отсутствует /

create table sample (
Tnt_ID CHAR(8) NOT NULL,
wtv NUMBER(3)
);

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

CREATE OR REPLACE TRIGGER sample_on_insert
  BEFORE INSERT ON sample
  FOR EACH ROW
BEGIN
  SELECT CONCAT('TNT', LPAD(Tnt_ID_Auto.nextval, 5, '0'))
  INTO :new.Tnt_ID
  FROM dual;
END;
/ -- this needs here

INSERT INTO SAMPLE (wtv) VALUES (1);

PL / SQL код должен заканчиваться на /, прежде чем начинать другой код под ним .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...