ORA-00922:尝试从C#执行PL/SQL时缺少或无效选项

Gee*_*der 3 c# oracle

我几乎肯定这是用户错误.

我不熟悉将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)

Jus*_*ave 9

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记录.