Необходимо преобразовать функцию оракула в код C # - PullRequest
1 голос
/ 18 октября 2011

У меня есть одна функция в oracle, мне нужно преобразовать ее в код на c #, пожалуйста, помогите или сообщите мне любые ссылки, чтобы сделать это.

create or replace
FUNCTION             "GETSEPARATEDSTRING"
(  pString        IN VARCHAR2
   ,pSeparator     IN VARCHAR2
   ,pReturnNumber  IN PLS_INTEGER
)
RETURN VARCHAR2
IS
 l_SearchString_FinPos           PLS_INTEGER :=0;
 l_SearchString_StartPos         PLS_INTEGER :=0;
 l_SearchString_Length           PLS_INTEGER :=0;
 l_SearchString_CurrentPos       PLS_INTEGER :=0;
 l_Return                        VARCHAR2(4000);

BEGIN
  -- expecting values as String Seperator String Seperator
  -- so if pReturnNumber = 2 then where are
  -- looking for seperators 2 and 1. If there is no seperator
  -- at the end of the string it is added before comparison,
  -- Will return a null if:
  --  The length of pString is > 4000
  --  The pSeparator has not been specified
  --  The pReturnNumber IS <= 0
  --  The pReturnNumber IS greater than the number of pSeparator + 1 and therefore we can't pick up a string
  --  There was an empty string at the position requested
  -- Strings are returned without pSeparator

  IF     LENGTH( pString || pSeparator ) <= 4000
  AND pSeparator                       IS NOT NULL
  AND pReturnNumber                  >  0
  THEN
     l_SearchString_FinPos        := pReturnNumber;

     l_SearchString_StartPos      := pReturnNumber - 1;

     -- Concat a seperator at the end of the string so at least we

     -- know there is one

     IF INSTR( pString, pSeparator, -1, 1) != ( LENGTH( RTRIM( pString )) - LENGTH( pSeparator ) + 1 )

     THEN

       -- There isn't one at the end so add it

       l_Return                     := pString || pSeparator;

       --DBMS_OUTPUT.PUT_LINE('Did not find seperator - ADDING');

     ELSE

       l_Return                     := pString;

       --DBMS_OUTPUT.PUT_LINE('FOUND seperator');

     END IF;

     -- Set the start position of where we will check to the

     -- the last position we found a pSeparator value.

     l_SearchString_CurrentPos    := l_SearchString_FinPos;

     -- Search for the next pSeparator position

     l_SearchString_FinPos        := INSTR( l_Return, pSeparator, 1, l_SearchString_CurrentPos );

     IF l_SearchString_FinPos != 0

     THEN

       IF l_SearchString_StartPos != 0

       THEN

         l_SearchString_CurrentPos  := l_SearchString_StartPos;

         l_SearchString_StartPos    := INSTR( l_Return, pSeparator, 1, l_SearchString_CurrentPos ) + 1;

       ELSE

         -- If we are looking for the first value then StartPos will = 0

         -- and cause INSTR to fail

         l_SearchString_CurrentPos := 1;

       END IF;

       l_SearchString_Length      := l_SearchString_FinPos - l_SearchString_StartPos;

       l_Return                   := RTRIM( SUBSTR( l_Return, l_SearchString_StartPos, l_SearchString_Length ), pSeparator );

     ELSE

       l_Return := NULL;

     END IF;

   END IF;

   RETURN l_Return;

EXCEPTION

WHEN OTHERS

THEN

  DBMS_OUTPUT.PUT_LINE( 'FUNCTION GetSeperatedString Captured Error: ' || SQLERRM );

  RETURN NULL;
END;

1 Ответ

4 голосов
/ 18 октября 2011

Я не понимаю, почему вы не можете преобразовать это самостоятельно? В чем проблема? Вы даже получили комментарий, описывающий, что именно делает функция.

Сделайте что-то вроде этого:

  1. Преобразовать сигнатуру метода и все локальные переменные в C #.
  2. Поиск документации по INSTR, чтобы увидеть, использует ли индекс, начинающийся с нуля, как string.IndexOf
  3. Выполните прямое преобразование, посмотрев по одной строке за раз
  4. Проверка функции
  5. Переименуйте все переменные, чтобы иметь имена C #
  6. Рефакторинг, чтобы воспользоваться C #
...