Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Необходимо перенести код из ORACLE в MySQL


Автор: Serious07 23.4.2009, 18:36
Код

 FUNCTION get_value (p IN NUMBER, q IN NUMBER)
      RETURN NUMBER
  AS

      res   NUMBER (5, 0) := 0;

 BEGIN
      
    res := TO_NUMBER (RAWTOHEX (UTL_RAW.bit_and (HEXTORAW (LTRIM (TO_CHAR (p, 'XXXX'))),
HEXTORAW (LTRIM (TO_CHAR (q, 'XXXX'))))), 'XXXX');
   
     res := TO_NUMBER (RAWTOHEX (UTL_RAW.bit_and (HEXTORAW (LTRIM (TO_CHAR (res, 'XXXX'))),
HEXTORAW (LTRIM (TO_CHAR (q, 'XXXX'))))), 'XXXX');          

      IF (res > 0)
      THEN
         res := 1;
      END IF;

      RETURN res;
   END get_value;

Автор: valid 23.4.2009, 18:40
и вот этот плиз



Код

   FUNCTION timestamp_to_t_date (t IN TIMESTAMP)
      RETURN t_date
   AS
      res   t_date := t_date (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
      str   VARCHAR (50);
   BEGIN
      str := TO_CHAR (t, 'DD.MM.YYYY HH24:MI:SS.FF');
      res.val := t;
      res.DAY := SUBSTR (str, 1, 2);
      res.MONTH := SUBSTR (str, 4, 2);
      res.YEAR := SUBSTR (str, 7, 4);
      res.HOUR := SUBSTR (str, 12, 2);
      res.MINUTE := SUBSTR (str, 15, 2);
      res.SECOND := SUBSTR (str, 18, 2);
      res.millisecond := SUBSTR (str, 21);
      RETURN res;
   END;

Автор: lelik133 24.4.2009, 08:28
ага все так и кинулись  переводить, либо опишите что конкретно вы сами  не смогли перевести, либо предлагайте $

Автор: azesmcar 24.4.2009, 09:06
Центр помощи http://forum.vingrad.ru/forum/Vingrad-help-center.html

Добавлено через 53 секунды
Цитата

ага все так и кинулись  переводить, либо опишите что конкретно вы сами  не смогли перевести, либо предлагайте $ 

там же написано..конкретно эту функцию не смогли smile 

Автор: skyboy 24.4.2009, 09:34
Serious07, можешь описать ожидаемый функционал?
на сторону клиента СУБД перенесети невозможно?

Автор: DimW 24.4.2009, 10:16
to Serious07:
Цитата

select to_number('1A', 'XXXX') from dual -- перевод из HEX в DEC

select to_char(26, 'XXXX') from dual -- перевод из DEC в HEX

select ltrim('   1A') from dual  -- удаляет пробелы слева

HEXTORAW -- непонятно зачем в данном случае это нужно

UTL_RAW.bit_and
  --  Perform bitwise logical "and" of the values in raw r1 with raw r2
  --    and return the "anded" result raw.
  --    If r1 and r2 differ in length, the "and" operation is terminated
  --    after the last byte of the shorter of the two raws, and the
  --    unprocessed portion of the longer raw is appended to the partial
  --    result.
  --    The result length equals the longer of the two input raws.

ищи аналоги в mySQL и переделывайте.

to valid:
в твоем случае значение типа TIMESTAMP перекладываются в объект t_date.
есть ли объекты в mySQL чесно говаря не знаю. если нет то придется отказаться от этого функционала и переделать функционал где данный объект используется.



Автор: valid 24.4.2009, 10:23
DimW, У МЕНЯ ЕЩЕ ТАКОЙ ВОПРОС       t_date := t_date (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 
T_DATE  ПРИСВАИВАЕТСЯ ФУНКЦИЯ ИЛИ МАССИВ?

Добавлено @ 10:28
И ЕЩЕ КАК ПЕРЕДЕЛАТЬ функционал?

Добавлено @ 10:29
ВОТ КАК T_DATE ИСПОЛЬЗУЕТСЯ


Код

    FUNCTION time_difference (t1 IN TIMESTAMP, t2 IN TIMESTAMP, format VARCHAR2)
      RETURN NUMBER
   AS
      res        NUMBER;
      tt1        t_date;
      tt2        t_date;
      ttt1       INT;
      ttt2       INT;
      str        VARCHAR2 (50) := TO_CHAR (t1 - t2);
      splitted   array_varchar := array_varchar ();
      seconds    NUMBER;
   BEGIN
      tt1 := timestamp_to_t_date (t1);
      tt2 := timestamp_to_t_date (t2);
      splitted := split_string (str, ' ');
      seconds := TO_NUMBER (splitted (1)) * 24 * 60 * 60;

      IF (seconds < 0)
      THEN
         seconds := seconds * (-1);
      END IF;

      seconds :=
           seconds
         + TO_NUMBER (SUBSTR (splitted (2), 1, 2)) * 60 * 60
         + TO_NUMBER (SUBSTR (splitted (2), 4, 2)) * 60 * 60
         + TO_NUMBER (SUBSTR (splitted (2), 7, 2)) * 60 * 60
         + TO_NUMBER ('0,' || SUBSTR (splitted (2), 10));

      IF (format = 'd')
      THEN
         RETURN ((seconds / 60) / 60) / 24;
      ELSIF (format = 'h')
      THEN
         RETURN (seconds / 60) / 60;
      ELSIF (format = 'm')
      THEN
         RETURN seconds / 60;
      ELSIF (format = 's')
      THEN
         RETURN seconds;
      END IF;

      RETURN seconds;
   END;

   FUNCTION timestamp_to_t_date (t IN TIMESTAMP)
      RETURN t_date
   AS
      res   t_date := t_date (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
      str   VARCHAR (50);
   BEGIN
      str := TO_CHAR (t, 'DD.MM.YYYY HH24:MI:SS.FF');
      res.val := t;
      res.DAY := SUBSTR (str, 1, 2);
      res.MONTH := SUBSTR (str, 4, 2);
      res.YEAR := SUBSTR (str, 7, 4);
      res.HOUR := SUBSTR (str, 12, 2);
      res.MINUTE := SUBSTR (str, 15, 2);
      res.SECOND := SUBSTR (str, 18, 2);
      res.millisecond := SUBSTR (str, 21);
      RETURN res;
   END;


Автор: DimW 24.4.2009, 10:57
Цитата(valid @  24.4.2009,  10:23 Найти цитируемый пост)
T_DATE  ПРИСВАИВАЕТСЯ ФУНКЦИЯ ИЛИ МАССИВ?

это инициализируется объект T_DATE.

Цитата(valid @  24.4.2009,  10:23 Найти цитируемый пост)
И ЕЩЕ КАК ПЕРЕДЕЛАТЬ функционал?

в приведенном тобой коде, функция timestamp_to_t_date вообще не нужна.
посмотри внимательней переменные tt1 и tt2 в последующем коде не используются.

Автор: valid 24.4.2009, 11:26
спасибо большое, я тоже это уже заметил ))), но есть еще проблема 

 FUNCTION split_string (str VARCHAR2, splitter VARCHAR2)
      RETURN array_varchar
   AS
      res    array_varchar  := array_varchar ();
      str0   VARCHAR2 (256) := str;
      str1   VARCHAR2 (256);
      i      INT            := 1;
   BEGIN
      LOOP
         EXIT WHEN str0 IS NULL OR str0 = '';
         str1 := LTRIM (str0, '0123456789:.-+');
         res.EXTEND;
         res (i) := REPLACE (str0, str1);
         str0 := LTRIM (str1, splitter);
         i := i + 1;
      END LOOP;

      RETURN res;
   END;

