2015-02-07 1 views
0

Я написал серию операторов SQL в базе данных ORACLE. В моей базе данных у меня есть 2 таблицы (книга, издатель).ORACLE SQL: добавление другого идентификатора из другой строки

Ниже представлена ​​структура таблицы

BOOK 
---------- 
bk_id | title | pub_id 

PUBLISHER 
---------- 
pub_id | pub_name 

Если вставить в таблицу издателя первой

INSERT INTO PUBLISHER (pub_name) VALUE ('ABC Publisher'); 

Как получить идентификатор издателя и ввести его в книге таблицы?

Обычно я делаю это с помощью хранимой процедуры (SQL Server) или выполняю ее в приложении.

Как это сделать в ORACLE в SQL?

ответ

0

С PL/SQL, вы можете использовать пункт RETURNING INTO, чтобы получить обратно вновь вставленный ID:

DECLARE 
    my_id int; 
BEGIN 
    INSERT INTO PUBLISHER (pub_name) VALUE ('ABC Publisher') 
     RETURNING id INTO my_id; 
    ... 
END; 

где my_id является/SQL переменной PL соответственно объявлен вашим типа столбца.

0

Просто используйте оператор выбора:

INSERT INTO BOOK VALUES 
(bk_id, title, (SELECT pub_id FROM PUBLISHER WHERE pub_name = publisher_name)) 
… 
; 

Заменить bk_id, название и PUBLISHER_NAME с соответствующими данными вы хотите.

+0

Это можно сделать в порядке? –

+0

Я бы предположил, хотя я никогда не использовал таких; просто дайте ему необходимые аргументы и пусть это заменит вас. –

+0

@PeterSun Да. Я использовал его много раз в своих сценариях PLSQL и хранимых процедурах. –

1

Я думаю, что самый простой способ состоял бы в создании Trigger, который вставлял бы в другой table после таблицы.

create or replace trigger tr_ai_publisher 
after insert on publisher 
for each row 
begin 
    --Here you can access the new publisher id using :new.pub_id 
end; 

Таким образом, вам не придется обращаться к процедуре.

Однако, если вы действительно хотите, вы можете также использовать хранимую процедуру в ORACLE, общий синтаксис

CREATE [OR REPLACE] PROCEDURE proc_name [list of parameters] 
IS  
    Declaration section 
BEGIN  
    Execution section 
EXCEPTION  
    Exception section 
END; 
+0

Почему нисходящий? –

+0

Я не дубликат, но, используя подзапрос, вы предполагаете, что 'pub_name' является (и всегда будет) уникальным ключом. Это не указано здесь. И в общем случае это может быть довольно опасное предположение (подумайте о имени сотрудника: вы можете легко получить повторяющиеся значения) –

+1

@SylvainLeroux Я полностью согласен, сначала прочитайте вопрос, чтобы просмотреть вопрос. –

Смежные вопросы