Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Вниз

Как найти запись и изменить   Найти похожие ветки 

 
SamProf ©   (2006-06-04 10:22) [0]

Вопрос по суте не по Delphi, а по SQL. Пишу в InterBase.
Суть вопроса в следующем:
Есть таблица:
ID - число
Name : чторка
Data1, Data2: Даты
Я хочу создать хранимую процедудуру, с входящими параметрами:
aname- строка
adata1,adata2 - даты
и выходящим: aid - число
эта процедура ищет в таблице запись, в уоторой name= :anameесли такая запись существует, то она изменяет только data2=:adata2, а остальные поля не трогает
Если такой записи нет, то она добавляет запись с
i = GEN_ID(GEN_NEW_TABLE_ID, 1);
INSERT INTO Flist VALUES (:i,:aname, :adata1, :adata2);
Не зависимо от того нашлась ли запись или нет нужно вернуть Id в aid.
Спасибо! Уж извините, если вопрос глупый....


 
unknown ©   (2006-06-04 12:21) [1]

CREATE PROCEDURE SAMPROF_PROCEDURE (
   ANAME VARCHAR(100),
   ADATA1 DATE,
   ADATA2 DATE)
RETURNS (
   AID INTEGER)
AS
begin
select max(ID) from Flist where name= :aname into :AID;
if (not AID is null) then
  update Flist set data2=:adata2 where ID=:AID;
else
 begin
   AID=Gen_ID(GEN_NEW_TABLE_ID, 1);
   INSERT INTO Flist VALUES (:AID,:aname, :adata1, :adata2);
 end
suspend;
end


 
Johnmen ©   (2006-06-04 14:38) [2]


> unknown ©   (04.06.06 12:21) [1]


Чушь какая-то...:)


> SamProf ©


SELECT ID FROM Table WHERE  name=:aname INTO :i;
...

>запись, в уоторой name= :anameесли такая запись существует,

А если таких записей >1 ?


 
SamProf ©   (2006-06-04 14:44) [3]

Спасибо! Я не особенно щарю в ключах....
Просто у меня возник вопрос, а как можно это дело убыстрить? может задать какойто ключ... и какой?


 
SamProf ©   (2006-06-04 14:45) [4]

Таковых записей 1!
И она полюбому уникальна!


 
unknown ©   (2006-06-04 15:03) [5]


> Johnmen ©   (04.06.06 14:38) [2]
> Чушь какая-то...:)

Это почему это вдруг чушь???
Автор же великим и могучим языком написАл:
> Я хочу создать хранимую процедудуру, с входящими параметрами...
> эта процедура ищет в таблице запись, в уоторой name= :anameесли
> такая запись существует, то она изменяет только data2=:adata2,
>  а остальные поля не трогает
> Если такой записи нет, то она добавляет запись...
> Не зависимо от того нашлась ли запись или нет нужно вернуть Id в aid.

Каков вопрос - таков и ответ.

> SamProf ©   (04.06.06 14:44) [3]
> SamProf ©   (04.06.06 14:45) [4]

Уникальный индекс надо на поле name


 
SamProf ©   (2006-06-04 15:29) [6]


> Уникальный индекс надо на поле name

Извини за бредовый вопрос!
Primary key
или Uniques key
Просто в IB Expert это разные вкладки.....


 
unknown ©   (2006-06-04 15:33) [7]


> SamProf ©   (04.06.06 15:29) [6]

unique


 
atruhin ©   (2006-06-04 15:38) [8]


>  [7] unknown ©   (04.06.06 15:33)
>unique

Да вы что? ID обычно и по условиям задачи - primary key, а unique он будет автоматически.


 
unknown ©   (2006-06-04 16:21) [9]


> atruhin ©   (04.06.06 15:38) [8]

:) См. [5]
> Уникальный индекс надо на поле name
На ID, насколько я понимаю, у автора и так pk.


 
atruhin ©   (2006-06-05 17:50) [10]


>  [9] unknown ©   (04.06.06 16:21)

Сорри. Ошибся.


 
PEAKTOP ©   (2006-06-05 21:14) [11]

я бы сделал так ....
-----------------------------------
CREATE PROCEDURE SAMPROF_PROCEDURE (
  ANAME VARCHAR(100),
  ADATA1 TIMESTAMP,
  ADATA2 TIMESTAMP
)RETURNS(
  AID INTEGER
)
AS
BEGIN
 IF(EXISTS(SELECT TBB.ID FROM Flist TBB WHERE (TBB.NAME = :aNAME)))THEN
   SELECT FIRST 1 TB.ID FROM Flist TB WHERE (TB.NAME = :aNAME) INTO :aID;
 ELSE
  BEGIN
  INSERT INTO Flist (ID, NAME, DATE1, DATE2) VALUES (:AID,:aname, :adata1, :adata2);
  SELECT FIRST MAX(TBL.ID) FROM Flist TBL INTO :aID;
  END

 SUSPEND;
END
-------------------------------------
а на таблицу Flist навешал бы классический триггер
CREATE TRIGGER TRIG_FLIST_BI_000 FOR Flist
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
 NEW.ID = GEN_ID( SOME_GENERATOR, 1);
END


 
Кщд ©   (2006-06-06 07:44) [12]

PEAKTOP ©   (05.06.06 21:14) [11]
  INSERT INTO Flist (ID, NAME, DATE1, DATE2) VALUES (:AID,:aname, :adata1, :adata2);
 SELECT FIRST MAX(TBL.ID) FROM Flist TBL INTO :aID;

гарантированно ли вернется ID именно этой вставки?



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

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

Наверх





Память: 0.47 MB
Время: 0.041 c
15-1153130774
QuickFinder
2006-07-17 14:06
2006.08.13
Слово о МЯСЕ


2-1153526166
learner
2006-07-22 03:56
2006.08.13
WNetEnumResource и размер буфера


2-1153744558
UMU
2006-07-24 16:35
2006.08.13
Значение "Edit.Text" в отчете "FastReports"


3-1149323064
АНОНИМ
2006-06-03 12:24
2006.08.13
Закрыть базу Access


1-1151650514
Footballer
2006-06-30 10:55
2006.08.13
Перетаскивание строк в Listbox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский