![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SELECT после INSERT [D7]
Ильичев С.А. © (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% у меня. Что там на серве не знаю.