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

本文关键字:选项 无效 SQL PL 执行 ORA-00922 | 更新日期: 2023-09-27 18:14:15

我几乎可以肯定这是用户错误。

我是连接c#到Oracle数据库的新手,并在Oracle在线文档

之后建模了我的代码

My PL/SQL works from Oracle SQL Developer我在测试中得到的错误。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());
        }

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

1) SET SERVEROUTPUT ON是一个SQLPlus函数——它不是SQL或PL/SQL语言的一部分(尽管许多gui,如SQL Developer和Toad至少有一些支持这样的SQLPlus函数)。

2)您几乎肯定不想将DBMS_OUTPUT用于与您的应用程序有关的任何事情—这不是从PL/SQL块获取数据的正确方式。从技术上讲,您可以在PL/SQL块中调用DBMS_OUTPUT.ENABLE(<<buffer size>>),使用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在OTN论坛上有一个匿名PL/SQL块的例子,该块在c#中返回PL/SQL记录。

我没有看到你关闭这个语句dbms_output.put_line('output= '||output"+