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

Поиск:

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


Бывалый
*


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

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



У меня  в таблице хранится кроссворд: 
id -  идентификатор слова
x- координата буквы в таблице 
y- координата буквы в таблице
len- длина слова
VH- вертикально расположено или горизонтально
(работаю в PL\SQL)
 Мне нужно вставить слово в кроссворд - должна быть функция вставки.
Подскажите как?  smile  
PM   Вверх
HalkaR
Дата 8.5.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



Так вам на чем на PL\SQL или MySQL? 
PM MAIL   Вверх
Sliva
Дата 9.5.2006, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



PL\SQL!  smile  Плиз! 
PM   Вверх
Ignat
Дата 9.5.2006, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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




M
Ignat
Перемещено из MySQL

 


--------------------
Теперь при чем :P
PM   Вверх
LSD
Дата 9.5.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Полную структуру таблиц дай, сколько их там у тебя 1 или 2. 


--------------------
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
Дата 9.5.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код
CREATE TABLE  Crossword
(
  id  INTEGER PRIMARY KEY,  // id слова
  x  INTEGER,  // координаты в таблице
  y  INTEGER, //
  len  INTEGER, // длина слова
  word VARCHAR2 (10),  // само слово
  VH INTEGER,  // горизонтально или вертикально
  idT  INTEGER FOREIGN KEY  // id кроссворда, в которой расположено слово
);

Т.е. получается, что у меня есть таблица, в которой хранятся слова, и в которой указано к какому кроссворду они принадлежат.
А мне нужно в PL\SQL написать вставку слова в кроссворд. Help!  smile   
PM   Вверх
LSD
Дата 9.5.2006, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Я не пойму, что должна делать процедура. Никакой обработки вставляемых данных тут нет. Максимум триггером проверить что VH имеет правильное значение и вычислить LEN. 


--------------------
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
Дата 9.5.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Дело в том, что программно надо написать процедуру, у которой в параметрах будет слово и его вставить в таблицу. Надо же учитывать на какую позицию вставляем:  Нельзя же вставить слово на место другого слова!  smile  
А про триггеры  нам еще не рассказывали  smile  а как с ними?
 
PM   Вверх
LSD
Дата 9.5.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


Бывалый
*


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

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



Фактически она должна вставить слово на пустое место, куда захочет пользователь - вот в чем дело  
PM   Вверх
Sliva
Дата 9.5.2006, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если быть точнее, 
то я пишу следю процедуру:
 
Код

PROCEDURE  InsertWord  (w in VARCHAR2(10),  xst in INTEGER, yst in INTEGER, pol in INTEGER, ic in INTEGER)  
 -- st - столбец x  ,str -строка  y, pol - положение слова - по горизонтали -1 или вертикали - 0

IS 

 --  выбирает символ из таблицы   
CURSOR getSymb (st in INTEGER, str in INTEGER) IS
   SELECT word  FROM Crossword WHERE  (x = st)  AND (y = str);

  BEGIN 
     i  INTEGER;
    lenw INTEGER; -- длина слова
    h INTEGER;
    v  INTEGER; 
   symP VARCHAR2(1);  -- текущий символ справа
  symL VARCHAR2(1);  -- текущий символ  слева


    lenw:= LENGTH(w); -- узнали длину вставляемого слова 
   
     open getSymb (xst-1,yst); 
     FETCH getSymb INTO  symL;    --  узнали букву  слева
    open getSymb (xst+1,yst);           
    FETCH getSymb INTO  symP;    --  узнали букву    справа 
      

   IF  ( (symP = '' ) and (pol = 1) )   -- если справа пусто и вставляем слово по горизонтали
     FOR i in xst..lenw 
    LOOP
         UPDATE  Crossword  SET  y = yst, len = lenw, word = w[i],  VH = 1, idT = ic  
             WHERE  x = i; 
    END LOOP;      
   ELSE   --   IF ((symP = "") and (pol ))    -- если справа пусто и вставляем слово по вертикально
    FOR i in yst..lenw 
    LOOP
         UPDATE  Crossword  SET x = xst, len = lenw, word = w[i],  VH = 0, idT = ic  
            WHERE  y = i;              
    END  LOOP;       
  
  END InsertWord; 

 
PM   Вверх
LSD
Дата 10.5.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Sliva @  9.5.2006,  22:29 Найти цитируемый пост)
Если быть точнее, 
то я пишу следю процедуру:

У тебя тут есть пара небольших синтаксических ошибок, неправильно организован цикл. Но это все лего поправимо, главное я не могу понять как у тебя хранятся в базе слова. Зачем тебе надо делать несколько инсертов в таблицу для каждого слова? И каков смысл тех проверок, что ты делаешь? 


--------------------
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
Дата 10.5.2006, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я вставляю слово на произвольное место в кроссворде (то бишь в таблицу), но там же может стоять другое слово! Мне нужно проверить:
1. Можно ли вставить слово, т.е. есть ли свободное место;
2. Если там есть слово, то можем ли мы верно вставить слово, например: по горизонтали стоит слово "восток", а я вставляю слово "кот" по вертикали. Т.е. я МОГУ ВСТАВИТЬ, но я должна проверить, что я вставляю на последнюю букву слова "востоК". 
Я сижу сейчас, разбираюсь - тут по идее должна быть целая куча проверок, ifов!!!  
Посмотри, пожалуйста!  smile  
PM   Вверх
LSD
Дата 10.5.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


Бывалый
*


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

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



Я, кстати, вчера изменила таблицу. Теперь она выглядит так: 
Код
CREATE TABLE  Crossword
(
  x  INTEGER,  
  y  INTEGER, 
  word VARCHAR2 (1), // буква
  VH boolean,
  idCros FOREIGN KEY 
);

Только со вставкой замучаешься! 
А в моей процедуре InsertWord - тоже тогда в параметрах передавать букву или можно слово?  smile  И вообще корректно в цикле писать, например: for i in 1..len w:= word[i]? 
Если w типа VARCHAR2(1), а word  типа  VARCHAR2(10)????  
PM   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0617 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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