Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Нужна помощь с запросом к бд Mysql

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: CREATE FUNCTION urldecode...
xhugo
Отправлено: 06 Октября, 2013 - 03:39:38
Post Id



Посетитель


Покинул форум
Сообщений всего: 357
Дата рег-ции: Дек. 2010  


Помог: 1 раз(а)




Вот код запроса:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE FUNCTION urldecode(s VARCHAR(4096)) RETURNS varchar(4096) CHARSET utf8
  2.     DETERMINISTIC
  3. BEGIN
  4.        DECLARE c VARCHAR(4096) DEFAULT '';
  5.        DECLARE pointer INT DEFAULT 1;
  6.        DECLARE h CHAR(2);
  7.        DECLARE h1 CHAR(1);
  8.        DECLARE h2 CHAR(1);
  9.        DECLARE s2 VARCHAR(4096) DEFAULT '';
  10.  
  11.        IF ISNULL(s) THEN
  12.           RETURN NULL;
  13.        ELSE
  14.        SET s2 = '';
  15.        WHILE pointer <= LENGTH(s) DO
  16.           SET c = MID(s,pointer,1);
  17.           IF c = '+' THEN
  18.              SET c = ' ';
  19.           ELSEIF c = '%' AND pointer + 2 <= LENGTH(s) THEN
  20.              SET h1 = LOWER(MID(s,pointer+1,1));
  21.              SET h2 = LOWER(MID(s,pointer+2,1));
  22.              IF (h1 BETWEEN '0' AND '9' OR h1 BETWEEN 'a' AND 'f')
  23.                  AND
  24.                  (h2 BETWEEN '0' AND '9' OR h2 BETWEEN 'a' AND 'f')
  25.                  THEN
  26.                    SET h = CONCAT(h1,h2);
  27.                    SET pointer = pointer + 2;
  28.                    SET c = CHAR(CONV(h,16,10));
  29.               END IF;
  30.           END IF;
  31.           SET s2 = CONCAT(s2,c);
  32.           SET pointer = pointer + 1;
  33.        END while;
  34.        END IF;
  35.        RETURN s2;
  36. END
  37.  



Выдает вот такую ошибку:

Цитата:
SQL-запрос:

CREATE FUNCTION urldecode(

s VARCHAR( 4096 )
) RETURNS VARCHAR( 4096 ) CHARSET utf8 DETERMINISTIC BEGIN DECLARE c VARCHAR( 4096 ) DEFAULT '';

Ответ MySQL: Документация

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4

Скрин:


Буду весьма признателен за помощь в решении ошибки. Пробовал менять 4ую строку
Цитата:
DECLARE c VARCHAR(4096) DEFAULT '';
на
Цитата:
DECLARE c TEXT;
или на
Цитата:
DECLARE c VARCHAR(4096) DEFAULT '';
но ни то ни другое не помогло. Ошибка остается.
 
 Top
Мелкий Супермодератор
Отправлено: 06 Октября, 2013 - 10:05:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




; должен разделять запросы, поэтому парсер считает, что на 4 строке объявление функции завершается.
Переопределите delimiter, пример использования есть в мануале: http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]e-procedure[dot]html


-----
PostgreSQL DBA
 
 Top
xhugo
Отправлено: 06 Октября, 2013 - 17:49:10
Post Id



Посетитель


Покинул форум
Сообщений всего: 357
Дата рег-ции: Дек. 2010  


Помог: 1 раз(а)




Мелкий пишет:
; должен разделять запросы, поэтому парсер считает, что на 4 строке объявление функции завершается.
Переопределите delimiter, пример использования есть в мануале: http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html

Можете помочь переопределить? Имею совсем недавний опыт общения с бд,поэтому пока не могу сообразить что к чему и как переопределить.
 
 Top
Мелкий Супермодератор
Отправлено: 06 Октября, 2013 - 19:12:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ссылку для кого специально нашёл и указал?


-----
PostgreSQL DBA
 
 Top
xhugo
Отправлено: 08 Октября, 2013 - 16:34:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 357
Дата рег-ции: Дек. 2010  


Помог: 1 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. delimiter //
  2. CREATE FUNCTION urldecode(s VARCHAR(4096)) RETURNS varchar(4096) CHARSET utf8
  3.     DETERMINISTIC
  4. BEGIN
  5.        DECLARE c VARCHAR(4096) DEFAULT '';
  6.        DECLARE pointer INT DEFAULT 1;
  7.        DECLARE h CHAR(2);
  8.        DECLARE h1 CHAR(1);
  9.        DECLARE h2 CHAR(1);
  10.        DECLARE s2 VARCHAR(4096) DEFAULT '';
  11.  
  12.        IF ISNULL(s) THEN
  13.           RETURN NULL;
  14.        ELSE
  15.        SET s2 = '';
  16.        WHILE pointer <= LENGTH(s) DO
  17.          SET c = MID(s,pointer,1);
  18.          IF c = '+' THEN
  19.             SET c = ' ';
  20.          ELSEIF c = '%' AND pointer + 2 <= LENGTH(s) THEN
  21.             SET h1 = LOWER(MID(s,pointer+1,1));
  22.             SET h2 = LOWER(MID(s,pointer+2,1));
  23.             IF (h1 BETWEEN '0' AND '9' OR h1 BETWEEN 'a' AND 'f')
  24.                 AND
  25.                 (h2 BETWEEN '0' AND '9' OR h2 BETWEEN 'a' AND 'f')
  26.                 THEN
  27.                   SET h = CONCAT(h1,h2);
  28.                   SET pointer = pointer + 2;
  29.                   SET c = CHAR(CONV(h,16,10));
  30.              END IF;
  31.          END IF;
  32.          SET s2 = CONCAT(s2,c);
  33.          SET pointer = pointer + 1;
  34.       END while;
  35.       END IF;
  36.       RETURN s2;
  37.  

#1304 - FUNCTION urldecode already exists

CODE (htmlphp):
скопировать код в буфер обмена
  1. SELECT concat(urldecode('%D1%80%D0%B0%D1%80')) cte

#1436 - Thread stack overrun: 11776 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack.
почему вылазит эта ошибка? как решить?
 
 Top
Мелкий Супермодератор
Отправлено: 08 Октября, 2013 - 17:07:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Как написано - желаемое не влезает в стек.
Решений, как обычно, два:
0) уменьшить запросы к объёму памяти
1) или увеличить размер стека.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB