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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка слова в таблицу 
:(
    Опции темы
LSD
Дата 11.5.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



У меня получилось следующая структура: 2 таблицы.

Одна содержит слово, координаты начала и направление:
Код
create table WORDS
(
  ID        raw(16) default sys_guid(),
  X         number(5) not null,
  Y         number(5) not null,
  DIRECTION number(1) not null,
  WORD      varchar2(25) not null
);

alter table WORDS
  add constraint WORDS_PK primary key (ID);
alter table WORDS
  add constraint WORDS_UNIC unique (X, Y, DIRECTION);


Другая содержит букву, ссылку на слово к которому она принадлежит, координаты:
Код
create table LETTERS_GRID
(
  ID     raw(16) default sys_guid(),
  WORD   raw(16) not null,
  X      number(5) not null,
  Y      number(5) not null,
  LETTER char(1) not null
);

alter table LETTERS_GRID
  add constraint LETTERS_GRID_PK primary key (ID);
alter table LETTERS_GRID
  add constraint LETTERS_GRID_FK foreign key (WORD)
  references WORDS (ID) on delete cascade;

create index LETTERS_GRID_IDX on LETTERS_GRID (X, Y, LETTER);

(при удалении слова все связанные с ним буквы удаляются)

Процедура которая для заданного слова заполняет таблицу с буквами:
Код
create or replace procedure FILL_LETTERS_GRID(WORD_ID in raw) is

  WORD      varchar2(25);
  LEN       number;
  LETTER    char(1);
  X         number;
  Y         number;
  CUR_X     number;
  CUR_Y     number;
  DIRECTION number;
  I         number;
  J         number;

begin

  select W.X, W.Y, W.DIRECTION, UPPER(W.WORD)
    into X, Y, DIRECTION, WORD
    from WORDS W
   where W.ID = WORD_ID;

  LEN   := LENGTH(WORD);
  CUR_X := X;
  CUR_Y := Y;

  for I in 1 .. LEN loop
  
    if DIRECTION = 0 then
      CUR_Y := Y + I - 1;
    else
      CUR_X := X + I - 1;
    end if;
  
    LETTER := SUBSTR(WORD, I, 1);
  
    select count(*)
      into J
      from LETTERS_GRID L
     where L.X = CUR_X
       and L.Y = CUR_Y
       and L.LETTER <> LETTER;
  
    if J = 0 then
      insert into LETTERS_GRID (WORD, X, Y, LETTER) values (WORD_ID, CUR_X, CUR_Y, LETTER);
    else
      RAISE_APPLICATION_ERROR(-20101, 'Invalid invalid letter at [' || TO_CHAR(CUR_X) || ',' || TO_CHAR(CUR_Y) || ']');
    end if;
  
  end loop;

end FILL_LETTERS_GRID;


Триггер на табличку со словами, который при вставке очередного слова будет заполнять таблицу с буквами:
Код
create or replace trigger FILL_LETTERS_GRID_TRG
  after insert on WORDS
  for each row
begin
  FILL_LETTERS_GRID(:new.ID);
end FILL_LETTERS_GRID_TRG;


Пользователю на таблицу LETTERS_GRID дать только select, а в таблице WORDS запретить изметять столбец WORD или дописать логику по обработке такой ситуации.  


--------------------
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   Вверх
Sliva
Дата 11.5.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Очень нужно! Ответьте, пожалуйста - корректна ли следующая запись: for i in 1..len w:= word[i]? 
w - БУКВА VARCHAR(1)
word - СЛОВО VARCHAR2(10)? 
PM   Вверх
LSD
Дата 11.5.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Sliva @  11.5.2006,  21:53 Найти цитируемый пост)
Очень нужно! Ответьте, пожалуйста - корректна ли следующая запись: for i in 1..len w:= word[i]? 
w - БУКВА VARCHAR(1)
word - СЛОВО VARCHAR2(10)? 

Нет, переменная VARCHAR2 это не массив. 


--------------------
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   Вверх
Sliva
Дата 11.5.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо, LSD! Сейчас буду разбираться  smile  
PM   Вверх
LSD
Дата 11.5.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Плиз smile 


--------------------
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

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

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

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

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

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


 




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


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

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