我正在使用C#和System.Data.OracleClient将函数添加到数据库中。这适用于大多数功能,除了一个。该函数已创建,但其状态为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#应用程序中使用。
答案 0 :(得分:2)
我猜测.NET中的String是bieng格式化为windows syle ie。 \ 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