2

我正在使用 C# 和 System.Data.OracleClient 向数据库添加函数。这适用于大多数功能,除了一个。该函数已创建,但其状态为无效。在检查了这种无效状态的原因后,我注意到我可以在 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 中的字符串被 bieng 格式化为 windows syle 即。\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 回答