1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программирован. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление
  2. Чат codeby в telegram перезагрузка. Обсуждаем вопросы информационной безопасности и методы защиты информации, программирование. Задавайте свои вопросы и комментируйте чужие. Подробнее ...

    Скрыть объявление

Pl/sql

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

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

    Sliva Гость

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

    Dioman Гость

    Репутация:
    0
    по-подробнее можно о проблеме?
     
  3. Sliva

    Sliva Гость

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

    Sliva Гость

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

    ???? Гость

    Репутация:
    0
    <!--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]
    Код:
    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 Гость

    Репутация:
    0
    Эта задача на создание пакетов. Я исправила все ошибки и процедура вставки слова у меня компилируется. Но при проверке - она не вставляет слово :( не могли бы вы код посмотреть, может, я что-то напутала:
    Код:
    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;
     
  7. ????

    ???? Гость

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

    Sliva Гость

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

    ???? Гость

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

    Sliva Гость

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

    ???? Гость

    Репутация:
    0
    <!--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]
    Открываешь пакет, выбираешь нужную процедуру или функцию и щёлкаешь правой клавишей, а выпадающем меню выбираешь "Тестировать". В открывшемся окне появляется тестовый скрипт типа
    Код:
    begin
    -- Call the function
    :result := имя_пакета.имя_функции(параметр => :параметр);
    end;
    если пакет собран с отладочной информацией, то по Ctrl+N можно пройти посодержимому функции.

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

    Sliva Гость

    Репутация:
    0
    Спасибо тебе ОГРОМНОЕ!!!!! :o

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

    Sliva Гость

    Репутация:
    0
    Уважаемый ???? ! Пожалуйста! Срочно надо!!!!!! Help me!
     
  14. ????

    ???? Гость

    Репутация:
    0
    Попробую объяснить на примере:
    Запускаем PL\SQL Developer, открываем SQL окно, вводим код приведённый ниже и жмём выполнить (F*)
    Код:
    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) и жмём правую клавишу по которой появится менюшка, в которой будет пункт "добавить отладочную информацию" - жмём его и должны увидеть что-то типа "Отладочная информация добавлена". Ещё раз правой кнопкой на процедуре и выбираем "Тестировать". В открытом окне видим
    Код:
    begin
    -- Call the procedure
    test_proc;
    end;
    Жмём F9 - началась отладка и курсор стоит на 3-й строке. Жмём Ctrl+N и.... оппппаа, мы в процедуре :) Жмём Ctrl+N много раз и перемещаемся по циклу или Ctrl+R для выхода из процедуры.

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

    Sliva Гость

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

    Sliva Гость

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

    ???? Гость

    Репутация:
    0
    Для: 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
     
  18. Sliva

    Sliva Гость

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

    ???? Гость

    Репутация:
    0
    <!--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]
    До запуска отладки можно задать значения переменных в полях выделенных красным на рисунке.
     

    Вложения:

    • Pl/sql
      1.PNG
      Размер файла:
      12,4 КБ
      Просмотров:
      108
Загрузка...
Статус темы:
Закрыта.

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