DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

AutoNumber и Identity функциональность в Oracle Databases

Разработчики, которые привыкли к столбцам AutoNumber в столбцах Access или Identity в MS SQL-сервере часто жалуются, когда они должны вручную заполнить значениями столбцы первичного ключа, явно используя последовательности Oracle. Этот тип функциональности может быть легко реализован в Oracle при помощи триггеров.
Создайте таблицу с подходящим столбцом первичного ключа и последовательностью.
CREATE TABLE departments (
ID NUMBER(10) NOT NULL,
DESCRIPTION VARCHAR2(50) NOT NULL);
ALTER TABLE departments ADD (
CONSTRAINT dept_pk PRIMARY KEY (ID));
CREATE SEQUENCE dept_seq;
Создайте триггер, чтобы заполнить столбец ID, если он не задан при вставке записи.
CREATE OR REPLACE TRIGGER dept_bir
BEFORE INSERT ON departments
FOR EACH ROW
WHEN (new.id IS NULL)
BEGIN
SELECT dept_seq.NEXTVAL
INTO :new.id
FROM dual;
END;
/
Протестируйте созданную функциональность.
SQL> INSERT INTO departments (description)
2 VALUES ('Development');
1 row created.
SQL> SELECT * FROM departments;
ID DESCRIPTION
---------- --------------------------------------------------
1 Development
1 row selected.
SQL> INSERT INTO departments (id, description)
2 VALUES (dept_seq.NEXTVAL, 'Accounting');
1 row created.
SQL> SELECT * FROM departments;
ID DESCRIPTION
---------- --------------------------------------------------
1 Development
2 Accounting
2 rows selected.
SQL>
Триггер может быть изменен, чтобы получить немного отличающиеся результаты. Если триггер вставки записи должен выполнить больше функциональности чем эта задача, вы можете захотеть сделать примерно следующее.
CREATE OR REPLACE TRIGGER dept_bir
BEFORE INSERT ON departments
FOR EACH ROW
BEGIN
SELECT NVL(:new.id, dept_seq.NEXTVAL)
INTO :new.id
FROM dual;
-- Do more processing here.
END;
/
Для перезаписи любого переданного значения, вы должны выполнить следующее:
CREATE OR REPLACE TRIGGER dept_bir
BEFORE INSERT ON departments
FOR EACH ROW
BEGIN
SELECT dept_seq.NEXTVAL
INTO :new.id
FROM dual;
END;
/
В случае возникновения ошибки, их можно обработать:
CREATE OR REPLACE TRIGGER dept_bir
BEFORE INSERT ON departments
FOR EACH ROW
BEGIN
IF :new.id IS NOT NULL THEN
RAISE_APPLICATION_ERROR(-20000, 'ID cannot be specified');
ELSE
SELECT dept_seq.NEXTVAL
INTO :new.id
FROM dual;
END IF;
END;
/







jAntivirus
 


Продажа авто в Новошахтинске: Сландо . Продажа домов в Батайске: дать бесплатное объявление без регистрации . Slando - частные объявления Щёлкова