Это все зависит, что вы имеете в виду под «генерации ID». Идентификатор - я предполагаю первичный ключ, поэтому его значение должно быть уникальным независимо от ТИПА. Итак, какие правила вы хотите применить к своему поколению?
Вот примерный подход. Это использует последовательность для получения значения и добавляет символ, в зависимости от type
.
SQL> create or replace function generator
2 (p_type varchar2
3 , p_name in inserthere.name%type)
4 return inserthere.generate_id%type
5 is
6 c char(1);
7 return_value inserthere.generate_id%type;
8 begin
9 case p_type
10 when 'EXTREME' then
11 c := 'X';
12 when 'REGULAR' then
13 c := 'R';
14 when 'JUMBO' then
15 c := 'J';
16 else
17 c := 'P';
18 end case;
19
20 insert into inserthere
21 (generate_id,
22 name)
23 values
24 (c || lpad(trim(to_char(my_seq.nextval)), 9, '0')
25 , p_name)
26 returning generate_id into return_value;
27
28 return return_value;
29 end;
30/
Function created.
SQL>
здесь в действии
SQL> var n varchar2(10)
SQL> exec :n := generator ('EXTREME', 'ABC')
PL/SQL procedure successfully completed.
SQL> print n
N
--------------------------------
X000000001
SQL> exec :n := generator ('WHATEVER', 'SOMETHING')
PL/SQL procedure successfully completed.
SQL> print n
N
--------------------------------
P000000002
SQL>
Вы можете изменять точную реализацию, в зависимости от того, как вы хотите назвать это. Как это часто бывает, подробные сведения и дополнительная информация будут иметь тенденцию приводить к более релевантному ответу.
Благодарим вас за подробный ответ. Это мне очень помогло. Но я думал об использовании триггера. Потому что я должен сделать две вещи: сначала мне нужно сгенерировать идентификатор перед вставкой в таблицу. второй я должен обновить другую таблицу после вставки в таблицу InsertHere. Но проблема в том, как я могу передать параметр для запуска ...? или есть другой способ? – FlintOff