Pl/sql

  • Автор темы Sliva
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

Sliva

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

Sliva

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

Sliva

#4
А можно ли в цикле просматривать переменную 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]
Код:
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 символов.
 
S

Sliva

#6
Эта задача на создание пакетов. Я исправила все ошибки и процедура вставки слова у меня компилируется. Но при проверке - она не вставляет слово :( не могли бы вы код посмотреть, может, я что-то напутала:
Код:
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
Для: Sliva
К сожалению разбираться абсолютно нет ни возможности ни желания, а явного "криминала" не видно. А при прогоне через отладчик ошибку установить не удаётся?
 
S

Sliva

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

????

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

Sliva

#10
Да, я там и просматриваю. Если я делаю что-то не так, исправь, пожалуйста :)
Открываю PL\SQL Developer и там слева выбираю packege ( у меня процедуры в пакетах), но сначала я отлаживала процедуры в procedure.
А такой, как в Delphi пошаговой отладки нет? Типа F7? Если есть, то что надо открыть?
У меня вся проблема, что я теперь не могу просмотреть на каком этапе она не работает :(
 
?
#11
<!--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.
 
S

Sliva

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

Я сейчас попробовала - там появляется
Код:
 -- Call the procedure
mycrosswords.insertword(w => :w,
xst => :xst,
yst => :yst,
pol => :pol,
ic => :ic);
Но :( кажется, пакет не собран с отладочной информацией. Т.е. кроме описания процедуры ничего нет. А как можно сделать так, чтобы подключить сам код процедуры?
Я попробовала также сделать с package body, но теста там нет :(
 
?
#14
Попробую объяснить на примере:
Запускаем 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 русский, поэтому названия пунктов меню отличаются от английских, а какие на английском - не помню :)
 
S

Sliva

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

Sliva

#16
B)
Если нетрудно, помоги :) а то завтра зачет и прога еще не отлажена :) :(
 
?
#17
Для: 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
 
S

Sliva

#18
Доброе утро! Еще раз поднимаю вопрос :(
Я отлаживаю процедуру, которая нигде не вызвана и в параметрах передаются Null-значения. Как и где вызвать процедуру с теми значениями параметров, которые должны быть?
 
?
#19
<!--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]
До запуска отладки можно задать значения переменных в полях выделенных красным на рисунке.
 

Вложения

  • 12.4 КБ Просмотры: 108
Статус
Закрыто для дальнейших ответов.