Pl/sql

Тема в разделе "SQL", создана пользователем Sliva, 4 май 2006.

Статус темы:
Закрыта.
  1. Sliva

    Sliva Гость

    Подскажите, как можно вставить в кроссворд (который я представляю как таблицу с атрибутами id, x- начало слова y-конец слова) следующее слово. ПОЖАЛУЙСТА!
     
  2. Dioman

    Dioman Гость

    по-подробнее можно о проблеме?
     
  3. Sliva

    Sliva Гость

    Есть таблица
    CREATE TABLE Crossword
    ( x INTEGER, координата строки
    y INTEGER, координата столбца
    word VARCHAR2 (1), буква слова
    len INTEGER, длина слова
    VH INTEGER,направление 1-горизонтально. 0- вертикально
    );
    Но необходимо учитывать, что вставка слова может быть либо на свободное место, либо так, чтобы не стереть другое слово: например:
    по горизонтали есть слово - веТер, по вертикали - Танец, а я хочу вставить по вертикали слово реТро. Т.е. не получится, потому занято! И программно это надо проверять
     
  4. Sliva

    Sliva Гость

    А можно ли в цикле просматривать переменную w типа VARCHAR2? Например
    FOR i IN 1..LENGTH(w)
    LOOP
    if curSymbol=w ...
    Если нельзя, то какая может быть альтернатива?
     
  5. ????

    ???? Гость

    <!--QuoteBegin-Sliva+17:05:2006, 23:55 -->
    <span class="vbquote">(Sliva @ 17:05:2006, 23:55 )</span><!--QuoteEBegin-->какая может быть альтернатива
    [snapback]36068" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Код (Text):
    DECLARE
    i  NUMBER;
    s  VARCHAR2 (100) := 'Text';
    BEGIN
    FOR i IN 1 .. LENGTH (s)
    LOOP
    DBMS_OUTPUT.put_line (SUBSTR (s, i, 1));
    END LOOP;
    END;
    SUBSTR(строка_символов, a [,b])
    Возвращаеи часть строки символов начинающуюся с символа с номером a и имеющую длину b символов.
     
  6. Sliva

    Sliva Гость

    Спасибо.
     
  7. Sliva

    Sliva Гость

    Эта задача на создание пакетов. Я исправила все ошибки и процедура вставки слова у меня компилируется. Но при проверке - она не вставляет слово :( не могли бы вы код посмотреть, может, я что-то напутала:
    Код (Text):
    PROCEDURE InsertWord (w in VARCHAR2, xst in INTEGER, yst in INTEGER, pol in INTEGER, ic in INTEGER)
    IS

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

    BEGIN
    i INTEGER;
    j INTEGER;
    lenw NUMBER; -- длина слова
    symP VARCHAR2(1); -- символ справа
    symL VARCHAR2(1); -- символ слева
    symU VARCHAR2(1); -- символ сверху
    symD VARCHAR2(1); -- символ снизу
    curSym VARCHAR2(1); -- текущий символ
    symHU VARCHAR2(1); -- вспомогательный символ для пробежки по столбцу сверху
    symHD VARCHAR2(1); -- вспомогательный символ для пробежки по строке снизу
    symHL VARCHAR2(1); -- вспомогательный символ для пробежки по строке слева
    symHR VARCHAR2(1); -- вспомогательный символ для пробежки по строке справа

    lenw:= LENGTH(w); -- узнали длину вставляемого слова

    open getSymb (xst-1,yst);
    FETCH getSymb INTO symL;    -- узнали букву слева
    close getSymb;

    open getSymb (xst,yst-1);
    FETCH getSymb INTO symU;    -- узнали букву сверху
    close getSymb;

    open getSymb (xst,yst+1);
    FETCH getSymb INTO symD;    -- узнали букву снизу
    close getSymb;

    open getSymb (xst+1,yst);
    FETCH getSymb INTO symP;    -- узнали букву справа
    close getSymb;


    // Сначала в какую сторону устанавливаем! Если символ слева пустой, то проверяем до конца строки достаточно ли пустых символов для вставки слова
    iF (symL='')and(symU='')and(symD='')and (pol = 1) THEN // если по горизонтали, а слева, сверху, снизу ничего нет
    FOR i IN xst..lenw+1 // следущий символ за вставляемым словом д.б. пустым
    LOOP
    open getSymb(i,yst); // бежим по строке и открываем для каждого символа, начиная с позиции вставляемого слова
    FETCH getSymb INTO curSym; // узнали текущий символ
    IF (curSym='') THEN INSERT INTO Crossword VALUES (i,yst, w[i], lenw, pol, 1); end if; ??? w[i] и последний символ??? или сравнивать с NULL?
    IF (curSym<>'') and (curSym<>w[i]) THEN DBMS_OUTPUT.put_line('Nelzya vstavit slovo!'); END IF; //если символы есть и они не совпадают с символами из слова
    IF (curSym=w[i]) THEN // если буква совпала
    open getSymb(xst, yst-1); // открываем клетку ячейки, которая выше
    FETCH getSymb INTO SymHU;
    open getSymb( xst, yst+1); // открываем клетку ячейки, которая ниже расположена
    FETCH getSymb INTO SymHD;    
    IF (SymHU='') and (SymHD='') THEN // если нет слова по вертикали => вставить нельзя, т.к. это м.б. слово
    DBMS_OUTPUT.put_line('Nelzya vstavit slovo!');
    END IF;
    IF (SymHU<>'') or (SymHD<>'') THEN // если что-то есть по вертикали то слово вставить можно
    GOTO ins_wordH; // иначе будем вставлять слово с позиции i
    END IF;
    <<ins_wordH>>
    FOR j IN xst..lenw LOOP  INSERT INTO Crossword VALUES (j,yst, w[j], lenw, pol, 1); END LOOP;
    END IF;
    close getSymb;
    END LOOP;

    // Если клетка слева, справа и сверху пустые и вставляем по вертикали, то проверка до конца строки - есть ли свободное место
    IF (symL='')and(symP='')and (symU='') and (pol = 0) THEN
    FOR i IN yst..lenw+1
    LOOP
    open getSymb (xst, i); // пробегаем по вертикали, по столбцу
    FETCH getSymb INTO curSym;
    IF (curSym='') THEN INSERT INTO Crossword VALUES (xst,i, w[i], lenw, pol, 1); END IF; ??? w[i] и последний символ
    IF (curSym<>'')and (curSym<>w[i]) THEN DBMS_OUTPUT.put_line('Nelzya vstavit slovo!'); END IF; //если символы есть и они не совпадают с символами из слова
    IF (curSym=w[i]) THEN // если символ стоит => м.б. либо слово по вертикали, а значит вставить нельзя, либо слово по гор-ли и надо проверить совпадают буквы
    open getSymb (xst-1,yst);
    FETCH getSymb INTO SymHL; // узнали клетку слева                                      
    open getSymb (xst+1,yst);
    FETCH getSymb INTO SymHR; // узнали клетку справа
    IF (SymHL='')and(SymHR='') THEN // слова по горизонтали нет, т.к. слово идет ниже
    DBMS_OUTPUT.put_line('Nelzya vstavit slovo!');     
    END IF;
    IF (SymHL<>'') or (SymHR<>'') THEN // если символы стоят => есть слово по горизонтали
    GOTO ins_wordV; // иначе будем вставлять слово с позиции i
    END IF;                    
    <<ins_wordV>>
    FOR j IN yst..lenw LOOP  INSERT INTO Crossword VALUES (j,yst, w[j], lenw, pol, 1); END LOOP;                                         
    END IF;
    close getSymb;
    END LOOP;

    END InsertWord;
     
  8. ????

    ???? Гость

    Для: Sliva
    К сожалению разбираться абсолютно нет ни возможности ни желания, а явного "криминала" не видно. А при прогоне через отладчик ошибку установить не удаётся?
     
  9. Sliva

    Sliva Гость

    :) нет. В SQL+ написано, после того как я вызываю эту процедуру:
    процедура InsertWord выполнена
    Но когда я вызываю SELECT * FROM Crossword, куда должна эта процедура вносить изменения - их НЕТ! Перед Select я делаю COMMIT :(
     
  10. ????

    ???? Гость

    Для: Sliva
    могу посоветовать использовать утилиту PL/SQL Developer, в которой есть встроенный отладчик. В нем очень легко можно будет проверить на каком этапе происходит ошибка.
     
  11. Sliva

    Sliva Гость

    Да, я там и просматриваю. Если я делаю что-то не так, исправь, пожалуйста :)
    Открываю PL\SQL Developer и там слева выбираю packege ( у меня процедуры в пакетах), но сначала я отлаживала процедуры в procedure.
    А такой, как в Delphi пошаговой отладки нет? Типа F7? Если есть, то что надо открыть?
    У меня вся проблема, что я теперь не могу просмотреть на каком этапе она не работает :(
     
  12. ????

    ???? Гость

    <!--QuoteBegin-Sliva+21:05:2006, 11:07 -->
    <span class="vbquote">(Sliva @ 21:05:2006, 11:07 )</span><!--QuoteEBegin-->А такой, как в Delphi пошаговой отладки нет? Типа F7? Если есть, то что надо открыть?
    [snapback]36284" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Открываешь пакет, выбираешь нужную процедуру или функцию и щёлкаешь правой клавишей, а выпадающем меню выбираешь "Тестировать". В открывшемся окне появляется тестовый скрипт типа
    Код (Text):
    begin
    -- Call the function
    :result := имя_пакета.имя_функции(параметр => :параметр);
    end;
    если пакет собран с отладочной информацией, то по Ctrl+N можно пройти посодержимому функции.

    Более подробно в справке в разделе Debugging.
     
  13. Sliva

    Sliva Гость

    Спасибо тебе ОГРОМНОЕ!!!!! :eek:

    Я сейчас попробовала - там появляется
    Код (Text):
     -- Call the procedure
    mycrosswords.insertword(w => :w,
    xst => :xst,
    yst => :yst,
    pol => :pol,
    ic => :ic);
    Но :( кажется, пакет не собран с отладочной информацией. Т.е. кроме описания процедуры ничего нет. А как можно сделать так, чтобы подключить сам код процедуры?
    Я попробовала также сделать с package body, но теста там нет :(
     
  14. Sliva

    Sliva Гость

    Уважаемый ???? ! Пожалуйста! Срочно надо!!!!!! Help me!
     
  15. ????

    ???? Гость

    Попробую объяснить на примере:
    Запускаем PL\SQL Developer, открываем SQL окно, вводим код приведённый ниже и жмём выполнить (F*)
    Код (Text):
    create or replace procedure test_proc as
    l_index number;
    begin
    for x in (select * from user_objects) loop
    l_index := x.object_id;
    end loop;
    end;
    Переходим в дереве к созданной процедуре (TEST_PROC) и жмём правую клавишу по которой появится менюшка, в которой будет пункт "добавить отладочную информацию" - жмём его и должны увидеть что-то типа "Отладочная информация добавлена". Ещё раз правой кнопкой на процедуре и выбираем "Тестировать". В открытом окне видим
    Код (Text):
    begin
    -- Call the procedure
    test_proc;
    end;
    Жмём F9 - началась отладка и курсор стоит на 3-й строке. Жмём Ctrl+N и.... оппппаа, мы в процедуре :) Жмём Ctrl+N много раз и перемещаемся по циклу или Ctrl+R для выхода из процедуры.

    З.Ы. У меня Developer русский, поэтому названия пунктов меню отличаются от английских, а какие на английском - не помню :)
     
  16. Sliva

    Sliva Гость

    ОГРОМНОЕ СПАСИБО! ВСЕ получается B)
    А нам на паре этого не могут сказать! :)
    И еще один вопросик :) Можно? Я копирую функцию с несколькими параметрами, при пошаговой отладке он видит значения этих параметров как NULL, как вызвать процедуру/функцию с конкретными значениями параметров???
     
  17. Sliva

    Sliva Гость

    B)
    Если нетрудно, помоги :) а то завтра зачет и прога еще не отлажена :) :(
     
  18. ????

    ???? Гость

    Для: Sliva
    <!--QuoteBegin-Sliva+23:05:2006, 21:54 -->
    <span class="vbquote">(Sliva @ 23:05:2006, 21:54 )</span><!--QuoteEBegin-->Если нетрудно, помоги
    [snapback]36524" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    ок, но завтра, т.к. дома не могу проверить. что-бы не забыл - подними вопрос ещё раз завтра после 8.00
     
  19. Sliva

    Sliva Гость

    Доброе утро! Еще раз поднимаю вопрос :(
    Я отлаживаю процедуру, которая нигде не вызвана и в параметрах передаются Null-значения. Как и где вызвать процедуру с теми значениями параметров, которые должны быть?
     
  20. ????

    ???? Гость

    <!--QuoteBegin-Sliva+24:05:2006, 06:46 -->
    <span class="vbquote">(Sliva @ 24:05:2006, 06:46 )</span><!--QuoteEBegin-->с теми значениями параметров, которые должны быть
    [snapback]36542" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    До запуска отладки можно задать значения переменных в полях выделенных красным на рисунке.
     

    Вложения:

    • 1.PNG
      1.PNG
      Размер файла:
      12,4 КБ
      Просмотров:
      108
Загрузка...
Похожие Темы - sql
  1. mrtg
    Ответов:
    1
    Просмотров:
    60
  2. mrtg
    Ответов:
    14
    Просмотров:
    221
  3. Allegro
    Ответов:
    3
    Просмотров:
    120
  4. rhino101
    Ответов:
    0
    Просмотров:
    351
  5. karitsa
    Ответов:
    1
    Просмотров:
    461
Статус темы:
Закрыта.

Поделиться этой страницей