Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
Помогите пжл. Я пока еще полный нуб, не могу понять где ошибка в функции -

create or replace FUNCTION set_order (
user_ord in users.user_name%type,
film_ord in films.film%type,
date_ord in films.session_time%type)
RETURN VARCHAR2;

is

CURSOR film_date_cur IS
SELECT session_time FROM films
WHERE film=film_ord;

film_date_rec film_date_cur%ROWTYPE;
p users.user_name%TYPE;
res films.reserved%TYPE;
seat halls.seats%TYPE;

BEGIN
SELECT user_id INTO p
FROM users
WHERE user=users_ord;

IF (SQL%NOTFOUND) THEN
RETURN "No such user"
ELSE
OPEN film_date_cur;

LOOP

EXIT WHEN film_date_cur%NOTFOUND;

FETCH film_date_cur INTO film_date_rec;

IF (film_date_rec=session_time)THEN

SELECT reserved INTO res FROM films
WHERE film=film_ord AND session_time=date_ord;

SELECT seats INTO seat FROM halls
WHERE hall=(SELECT hall FROM films
WHERE film=film_ord AND session_time=date_ord);

IF ((seat-res)>0) THEN

INSERT INTO orders
VALUES (user_ord,film_ord,date_ord);

UPDATE films
SET reserved=res+1
WHERE film=film_ord AND session_time=date_ord;

CLOSE film_date_cur;

RETURN "YOUR ORDER PROCESSED";

ELSE
CLOSE film_date_cur;
RETURN "FOR THIS SESSION NO TICKETS";
END IF;

ELSE
CLOSE film_date_cur;
RETURN "NO SUCH SESSION FOR THIS FILM";
END IF;




END LOOP;

CLOSE film_date_cur;
RETURN "No such film"

END IF;


END set_order;

Ошибку выдает такую -

ERROR at line 77: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

end not pragma final instantiable order overriding static
member constructor map
5. RETURN VARCHAR2;
6.
7. is
8.
9. CURSOR film_date_cur IS
29 май 11, 20:00    [10727731]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
be_here_now
Member

Откуда: пока Москва
Сообщений: 15
автор
RETURN VARCHAR2;

точку с запятой уберите.
29 май 11, 20:03    [10727743]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
be_here_now
Member

Откуда: пока Москва
Сообщений: 15
здесь и далее
автор
RETURN "No such user"

RETURN 'No such user'; (одинарные кавычки, точка с запятой)
29 май 11, 20:08    [10727758]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
Спс большое, но теперь новые ошибки вылезают -


ERROR at line 25: PLS-00103: Encountered the symbol "ELSE" when expecting one of the following:

