Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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]



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.01 c
15-1149209179
Коды
2006-06-02 04:46
2006.06.25
Зачем Linux сделали несовместимым с программами под Виндос?


3-1145970480
Untermensch
2006-04-25 17:08
2006.06.25
TSQLDataSet (DBExpress) ругается на поля типа timestamp


6-1139695044
Yeg
2006-02-12 00:57
2006.06.25
Изменения в ICQ-протоколе...


15-1149152342
ПЛОВ
2006-06-01 12:59
2006.06.25
Как такое сделать то?


2-1149447737
Ray
2006-06-04 23:02
2006.06.25
свернуть модальную форму





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский