2

C# と System.Data.OracleClient を使用して、データベースに関数を追加しています。これは、1 つを除いて、ほとんどの関数で機能します。関数は作成されましたが、その状態は INVALID です。この無効な状態の原因を調べたところ、SQL Developer 内で単純に関数をコンパイルできるが、C# アプリケーションからはコンパイルできないことに気付きました。

.NET と SQL Developer の使用に違いがある理由はありますか?

これは私が使用する機能です

string sql =
   @"CREATE OR REPLACE FUNCTION MYUSER.TEMPJOINSTRINGS 
    ( P_CURSOR SYS_REFCURSOR, 
      P_DEL VARCHAR2 := ', '
    ) RETURN VARCHAR2
   IS
     L_VALUE VARCHAR2(32767);
     L_RESULT VARCHAR2(32767);
   BEGIN
   LOOP
     FETCH P_CURSOR INTO L_VALUE;
     EXIT WHEN P_CURSOR%notfound;
     IF L_RESULT IS NOT NULL THEN
       L_RESULT := L_RESULT || P_DEL;
     END IF;
     L_RESULT := L_RESULT || L_VALUE;
   END LOOP;
   RETURN L_RESULT;
   END;";

try
{
    using (OracleConnection connection = new OracleConnection(@"Data source=TEST10;User Id=MYUSER;Password=MYPASS;"))
    {
        connection.Open();
        DbCommand cmd = connection.CreateCommand();
        cmd.CommandText = sql;
        cmd.ExecuteNonQuery();
        connection.Close();
        return true;
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

その後、私は実行します

ALTER FUNCTION MYUSER.TEMPJOINSTRINGS COMPILE

ただし、コンパイルはSQL Developerからのみ機能し、私のc#アプリケーションでは機能しません。

4

1 に答える 1

2

.NET の文字列は、Windows スタイルとしてフォーマットされていると推測します。\r\n改行。

これを試して

    sql = sql.Replace("\r", "");

関数文字列を作成した後。

次の場合は、これをすぐに確認できます。

SQL> show errors function TEMPJOINSTRINGS
Errors for FUNCTION TEMPJOINSTRINGS:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/26     PLS-00103: Encountered the symbol "" when expecting one of the
         following:
         ( return compress compiled wrapped

SQL> select status from user_objects where object_name = 'TEMPJOINSTRINGS';

STATUS
-------
INVALID

SQL> select text, dump(text) from user_source where name = 'TEMPJOINSTRINGS' and line = 1;

TEXT
--------------------------------------------------------------------------------
DUMP(TEXT)
--------------------------------------------------------------------------------
FUNCTION TEMPJOINSTRINGS
Typ=1 Len=26: 70,85,78,67,84,73,79,78,32,84,69,77,80,74,79,73,78,83,84,82,73,78,
71,83,13,10

最後の 13,10 は \r\n

于 2012-11-05T15:26:42.417 に答える