вобщем сделал чтобы эта функция возвращала таблицу, но как в  splitted

    FUNCTION time_difference (t1 IN TIMESTAMP, t2 IN TIMESTAMP, format VARCHAR2)
.......
      splitted   array_varchar := array_varchar ();
      seconds    NUMBER;
   BEGIN

      splitted := split_string (str, ' ');
      seconds := TO_NUMBER (splitted (1)) * 24 * 60 * 60;

принять таблицу?

Добавлено @ 11:27
и еще есть вопрос как создаются в mysql глобальные константы вне функции?

Автор: valid 25.4.2009, 13:26
дан такой код на oracle 

   FUNCTION calc_pot (t_id IN NUMBER)
      RETURN NUMBER
   IS
      CURSOR pot_sum (t_id IN NUMBER)
      IS
         SELECT bank + bet_sum AS pot
           FROM thp_tables_tmp
                JOIN
                (SELECT   table_id AS table_, SUM (round_cash) AS bet_sum
                     FROM thp_users_tmp
                    WHERE table_id = t_id
                 GROUP BY table_id) ON table_ = ID
          WHERE ID = t_id;

      rec   pot_sum%ROWTYPE;
   BEGIN
      OPEN pot_sum (t_id);

      FETCH pot_sum
       INTO rec;

      CLOSE pot_sum;

      IF rec.pot > 0
      THEN
         RETURN rec.pot;
      ELSE
         RETURN 0;
      END IF;
   END calc_pot;





как будет выглядеть строчка       rec   pot_sum%ROWTYPE;   в mysql?

Автор: skyboy 25.4.2009, 16:14
valid, не игнорирурй форматирование кода(кнопка "код" над полем ввода сообщения).
мне уже надоело корректировать твои посты.

Автор: DimW 27.4.2009, 09:34
Цитата(valid @  25.4.2009,  13:26 Найти цитируемый пост)
как будет выглядеть строчка       rec   pot_sum%ROWTYPE;   в mysql? 

а гуглом пользоваться мы не умеем?
http://www.ispirer.com/doc/sqlways39/Output/SQLWays-1-043.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)