. ( * @ % & = - + ; < / > at in is mod remainder not rem
<> or != or ~= >= <= <> and or like LIKE2_
LIKE4_ LIKEC_ between || multiset member SUBMULTISET_
The symbol ";" was substituted for "ELSE" to continue.
1. create or replace FUNCTION set_order (
2. user_ord in users.user_name%type,
3. film_ord in films.film%type,
4. date_ord in films.session_time%type)
29 май 11, 20:08    [10727759]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
be_here_now
Member

Откуда: пока Москва
Сообщений: 15
автор
SELECT
user_id
INTO
p
FROM
users
WHERE
USER = users_ord;

IF(SQL%NOTFOUND) THEN

sql%notfound обычно используется для работы с явными курсорами в цикле, а если Вы хотите обработать ситуацию, при которой запрос не вернет ни одной строки, пишите
BEGIN
   
   SELECT
    user_id
     INTO
    p
     FROM
    users
    WHERE
    USER = users_ord;

EXCEPTION

WHEN no_data_found THEN
  
  RETURN 'No such user';

END;
29 май 11, 20:13    [10727784]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
Все исправил, кроме Вашей последней рекомендации, выдает ошибку -

ERROR at line 34: PL/SQL: Statement ignored
1. create or replace FUNCTION set_order (
2. user_ord in users.user_name%type,
3. film_ord in films.film%type,
4. date_ord in films.session_time%type)
5. RETURN VARCHAR2

Это ошибка из-за
IF (SQL%NOTFOUND) THEN
RETURN 'No such user';

?
29 май 11, 20:20    [10727803]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
be_here_now
Member

Откуда: пока Москва
Сообщений: 15
sichag,

нет.
34 строка - это вот это: IF (film_date_rec=session_time)THEN ?
ну как минимум у вас переменная session_time не объявлена
29 май 11, 20:29    [10727834]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
be_here_now,

Это я запутался в переменных, на самом деле там так -

IF (film_date_rec=date_ord)THEN


Все равно ошибка -


ERROR at line 75: PLS-00103: Encountered the symbol "END" when expecting one of the following:

. ( * @ % & = - + ; < / > at in is mod remainder not rem
<> or != or ~= >= <= <> and or like LIKE2_
LIKE4_ LIKEC_ between || multiset member SUBMULTISET_
The symbol ";" was substituted for "END" to continue.
5.
6. RETURN VARCHAR2
7.
8. IS
9.
29 май 11, 20:57    [10727916]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
be_here_now
Member

Откуда: пока Москва
Сообщений: 15
sichag,

во всех RETURNах поставили одинарные кавычки и закрывающую точку с запятой? ошибка, судя по номеру строки, на самом последнем.

на будущее - выкладывайте отформатированный код, обернутый тегом SRC (есть кнопка при добавлении комментария), лучше - с номерами строк. иначе его читать тяжело.
29 май 11, 21:07    [10727949]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
be_here_now,

Вроде бы везде, извините за неотформатированный код, теперь буду занть.

Вот окончательная запись и ошибка -
CREATE OR REPLACE FUNCTION set_order (
	user_ord in users.user_name%type,
	film_ord in films.film%type,
	date_ord in films.session_time%type)
	
        RETURN VARCHAR2
	
	IS
	
	CURSOR film_date_cur IS
	SELECT session_time FROM films
	WHERE film=film_ord;

	film_date_rec film_date_cur%ROWTYPE;
	p 	users.user_name%TYPE;
	res 	films.reserved%TYPE;
	seat	halls.seats%TYPE;
    
BEGIN
	SELECT user_id INTO p
	FROM users
	WHERE user=users_ord;

	IF (SQL%NOTFOUND) THEN
	RETURN 'No such user';
	ELSE
		OPEN film_date_cur;
				
		LOOP
		
		EXIT WHEN film_date_cur%NOTFOUND;

		FETCH film_date_cur INTO film_date_rec;
		
			IF (film_date_rec=date_ord)THEN

			SELECT 	reserved INTO res FROM films
			WHERE film=film_ord AND session_time=date_ord;
			
			SELECT seats INTO seat FROM halls
			WHERE hall=(SELECT hall FROM films
			WHERE film=film_ord AND session_time=date_ord);
			
				IF ((seat-res)>0) THEN
			
				INSERT INTO orders
				VALUES (user_ord,film_ord,date_ord);

				UPDATE films
				SET reserved=res+1
				WHERE film=film_ord AND session_time=date_ord;

				CLOSE film_date_cur;
			
				RETURN 'YOUR ORDER PROCESSED';
			
				ELSE
				CLOSE film_date_cur;
				RETURN "FOR THIS SESSION NO TICKETS";
				END IF;

			ELSE
			CLOSE film_date_cur;
			RETURN 'NO SUCH SESSION FOR THIS FILM';
			END IF;
			
		
		
		
		END LOOP;
		
		CLOSE film_date_cur;
		RETURN 'No such film';

	END IF;
		

END set_order;

И ошибка - ERROR at line 35: PL/SQL: Statement ignored
1. CREATE OR REPLACE FUNCTION set_order (
2. user_ord in users.user_name%type,
3. film_ord in films.film%type,
4. date_ord in films.session_time%type)
5.
29 май 11, 21:27    [10728008]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
sichag,
Это сразу не заметил -

RETURN 'NO SUCH SESSION FOR THIS FILM';

Но сейчас исправил - ошибка та же что и была
29 май 11, 21:29    [10728016]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
sichag,

т.е. имел в виду это -RETURN "FOR THIS SESSION NO TICKETS";
29 май 11, 21:31    [10728020]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
film_date_rec -> film_date_rec.session_time
29 май 11, 22:14    [10728167]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
Простите за занудство, но не могли бы Вы написать подробнее ,я же говорил что я полный нуб.
Спасибо.
29 май 11, 22:17    [10728181]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Строку 35 заменить на
      IF (film_date_rec.session_time=date_ord)THEN
29 май 11, 22:20    [10728185]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
Огромное Вам спасибо, функция создана и работает.

ЗЫ: be_here_now и Вам тоже .
29 май 11, 22:26    [10728207]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
А теперь, например, передайте в users_ord какую-нибудь ерунду которой нет в users.
29 май 11, 22:38    [10728243]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
Будет ошибка?
29 май 11, 22:45    [10728265]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
sichag
Member

Откуда:
Сообщений: 11
она вообще с любыми параметрами (есть они в таблице users или нет) выдает -

ORA-01403: no data found


И где я напортачил?
30 май 11, 00:18    [10728552]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
olzhas
Member

Откуда: Kazakhstan, Astana
Сообщений: 460
sichag,

а вы точно те параметры сравниваете?

...
user_ord in users.user_name%type,
.... 
WHERE user=users_ord;
....

30 май 11, 09:35    [10729391]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
sichag
она вообще с любыми параметрами (есть они в таблице users или нет) выдает -

ORA-01403: no data found


И где я напортачил?


Пример вызова можно?
30 май 11, 09:42    [10729417]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
обрабатывать ошибку надо:
BEGIN
 SELECT User_Id INTO p FROM Dba_Users WHERE USER = Users_Ord;
EXCEPTION
 WHEN NO_DATA_FOUND THEN
  RETURN 'No such user';
 WHEN TOO_MANY_ROWS THEN
  RETURN 'More than one user';
END;

и уберите IF c (SQL%NOTFOUND) 

30 май 11, 15:40    [10732641]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться пжл  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
Dba_Users на Users переправте, см. пред. пост.
30 май 11, 15:41    [10732656]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить