ORA-00922: отсутствует или недействительна опция при попытке выполнить PL / SQL из C # - PullRequest
3 голосов
/ 10 ноября 2011

Я почти уверен, что это ошибка пользователя.

Я новичок в подключении 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());

        }

Ответы [ 2 ]

9 голосов
/ 10 ноября 2011

1) SET SERVEROUTPUT ON - это функция SQL Plus - она ​​не является частью языка SQL или PL / SQL (хотя многие графические интерфейсы, такие как SQL Developer и Toad, имеют хотя бы некоторую поддержку SQL Плюс такие функции).

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, как Харрисон демонстрирует в этом SO-потоке при вызове функции, которая возвращает REF CURSORв C # .Если он возвращает тип записи PL / SQL, у Марка Уильямса есть пример анонимного блока PL / SQL, который возвращает запись PL / SQL в C # на форумах OTN.

2 голосов
/ 10 ноября 2011

Я не вижу, как вы закрываете это заявление dbms_output.put_line('output= '||output"+

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...