我几乎肯定这是用户错误.
我不熟悉将C#连接到Oracle数据库,之后在Oracle在线文档中对我的代码进行了建模
我的PL/SQL在Oracle SQL Developer中运行.我在test.aspx页面中遇到的错误是:
ORA-00922:缺少或无效选项
test.aspx.cs页面背后的代码是:
string currentTerm = getCurrentTerm();
string passwd = "<get password input>";
string salt = "<get salted input>";
conn.ConnectionString = ConfigurationManager.ConnectionStrings["CONNECTIONSTRINGNAME"].ConnectionString;
conn.Open();
// pl/sql block
string pl_sql = " set serveroutput on " +
"DECLARE"+
" output tablename.function%TYPE;" +
"BEGIN"+
" tablename.myfunction(:1,:2,:3);" +
" dbms_output.put_line('output= '||output"+
"END;";
//Oracle Parameters necessary for the myfunction function
OracleParameter p_1 = new OracleParameter(passwd, OracleDbType.Varchar2, 50, ParameterDirection.Input);
OracleParameter p_2 = new OracleParameter(salt, OracleDbType.Varchar2, 50, ParameterDirection.Input);
OracleParameter p_3 = new OracleParameter("3", OracleDbType.Varchar2, 50, ParameterDirection.Output);
// create the command object
OracleCommand cmd = conn.CreateCommand();
cmd.CommandText = pl_sql;
// add the parameters
cmd.Parameters.Add(p_1);
cmd.Parameters.Add(p_2);
cmd.Parameters.Add(p_3);
// execute the pl/sql block
cmd.ExecuteNonQuery();
// get a data reader from the ref cursor
// note: this is on p_3, the output value
OracleDataReader dr = ((OracleRefCursor)p_3.Value).GetDataReader();
while (dr.Read())
{
Response.Write("Salt licked hash: "+ dr[0].ToString());
//Output the line retrieved from dbms_output.put line
Response.Write("<br />");
Response.Write("DBMS_OUTPUT STATUS: "+ p_3.Value.ToString());
}
Run Code Online (Sandbox Code Playgroud)
1)SET SERVEROUTPUT ON是一个SQL Plus函数 - 它不是SQL或PL/SQL语言的一部分(尽管像SQL Developer和Toad这样的许多GUI至少支持SQL Plus这样的函数).
2)你几乎肯定不想使用DBMS_OUTPUT任何与你的应用程序有关的东西 - 这不是从PL/SQL块获取数据的正确方法.从技术上讲,您可以调用DBMS_OUTPUT.ENABLE(<<buffer size>>)PL/SQL块,使用数据将数据写入缓冲区DBMS_OUTPUT.PUT_LINE,然后让应用程序调用以DBMS_OUTPUT.GET_LINE在过程完成后从缓冲区读取数据.这就是SQL*Plus和SQL Developer在幕后所做的事情.但这不是构建应用程序的适当方式.
3)我不确定tablename.myfunction返回的是什么类型.如果它返回一个简单的标量或REF CURSOR,生活就容易多了 - 你可以在没有PL/SQL匿名块的情况下调用函数,因为Harrison在这个SO线程中演示了在C#中调用返回REF CURSOR的函数.如果它返回PL/SQL记录类型,Mark Williams有一个匿名PL/SQL块的例子,它在OTN论坛上返回C#中的PL/SQL记录.
| 归档时间: |
|
| 查看次数: |
18320 次 |
| 最近记录: |