Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Способы подсчёта строк(какие есть), Oracle 9i 
:(
    Опции темы
NetShadow
Дата 12.3.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



Собственно сабж такой, есть какие-то ещё способы подсчёта строк в Oracle, я знаю rownum и count(), а есть другие, в delphi DBGrid выводится результат запроса, туда можно добавлять строки, но их не должно быть больше 6-ти, если шесть то запрещать insert... smile 
PM MAIL ICQ   Вверх
LSD
Дата 13.3.2007, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Если тебе нужно запрещать insert более шести записей в таблицу, то без блокировок этой таблицы, на уровне сервера, не обойтись.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Sqlninja
Дата 13.3.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

Репутация: 13
Всего: 13



Я так понял, что речь идет о контроле поведения визуального компонента. Тогда это лучше сделать средствами самого Delphi. Даже если это после коммита происходит, лучше не гонять туда-сюда сетевой трафик, а считать какое нибудь клиентское свойство типа Dataset.Rowcount.


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
NetShadow
Дата 13.3.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



спасибо всем кто пытался помочь, проблема была решена добавлением кода к триггеру на событие before update, insert...код примерно такой: 
Код

begin
 select count(*) into numrows from table t, table1 t1
 where t.index=t1.index1;
   if numrows=6 then
     Class_Message('Ошибка, не возможно добавить более 6 параметров');
   endif; 
end;
 
PM MAIL ICQ   Вверх
LSD
Дата 13.3.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Это не сработает, если вставка будет идти из разных сессий.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Тиль
Дата 14.3.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



Триггре на insert  в таблицу не пробовал?
--------------------
Казалось нам пипец, оказалось что не казалось
PM MAIL   Вверх
DimW
Дата 14.3.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(Тиль @  14.3.2007,  10:18 Найти цитируемый пост)
Триггре на insert  в таблицу не пробовал?


Цитата(NetShadow @  13.3.2007,  20:28 Найти цитируемый пост)
проблема была решена добавлением кода к триггеру на событие before update, insert...

но это не подходит для многосессионной рабыты с таблицами.
о чем и говорил LSD.

Цитата(LSD @  13.3.2007,  22:27 Найти цитируемый пост)
Это не сработает, если вставка будет идти из разных сессий.


красивого решения пока нет, но кое что накидал.
изврат №1(организовать вставку позиций в таблицу припомоши процедуры):
Код

declare 
  cursor c1 is 
    select id 
       from hr_emp
     for update nowait;
  n number:=0;
begin
  for i in c1 
  loop 
    n := n + 1; 
  end loop;
  if n = 6 then
    raise_application_error(-20000, 'не больше 6-ти записей в татлицу....');
  else
   insert ...     
  end if;
end;

вобщем это не процедура, но идея понятна (for update nowait)...
единственное что меня смущает в этом решении так это пробежка по курсору для подсчета количества позиций.

изврат №2:
если первичный ключ организован по сиквенсу то можно задать сиквенсу мин. и макс. значение нужного диапазона в нашем случае от 1..6. тогда при следеющем sq.nextval будет вываливаться ошибка о том что нельзя получить следеющее значение сиквенса, которую можно отловить и по русски сказать юзеру что он не прав...
этот способ мне нравиться больше, но я не знаю есть ли потенциальные баги в этом способе, за иключением одного - если какой нить моньяк не увеличит макс. значение сиквенса.

над третьим извратом пока думаю, так сказать изучаю возможности dbms_lock ...

Это сообщение отредактировал(а) DimW - 14.3.2007, 11:37
PM MAIL ICQ   Вверх
LSD
Дата 14.3.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



А как во втором способе обработать удаление строк?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
DimW
Дата 14.3.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(LSD @  14.3.2007,  12:42 Найти цитируемый пост)
А как во втором способе обработать удаление строк? 


а ни как  smile (если конечно не запретить удаление на клиенте...)
второй способ на свалку...

Это сообщение отредактировал(а) DimW - 14.3.2007, 12:55
PM MAIL ICQ   Вверх
DimW
Дата 14.3.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



вобщем начитался про dbms_lock и вот что получилось:
создадим табличку для проверки.

Код

create table TEST_01
(
  NAME NUMBER
)
/

убедимся что у нас есть привилегия EXECUTE на пакет DBMS_LOCK. И тестим.

Код

declare 
  n number := 0;
begin
  if (dbms_lock.request(id => 1, -- это идентификатор блока, может быть произвольным, но должен соответствовать типу integer
                        lockmode => dbms_lock.x_mode,
                        timeout => 0,
                        release_on_commit => true) = 1) then
    -- если блок стоит то вызываем ошибку                    
    raise_application_error(-20000, 'таблица занята другим пользователем...');
  else -- если блок не стоит то считаем записи в таблице
    select count(name)
      into n
      from TEST_01;
    if n = 6 then -- если записей 6 то вызываем ошибку
      raise_application_error(-20001, 'не больше 6-ти записей в татлицу....');
    else -- если не шесть то разрешаем вставку позиции (предпологается что записей до использования етого миханизма было меньше шести)
      insert into TEST_01
             (name)
      values (10);     
    end if;
  end if;
end;

---------------------------
при таком подходе записи в таблицы будут вставляться последовательно, то есть блок снимается только при коммите текущей сессии.
NetShadow, думаю то что тебе нужно, если очень хочится то блокировку можно вынести в стейтмент тригер на insert.

NetShadow, а теперь можно узнать нафига тебе это нужно(не больше 6 записей в таблице )?  smile 

Это сообщение отредактировал(а) DimW - 16.3.2007, 16:15
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1252 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.