Преобразовать функцию SQL Server в Oracle

#sql #sql-server #oracle #function #plsql

#sql #sql-сервер #Oracle #функция #plsql

Вопрос:

Это моя функция SQL Server, и я пытаюсь преобразовать прописные буквы в правильные, и она успешно работает на SQL Server, но не в Oracle, может кто-нибудь помочь мне преобразовать приведенный ниже код:

 CREATE FUNCTION CamelCase(@Text as VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
 DECLARE @Index INT;
 DECLARE @CurChar CHAR(1);
 DECLARE @Reset BIT;
 DECLARE @Ret VARCHAR(8000);

 IF @Text IS NULL
   RETURN NULL;

 SELECT @Reset = 1, 
        @Index = 1,
        @Ret = '';

 WHILE (@Index <= len(@Text))

 SELECT @CurChar = substring(@Text, @Index, 1),
        @Ret = @Ret   CASE WHEN @Reset = 1 THEN UPPER(@CurChar) ELSE LOWER(@CurChar) END,
        @Reset = CASE WHEN @CurChar like '[a-zA-Z]' THEN 0 ELSE 1 END,
        @Index = @Index   1
RETURN @Ret
END
 

Я попытался перевести его в функциональный код Oracle, который показан ниже:

 create or replace function  CamelCase(Text in VARCHAR2)
RETURN VARCHAR2
IS
 Ret VARCHAR2(8000):= '';
 Index NUMBER:= 1;
 CurChar CHAR0;
 Resets BIT := 1;
BEGIN    
 WHILE (Index <= LENGTH(Text))
 loop
    CurChar := SUBSTR(Text, Index, 1);
    if (Reset = 1) then 
          ret:= UPPER(CurChar) ;
        ELSE 
         ret:= LOWER(CurChar);
    end if ;
    if (CurChar like '[a-zA-Z]') then 
    reset:=  0;
    else 
      reset:=  1;
    end if ;
    Index := Index   1;
 end loop;      
 RETURN Ret;
END
 

Но это кажется неправильным, может кто-нибудь помочь мне, пожалуйста, для преобразования.

Комментарии:

1. Честно говоря, я бы попробовал исправить все это в обеих средах. Цикл будет ужасно медленным в любой из СУБД.

2. Какова будет ее цель?

3. спасибо всем, чтобы преобразовать верхний регистр в правильный регистр.

4. Вместо всего этого зацикливания и использования UPPER и LOWER, рассматривали ли вы возможность просто использовать INITCAP?

5. Нет, я не потому, что мне нужно преобразовать именно эту функцию, если это возможно. Спасибо

Ответ №1:

Подойдет ли это? Смотрите Комментарии в коде.

 SQL> create or replace function f_proper (par_text in varchar2)
  2    return varchar2
  3  is
  4    l_this varchar2(1);   -- current character
  5    l_prev varchar2(1);   -- previous character
  6    l_res varchar2(200);  -- resulting string
  7  begin
  8    if par_text is null then
  9       return null;
 10    end if;
 11
 12    for i in 1 .. length(par_text) loop
 13      l_this := substr(par_text, i, 1);
 14      l_prev := substr(par_text, i - 1, 1);
 15
 16      l_res := l_res ||
 17        -- If I'm on the first character of the string OR
 18        -- previous character is a space and current character is not a space
 19        -- then return UPPERCASE of the current character.
 20        -- Else, return lowercase of the current character.
 21        case when i = 1 or
 22                  (l_prev  = ' ' and l_this <> ' ')
 23             then upper(l_this)
 24             else lower(l_this)
 25        end;
 26    end loop;
 27
 28    return l_res;
 29  end;
 30  /

Function created.
 

Тестирование:

 SQL> select f_proper('little  fo ot') r1,
  2         f_proper('I tried to translate it into Oracle') r2,
  3         f_proper('ABC') r3,
  4         f_proper(null) r4
  5  from dual;

R1              R2                                  R3  R4
--------------- ----------------------------------- --- ---
Little  Fo Ot   I Tried To Translate It Into Oracle Abc

SQL>
 

Или, не изобретая велосипед, используйте встроенную initcap функцию:

 SQL> select initcap('little  fo ot') r1,
  2         initcap('I tried to translate it into Oracle') r2,
  3         initcap('ABC') r3,
  4         initcap(null) r4
  5  from dual;

R1              R2                                  R3  R4
--------------- ----------------------------------- --- ---
Little  Fo Ot   I Tried To Translate It Into Oracle Abc

SQL>
 

Комментарии:

1. спасибо, это именно то, что я ожидаю, еще раз спасибо.