Форум: "Базы";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
ВнизSELECT после INSERT Найти похожие ветки
← →
Ильичев С.А. © (2006-04-27 11:07) [0]Как из TADOQuery выполнить подобный скриптик ?
INSERT INTO TZones (ID, Name, Description) VALUES ((SELECT NewZoneNum FROM dual), "qwe", NULL);
SELECT MAX(ID) FROM Tzones;
Ругается - Invalid character
← →
Ильичев С.А. © (2006-04-27 11:08) [1]Если вторую строку убрать, то работает.
← →
sniknik © (2006-04-27 11:14) [2]> Как из TADOQuery выполнить подобный скриптик ?
подключится к провайдеру который позволяет движок которого это позволяет.
← →
Sergey13 © (2006-04-27 11:18) [3]INSERT INTO TZones (ID, Name, Description) VALUES (NewZoneNum, "qwe", NULL) RETURNING ID INTO :ID;
← →
Ильичев С.А. © (2006-04-27 11:19) [4]Позволяет что?
Мне надо после инсёрта сделать селект
и всё
← →
Johnmen © (2006-04-27 11:26) [5]
> Ильичев С.А. © (27.04.06 11:19) [4]
> Мне надо после инсёрта сделать селект
> и всё
А тебя не смущает некоторая бредовость того, что ты пытаешься сделать в [0]? Имею в виду бредовость по сути...
← →
Ильичев С.А. © (2006-04-27 11:28) [6]2 Sergey13 © (27.04.06 11:18) [3]
not all variables bound
← →
Ильичев С.А. © (2006-04-27 11:29) [7]2 Johnmen © (27.04.06 11:26) [5]
не переводите тему пожалуйста
смущает, но вопрос остаётся актуальным
← →
Sergey13 © (2006-04-27 11:32) [8]2[6] Ильичев С.А. © (27.04.06 11:28)
Ну дык объяви переменную! Кто мешает то?
← →
Ильичев С.А. © (2006-04-27 16:18) [9]2 Sergey13 © (27.04.06 11:32) [8]
это даст мне РекордСет на выходе ?
← →
Sergey13 © (2006-04-27 16:22) [10]2 [9] Ильичев С.А. © (27.04.06 16:18)
>это даст мне РекордСет на выходе ?
Почему? После выполнения запроса из переменной :ID можно будет прочитать значение вставленного ID. Попробовать то трудно что-ли?
← →
Ильичев С.А. © (2006-04-27 16:48) [11]Так мне надо рекордсет
Вот смотрю в хелпе прмер
DELETE FROM emp
WHERE job = "SALESMAN" AND COMM < 100
RETURNING sal INTO :1;
скажите пожалуйста что такое :1 и как с ним работать
← →
Sergey13 © (2006-04-27 16:57) [12]2[11] Ильичев С.А. © (27.04.06 16:48)
>Так мне надо рекордсет
Это какой же рекордсет ты получаешь запросом
SELECT MAX(ID) FROM Tzones;
?
>скажите пожалуйста что такое :1 и как с ним работать
Это переменная
← →
ANB © (2006-04-27 17:54) [13]
> SELECT MAX(ID) FROM Tzones;
1. Оракл не умеет выполнять скрипты. Все компоненты, которые умеют это делать - сами пилят их на куски
2. За SELECT MAX(ID) FROM Tzones; в оракле нужно отрывать руки
3. Никто не мешает тебе сначала получить ID из сивенса, а потом вставлять его в таблицу. Автоинкрементальных полей у оракла нету.
4. Если уж написал триггер для генерации ID-шников, то не знать про параметры стыдно.
5. Совет - оракл + ADO - не лучшая связка. Поищи компоненты прямого доступа. Но выходные параметры поддерживает и ADO.
← →
Val © (2006-04-27 18:00) [14]1. Оракл не умеет выполнять скрипты.
фи на вас:)
← →
Ильичев С.А. © (2006-04-27 18:17) [15]2 ANB © (27.04.06 17:54) [13]
оно может все так, но видители ли не я ставлю условия на чем
писать, какие компоненты использовать и какую СУБД...
Партия сказала "надо" - комсомол ответил "есть".
Опишите пожалуйста приемлемую схему.
Если ясно чего мне надо.
и что есть "сивенс" ?
2 Sergey13 © (27.04.06 16:57) [12]
Самый обычный РекордСет я получаю
← →
Vlad © (2006-04-27 18:17) [16]
> Ильичев С.А. © (27.04.06 11:07)
вобще такие выражения в Оракле пишутся
begin
<скрипт>
end
Не знаю, проглотит ли ADO такое
← →
Val © (2006-04-27 18:40) [17]>[15] Ильичев С.А. © (27.04.06 18:17)
с каких пор агрегаты возвращают рекордсеты?
← →
Ильичев С.А. © (2006-04-27 19:08) [18]>> с каких пор агрегаты возвращают рекордсеты?
Сколько себя помню.
← →
Sergey13 © (2006-04-28 09:13) [19]2[18] Ильичев С.А. © (27.04.06 19:08)
Тебе вообще что надо? Вернуть новый ИД? Или тебе надо обязательно вернуть рекордсет с одним полем в одной записи со значением вставленного ИД? Тебе не кажется, что это те-же яйца, но вид с боку?
← →
Ильичев С.А. © (2006-04-28 09:22) [20]2 Sergey13 © (28.04.06 09:13) [19]
Очень желательно второе.
Если нет, то мона и первое. Но я не знаю как.
Есть такая софтина PL/SQL Developer.
ПишуINSERT INTO TZones (ID, Name, Description) VALUES (NewZoneNum, "qwe", NULL) RETURNING ID INTO :ID;
:ID - это получаетя некая переменная. Как её объявить.
Иль забиндить надо он говорит.
Как?
← →
Sergey13 © (2006-04-28 09:44) [21]2[20] Ильичев С.А. © (28.04.06 09:22)
>Есть такая софтина PL/SQL Developer.
>Пишу
Где пишешь? В окне SQL Window или Test Window? Во втором можно объявить переменную (на нижнем гриде переменных правой кнопкой и Scan Variables, подправить тип) и посмотреть ее значение.
← →
Ильичев С.А. © (2006-04-28 13:40) [22]Так.
В PL/SQL Developer работает.
В делфе наOpen
ругается ORA-00933. SQL command not properly ended
Делаю :
else begin
Q.Parameters.CreateParameter("ID_", ftInteger, pdOutput, SizeOf(Integer), -1);
Q.SQL.Text :=
"INSERT INTO TZones (ID, Name, Description) VALUES (NewZoneNum, NULL, NULL) RETURNING ID INTO :ID_";
end;
try
q.Open;
← →
Sergey13 © (2006-04-28 13:43) [23]2[22] Ильичев С.А. © (28.04.06 13:40)
> q.Open;
На Insert?
← →
Ильичев С.А. © (2006-04-28 14:33) [24]Да.
Если поставить в конце ; говорит инвалид чарактер
Если заключть в BEGIN ... END говорит инвалид SQL стейтмент
← →
Sergey13 © (2006-04-28 14:46) [25]2[24] Ильичев С.А. © (28.04.06 14:33)
К запросам типа Insert, Update, Delete метод Open не применим. Для них есть ExecSQL или нечто похожее. Open только для Select.
← →
Ильичев С.А. © (2006-04-28 14:47) [26]2 [24]
Ошибся я.
Если заключть в BEGIN ... END; то ничего не говорит
Виснет намертво, загрузка проца 0% у меня. Что там на серве не знаю.
← →
Ильичев С.А. © (2006-04-28 14:49) [27]2 Sergey13 © (28.04.06 14:46) [25]
Да я уже во всех вариациях перепробовал
и с ExecSQL и с Open
← →
Sergey13 © (2006-04-28 14:52) [28]2[27] Ильичев С.А. © (28.04.06 14:49)
Давай полный код этого куска. С описанием где возникает ошибка.
Я с АДО не работал, но, думаю, ты ошибся где то.
← →
Ильичев С.А. © (2006-04-28 15:26) [29]
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 15:32) [30]2[29] Ильичев С.А. © (28.04.06 15:26)
>3.
>На ExecSQL: Виснет и молчит
Что значит виснет и молчит? Она и не должна тут ничего говорить. Ты выполнил запрос и все. В PL/SQL Developer работает же.
← →
Ильичев С.А. © (2006-04-28 15:41) [31]значит что дальше этой строки не идёт
и ресурсы не ест
просто ничего не происходит
← →
Sergey13 © (2006-04-28 15:45) [32]2[31] Ильичев С.А. © (28.04.06 15:41)
>значит что дальше этой строки не идёт
А куда должен идти то? Вставь хоть ShowMessаge что ли в конце.
← →
ANB © (2006-04-28 17:09) [33]
> Ильичев С.А. © (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 генерится триггером.
← →
ANB © (2006-04-28 17:10) [34]Да, в дополнение, DML запросы, не возвращающие набор данных, нужно выполнять через ExecSQL
← →
Johnmen © (2006-04-28 17:22) [35]и в догонку - обновление текста запроса автоматом приводит к очистке коллекции параметров и созданию новой...
← →
Ильичев С.А. © (2006-04-28 17:32) [36]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
← →
Ильичев С.А. © (2006-04-28 17:35) [37]2 Johnmen © (28.04.06 17:22) [35]
Пробовал я писать после присвоения
with Q.Parameters.ParamByName("ID_") do
begin
DataType := ftInteger;
Size := SizeOf(Integer);
Value := -1;
end;
не помогает
← →
ANB © (2006-04-28 17:35) [38]
> Что значит вызвать заранее. Отдельным запросом? Непойдет.
1. Почему ?
2. Убил бы за такую функцию.
Используй сиквенс для генерации нового ID.
max(ID) + 1 может привести к проблемам при сетевой работе.
ЗЫ. Купи книжку по ораклу. И поставь DOA или ODAC.
← →
ANB © (2006-04-28 17:37) [39]
> with Q.Parameters.ParamByName("ID_") do
> begin
> DataType := ftInteger;
> Size := SizeOf(Integer);
> Value := -1;
> end;
Это все лишнее.
← →
Ильичев С.А. © (2006-04-28 17:43) [40]2 ANB © (28.04.06 17:35) [38]
Сиквенс это заместо генератора в IB получается.
Не в этом проблема. См. [0]
← →
Ильичев С.А. © (2006-04-28 17:47) [41]2 ANB
То есть вопрос не в том как выполнить два запроса.
А в том как выполнить один запрос из двух стейтментов. Скрипт.
← →
sniknik © (2006-04-28 18:11) [42]> А в том как выполнить один запрос из двух стейтментов. Скрипт.
а тебе уже ответили, подключись к провайдеру движок которого позволяет подрбный синтаксис, см [2], если цель только в этом.
← →
ANB © (2006-05-02 09:30) [43]
> Ильичев С.А. © (28.04.06 17:47) [41]
Выполнить их по отдельности. Это не MS SQL.
Вариант 2 - засунуть их в PL/SQL блок, тогда это будет 1 запрос.
← →
Sergey13 © (2006-05-02 09:54) [44]2[43] ANB © (02.05.06 09:30)
> Вариант 2 - засунуть их в PL/SQL блок, тогда это будет 1 запрос.
Сомневаюсь, что с селективным запросом это прокатит. Т.е. выполнится то он выполнится, но вот прочитать занные потом - врядли.
← →
ANB © (2006-05-02 13:25) [45]
> Сомневаюсь, что с селективным запросом это прокатит. Т.е.
> выполнится то он выполнится, но вот прочитать занные потом
> - врядли.
Он и не просит читать - ему выполнить надо. Ессно, набор данных из блока не вытащить. Если блок вообще съест просто оператор запроса.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.009 c