2011-10-18 13 views
1

私はoracleに1つの関数を持っています。これをC#コードに変換する必要があります。 助けてください。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; 
+0

を利用するリファクタリング私はすべてのPL/SQLを知らないが、これは単に[のstring.Split](http://msdn.microsoft.com/en-usではありません/library/b873y76a.aspx) – billinkc

+0

ちょうどそれを簡単にする誰かがこのpl/sql手続きの高レベルの目的は何ですか? – Kuberchaun

+0

この関数のいくつかのサンプル入出力を提供し、単にコードを投げて助けを求めるのではなく、何をするべきかを説明するのはあなたにとって非常に良いことです。すべての人が知っているわけではありませんが、Oracleは手元にありませんが、多くの人がC#を書くことができます – Icarus

答えて

2

自分で変換できない理由はわかりません。何が問題ですか?関数が何をしているのかを正確に記述したコメントもあります。

  1. C#のものにメソッドのシグネチャとすべてのローカル変数を変換します

    はこのような何かを行います。

  2. 引き、ゼロベースのインデックスを使用している場合string.IndexOf
  3. 一度に一つのラインを見てまっすぐに変換を行います
  4. として参照するにはINSTRの文書化テスト機能
  5. C#の名前を持っているすべての変数の名前を変更します
  6. C#
関連する問題