Используя MyGeneration, doodads и Oracle XE, возможно ли реализовать схему "первичный ключ с автоматическим номером"?
Используя MyGeneration, doodads и Oracle XE, возможно ли реализовать схему "первичный ключ с автоматическим номером"?
Факты проблемы: я использую Oracle XE. Я реализовал следующую таблицу и триггер:
CREATE TABLE "USERS"
(
"ID" NUMBER(38,0),
"USER_NAME" VARCHAR2(50),
"PASSWORD" VARCHAR2(50),
"EMAIL" VARCHAR2(100),
CONSTRAINT "USERS_PK" PRIMARY KEY ("ID") ENABLE
)
/
CREATE OR REPLACE TRIGGER "BI_USERS"
before insert on "USERS"
for each row
begin
select "USERS_SEQ".nextval into :NEW.ID from dual;
end;
/
ALTER TRIGGER "BI_USERS" ENABLE
/
MyGeneration / Doodads создал следующий хранимый процесс...
CREATE OR REPLACE PROCEDURE "XXX"."PI_USERS"
(
p_ID IN USERS.ID%type,
p_USER_NAME IN USERS.USER_NAME%type,
p_PASSWORD IN USERS.PASSWORD%type,
p_EMAIL IN USERS.EMAIL%type
)
IS
BEGIN
INSERT
INTO USERS
(
ID,
USER_NAME,
PASSWORD,
EMAIL
)
VALUES
(
p_ID,
p_USER_NAME,
p_PASSWORD,
p_EMAIL
);
END PI_USERS;
Комбинация последовательности и триггера работает нормально. Класс BusinessEntity в C# не получает новый идентификатор.
Любые рекомендуемые способы, позволяющие вызывающему коду получить новый идентификатор записи?
2 ответа
Я не использовал Doodads, поэтому не уверен, что это именно то, что он ожидает, но если вы измените процедуру, как показано ниже, используя returning
предложение и сделать параметр p_ID in out
Параметр p_ID должен содержать вновь добавленный идентификатор после его выполнения.
CREATE OR REPLACE PROCEDURE "XXX"."PI_USERS"
(
p_ID IN OUT USERS.ID%type,
p_USER_NAME IN USERS.USER_NAME%type,
p_PASSWORD IN USERS.PASSWORD%type,
p_EMAIL IN USERS.EMAIL%type
)
IS
BEGIN
INSERT
INTO USERS
(
ID,
USER_NAME,
PASSWORD,
EMAIL
)
VALUES
(
p_ID,
p_USER_NAME,
p_PASSWORD,
p_EMAIL
)
RETURNING ID INTO p_ID;
END PI_USERS;
Почему бы не использовать последовательность? Если вы предпочитаете использовать TAPI, я по-прежнему считаю, что столбцы ID и ВОЗ лучше всего указывать в триггере последовательности. Является ли проблемой необходимость в чистой, плотной последовательности, где нет пропущенных чисел?