Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.13;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.063 c
6-1143521276
balepa
2006-03-28 08:47
2006.08.13
TcpServer(Client)


15-1153122414
Ega23
2006-07-17 11:46
2006.08.13
Чуть не умер со смеху


15-1153149555
HeadHunter
2006-07-17 19:19
2006.08.13
Qulix Systems (BelHard) приглашает на работу программистов


2-1153730953
koha
2006-07-24 12:49
2006.08.13
Помогите вывести AVI на форму


3-1149400043
VitGun
2006-06-04 09:47
2006.08.13
Выборка по неполному значению