需要将oracle函数转换为c#代码

时间:2011-10-18 03:47:39

标签: c# c#-4.0 c#-3.0

我在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 个答案:

答案 0 :(得分:4)

我不明白你为什么不能自己转换它?问题是什么?你甚至得到了一个评论,准确描述了这个函数正在做什么。

做这样的事情:

  1. 将方法签名和所有局部变量转换为C#。
  2. 查看INSTR的文档,看看是否使用从零开始的索引string.IndexOf
  3. 通过一次查看一行进行直接转换
  4. 测试功能
  5. 将所有变量重命名为C#names
  6. 重构以利用C#