Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SELECT после INSERT [D7]


Страницы:   1 2 3

Ильичев С.А. ©   (2006-04-27 11:07:00) 

Как из TADOQuery выполнить подобный скриптик ?

 INSERT INTO TZones (ID, Name, Description) VALUES ((SELECT NewZoneNum FROM dual), 'qwe', NULL);
 SELECT MAX(ID) FROM Tzones;


Ругается - Invalid character


ANB   (2006-05-02 13:25:00) [1]


> Сомневаюсь, что с селективным запросом это прокатит. Т.е.
>  выполнится то он выполнится, но вот прочитать занные потом
> - врядли.

Он и не просит читать - ему выполнить надо. Ессно, набор данных из блока не вытащить. Если блок вообще съест просто оператор запроса.


Sergey13   (2006-05-02 09:54:00) [2]

2[43] ANB ©   (02.05.06 09:30)
> Вариант 2 - засунуть их в PL/SQL блок, тогда это будет 1 запрос.
Сомневаюсь, что с селективным запросом это прокатит. Т.е. выполнится то он выполнится, но вот прочитать занные потом - врядли.


ANB   (2006-05-02 09:30:00) [3]


> Ильичев С.А. ©   (28.04.06 17:47) [41]

Выполнить их по отдельности. Это не MS SQL.
Вариант 2 - засунуть их в PL/SQL блок, тогда это будет 1 запрос.


sniknik   (2006-04-28 18:11:00) [4]

> А в том как выполнить один запрос из двух стейтментов. Скрипт.
а тебе уже ответили, подключись к провайдеру движок которого позволяет подрбный синтаксис, см [2], если цель только в этом.


Ильичев С.А.   (2006-04-28 17:47:00) [5]

2 ANB
То есть вопрос не в том как выполнить два запроса.
А в том как выполнить один запрос из двух стейтментов. Скрипт.


Ильичев С.А.   (2006-04-28 17:43:00) [6]

2 ANB ©   (28.04.06 17:35) [38]
Сиквенс это заместо генератора в IB получается.

Не в этом проблема. См. [0]


ANB   (2006-04-28 17:37:00) [7]


>            with Q.Parameters.ParamByName('ID_') do
>            begin
>              DataType := ftInteger;
>              Size     := SizeOf(Integer);
>              Value    := -1;
>            end;

Это все лишнее.


ANB   (2006-04-28 17:35:00) [8]


> Что значит вызвать заранее. Отдельным запросом? Непойдет.

1. Почему ?
2. Убил бы за такую функцию.

Используй сиквенс для генерации нового ID.

max(ID) + 1 может привести к проблемам при сетевой работе.

ЗЫ. Купи книжку по ораклу. И поставь DOA или ODAC.


Ильичев С.А.   (2006-04-28 17:35:00) [9]

2 Johnmen ©   (28.04.06 17:22) [35]

Пробовал я писать после присвоения

           with Q.Parameters.ParamByName('ID_') do
           begin
             DataType := ftInteger;
             Size     := SizeOf(Integer);
             Value    := -1;
           end;


не помогает


Ильичев С.А.   (2006-04-28 17:32:00) [10]

ANB ©   (28.04.06 17:09) [33]


CREATE OR REPLACE FUNCTION NewZoneNum RETURN int
AS
 Res int;
BEGIN
 SELECT MAX(ID) + 1 INTO Res FROM TZones;
 IF Res is Null THEN
   SELECT 1 INTO Res FROM dual;
 END IF;
 RETURN Res;
END NewZoneNum;


Что значит вызвать заранее. Отдельным запросом? Непойдет.

С параметрами что-то не совсем понятно. Вернее всё понятно, но не работает.
Попробовал с MSSQL2000 :
'SELECT 2 INTO :ID_'
получаю ошибку: incorrect syntax near @P1


Johnmen   (2006-04-28 17:22:00) [11]

и в догонку - обновление текста запроса автоматом приводит к очистке коллекции параметров и созданию новой...


ANB   (2006-04-28 17:10:00) [12]

Да, в дополнение, DML запросы, не возвращающие набор данных, нужно выполнять через ExecSQL


ANB   (2006-04-28 17:09:00) [13]


> Ильичев С.А. ©   (28.04.06 15:41) [31]

Текс. Усе с вами понятно.
Сиквенс - это генератор последовательно (условно) чисел возрастающих чисел. Используется для генерации новых ID.

Кстати, кто сказал, что оракл сам умеет выполнять скрипты ?
Все компоненты и программы, которые это умеют, пилят скрипт на кусочки и кусочками его выполняют. Включая SQLPlus.

Теперь автору - чего делать.
1. Вопрос - кто или что присваивает новый ID в таблице при инсерте, если ты не писал на это триггер ?
2. Вот этим запросом (точнее командой DML) ты пытаешься вставит строку,
но при этом сам ЯВНО ПРИСВАИВАЕШЬ ID !!!
INSERT INTO TZones ( ID , Name, Description) VALUES ( NewZoneNum , NULL, NULL)
Причем пытаешься его присвоить из неизвестного для оракла поля NewZoneNum.
Если же эта функция описана - кто мешает вызвать ее заранее :
select NewZoneNum() NewID from dual,
прочитать его и явно передать в запрос в качестве параметра :
INSERT INTO TZones ( ID , Name, Description) VALUES ( :NewID , NULL, NULL)

Как присвоить параметр :
ADOQuery1.Parameters.ParamByName('NewID').AsInteger;

Если уж тебе позарез нужно сделать RETURNING, нужно параметру, в который ты чего то вертаешь, присвоить тип pdOutput;
ADOQuery1.Parameters.ParamByName('ID').Direction := pdOutput;
Но имеет это смысл, только если ID генерится триггером.


Sergey13   (2006-04-28 15:45:00) [14]

2[31] Ильичев С.А. ©   (28.04.06 15:41)
>значит что дальше этой строки не идёт
А куда должен идти то? Вставь хоть ShowMessаge что ли в конце.


Ильичев С.А.   (2006-04-28 15:41:00) [15]

значит что дальше этой строки не идёт
и ресурсы не ест
просто ничего не происходит


Sergey13   (2006-04-28 15:32:00) [16]

2[29] Ильичев С.А. ©   (28.04.06 15:26)
>3.
>На ExecSQL: Виснет и молчит
Что значит виснет и молчит? Она и не должна тут ничего говорить. Ты выполнил запрос и все. В PL/SQL Developer работает же.


Ильичев С.А.   (2006-04-28 15:26:00) [17]


procedure TForm1.Button1Click(Sender: TObject);
var
 Q: TADOQuery;
begin
 ADOConnection1.Open();

 Q:=TADOQuery.Create(Application);
 Q.Connection := ADOConnection1;
 
 Q.Parameters.CreateParameter('ID_', ftInteger, pdOutput, SizeOf(Integer), -1);
 Q.SQL.Text :=
{  // 1
 'INSERT INTO TZones (ID, Name, Description) VALUES (NewZoneNum, NULL, NULL) RETURNING ID INTO :ID_;';
}

{  // 2
 'BEGIN ' +
 'INSERT INTO TZones (ID, Name, Description) VALUES (NewZoneNum, NULL, NULL) RETURNING ID INTO :ID_; ' +
 'END; ';
}

{  // 3
 'INSERT INTO TZones (ID, Name, Description) VALUES (NewZoneNum, NULL, NULL) RETURNING ID INTO :ID_';
}

//  Q.ExecSQL;
//  Q.Open;
end;


1.
На Open:      ORA-00911 : Invalid Character
На ExecSQL: ORA-00911 : Invalid Character

2.
На Open:      Виснет и молчит
На ExecSQL: Виснет и молчит

3.
На Open:      ORA-00933 : SQL command not properly ended
На ExecSQL: Виснет и молчит


Sergey13   (2006-04-28 14:52:00) [18]

2[27] Ильичев С.А. ©   (28.04.06 14:49)
Давай полный код этого куска. С описанием где возникает ошибка.
Я с АДО не работал, но, думаю, ты ошибся где то.


Ильичев С.А.   (2006-04-28 14:49:00) [19]

2 Sergey13 ©   (28.04.06 14:46) [25]

Да я уже во всех вариациях перепробовал
и с ExecSQL и с Open


Ильичев С.А.   (2006-04-28 14:47:00) [20]

2  [24]

Ошибся я.

Если заключть в BEGIN ... END;  то ничего не говорит
Виснет намертво, загрузка проца 0% у меня. Что там на серве не знаю.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо