Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Вернуть в Delphi-процедуру значение полей после IN


Автор: Matrex 25.10.2011, 11:28
Доброго времени суток коллеги!

Подскажите можно ли вернуть в Delphi-процедуру значение полей после выполнения конструкции INSERT INTO для Oracle (необходимо получить значение идентификатора который будет сгенерирован триггером на стороне сервера при добавлении записи). Для работы с Oracle использую DOA.

Автор: LSD 25.10.2011, 11:34
Из триггера ничего вернуть нельзя. Тут или на клиенте получать значение сиквенса, или написать функцию которая будет делать INSERT и возвращать значение.

Автор: Matrex 25.10.2011, 11:42
Цитата(LSD @  25.10.2011,  11:34 Найти цитируемый пост)
Тут или на клиенте получать значение сиквенса


Сейчас я так и делаю. Это просто вопрос оптимизации. Хотелось часть работы переложить на сервер что бы меньше "гонять" данные по сетке... Думал, что может сервак на INSERT INTO отвечает типа "все ок. я добавил следующие данные ... ... ... ...". А получается что нет... 

Автор: DimW 25.10.2011, 13:06
Цитата(Matrex @  25.10.2011,  11:28 Найти цитируемый пост)
можно ли вернуть в Delphi-процедуру значение полей после выполнения конструкции INSERT INTO для Oracle


можно:

Код

procedure get_values(p_id out number, p_value out varchar2)
as
begin
  insert into table
    (id, value)
  values
    (seq.nextval, 'value1')
  returning id, value into p_id, p_value;
end;


Даже если значение из сиквенса берется в триггере, то returning все равно его вернет.
Вернее вернет не значение сиквенса, а значение которое содержит поле id.

Автор: LSD 25.10.2011, 13:57
Цитата(DimW @  25.10.2011,  14:06 Найти цитируемый пост)
можно:

Цитата(LSD @  25.10.2011,  12:34 Найти цитируемый пост)
или написать функцию которая будет делать INSERT и возвращать значение

Автор: Zloxa 25.10.2011, 15:37
чтобы использовать returning, вовсе не обязательно insert в функцию заворачивать. Он и без функции прекрасно работает  smile 

Автор: LSD 25.10.2011, 16:28
Цитата(Zloxa @  25.10.2011,  16:37 Найти цитируемый пост)
чтобы использовать returning, вовсе не обязательно insert в функцию заворачивать. Он и без функции прекрасно работает

Если верить документации:
user posted image
там требуется указание INTO. Что там надо указать если это не PL/SQL и как это получить в программе?

Автор: DimW 25.10.2011, 17:01
Цитата(LSD @  25.10.2011,  16:28 Найти цитируемый пост)
Что там надо указать если это не PL/SQL и как это получить в программе? 

анонимный блок:

Код

begin
  insert into table
    (id, value)
  values
    (seq.nextval, 'value1')
  returning id, value into :p_id, :p_value;
end;


ЗЫ. "без функции" - это не значит без PL/SQL.

Автор: LSD 25.10.2011, 17:33
Цитата(DimW @  25.10.2011,  18:01 Найти цитируемый пост)
ЗЫ. "без функции" - это не значит без PL/SQL.

1.
Цитата(LSD @  25.10.2011,  17:28 Найти цитируемый пост)
как это получить в программе?

2. Каждый раз компилировать анонимный PL/SQL блок, это явно плохая оптимизация.

Автор: Zloxa 25.10.2011, 20:44
Цитата(LSD @  25.10.2011,  16:28 Найти цитируемый пост)
 Что там надо указать если это не PL/SQL...? 

Бинд же!
Код

SQL> create table hello (id number);
 
Table created
SQL> var result number;
SQL> insert into hello values (dbms_random.value) returning id into :result;
 
1 row inserted
result
---------
0.982520208181514

Автор: Zloxa 25.10.2011, 21:05
Цитата(LSD @  25.10.2011,  17:33 Найти цитируемый пост)
2. Каждый раз компилировать анонимный PL/SQL блок, это явно плохая оптимизация. 

Откуда, кстати, дровишки что прям таки "каждый раз"?

Код

SQL> begin
  2    -- LSD рулит!!!
  3    null;
  4  end;
  5  /
 
PL/SQL procedure successfully completed
SQL> select rownum, t.sql_text from v$sqlarea t where t.sql_text like '%-- LSD рулит!!!%';
 
    ROWNUM SQL_TEXT
---------- --------------------------------------------------------------------------------
         1  select rownum, t.sql_text from v$sqlarea t where t.sql_text like '%-- LSD рулит
         2  begin   -- LSD рулит!!!   null; end;
 
SQL> 

Цитата

http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_2129.htm lists statistics on shared SQL area and contains one row per SQL string. It provides statistics on SQL statements that are in memory, parsed, and ready for execution.

Автор: LSD 26.10.2011, 12:12
Цитата(Zloxa @  25.10.2011,  21:44 Найти цитируемый пост)
Бинд же!

Этот ваш SQL Plus не показатель smile 
Я так и не смог из Java выполнить SELECT INTO, и у меня есть сильная уверенность, что без использования OCI это не провернуть.

Автор: Zloxa 26.10.2011, 13:23
Цитата(LSD @  26.10.2011,  12:12 Найти цитируемый пост)
 SELECT INTO

select into, в отличии от returning это чисто pl/slq-ная фишка.
Цитата(LSD @  26.10.2011,  12:12 Найти цитируемый пост)
без использования OCI 

Озвученный ТС DOA использует OCI
Цитата(LSD @  26.10.2011,  12:12 Найти цитируемый пост)
Этот ваш SQL Plus не показатель

Не, мы конечно держим в уме, что в этой вашей Жаве все намного хуже чем в Делфи, но неужели же настолько  smile 

Автор: LSD 26.10.2011, 14:27
Цитата(Zloxa @  26.10.2011,  14:23 Найти цитируемый пост)
select into, в отличии от returning это чисто pl/slq-ная фишка.

returning тоже не работает, ошибку не выбрасывает, но возвращает фигню.


Цитата(Zloxa @  26.10.2011,  14:23 Найти цитируемый пост)
Не, мы конечно держим в уме, что в этой вашей Жаве все намного хуже чем в Делфи, но неужели же настолько

Но при это упускаете из виду, что драйвер пишет Oracle.

Автор: Zloxa 26.10.2011, 14:34
Цитата(LSD @  26.10.2011,  14:27 Найти цитируемый пост)
returning тоже не работает, ошибку не выбрасывает, но возвращает фигню.

Да, я тоже попробовал. Действительно ситуация весьма и весьма уныла. Но анонмный pl/sql блок как воркэраунд - вполне  себе канает.

Цитата(LSD @  26.10.2011,  14:27 Найти цитируемый пост)
Но при это упускаете из виду, что драйвер пишет Oracle. 

Если уж на то пошло, то и Жава уже давно Оракл, неужели только лишь от этого печали должно бы стать меньше?

Автор: LSD 26.10.2011, 15:00
Цитата(Zloxa @  26.10.2011,  15:34 Найти цитируемый пост)
Если уж на то пошло, то и Жава уже давно Оракл, неужели только лишь от этого печали должно бы стать меньше?

Ты прав, все что пишет Оракл - УГ smile Одна надежда, на Эмбаркадеку smile

Автор: Zloxa 26.10.2011, 15:04
Цитата(LSD @  26.10.2011,  15:00 Найти цитируемый пост)
надежда

Эхххх, завиюую я тебе, LSD, по доброму. Ты таки еще молод духом, у тебя еще есть чем питать надежды.....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)