Не удается создать хранимую процедуру Oracle из кода C # для разработчика PL / SQL - PullRequest
1 голос
/ 18 августа 2011

Я пытался создать процедуру SQL на сервере Oracle.Вот мой код,

private const string InsertCallProc =
        @"CREATE OR REPLACE PROCEDURE INSERTCALL (Id in varchar2,No in varchar2,
           Surname in varchar2, Name in varchar2, CallType in varchar2,
           CallDate in date, CallNo in varchar2, VoiceNetwork in varchar2,
           Type in varchar2,TalkTime in number,PriceWithDiscount in number,
           PriceWithoutDiscount in number, LmTime in date)
        AS
            BEGIN
                INSERT INTO TMOBILE_R_CALLS (ID,NO,SURNAME,NAME,CALL_TYPE,CALL_DATE,CALL_NO, 
                    VOICE_NETWORK, TYPE,TALK_TIME, PRICE_WITH_DISCOUNT, PRICE_WITHOUT_DISCOUNT,LM_TIME)
                VALUES(Id, No, Surname, Name, CallType,CallDate, CallNo, VoiceNetwork,Type, TalkTime, 
                    PriceWithDiscount,PriceWithoutDiscount, LmTime);
    END;";

Метод с выполнить этот sql cmd, входной параметр - InsertCallProc поле.

    private void ExecuteNonQueryCmd(string cmdText)
    {
        using (var conn = new OracleConnection(GenerateConnectionString()))
        {
            conn.Open();

            var cmd = new OracleCommand
            {
                Connection = conn,
                CommandText = cmdText
            };

            try
            {
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

Если я вызвал этот метод, процедура будет создана.Но если я проверяю процедуру в PL / SQL разработчику, я вижу это:

Ошибки компиляции для PROCEDURE SYSTEM.INSERTCALL

Ошибка: PLS-00103: обнаружен символ "" при ожиданииодин из следующих:

текущая строка: 1 Текст: СОЗДАТЬ ИЛИ ЗАМЕНИТЬ INSERTCALL ПРОЦЕДУРЫ (идентификатор в varchar2, нет в varchar2,

Я думаю, это вызвано форматированием строки вКод C #. Потому что, если я выполняю тот же код SQL на сервере Oracle, процедура создается без проблем.

Что является хорошим решением для этой проблемы?

Ответы [ 4 ]

2 голосов
/ 18 августа 2011

Это может быть связано с именованием. У вас есть параметр и столбец с именем Type, что в соответствии с этим page является зарезервированным словом.

Я бы также неохотно имел такие же имена для параметров, как и для столбцов. Я бы поставил перед параметрами in или аналогичный, поэтому у меня было бы что-то вроде inId вместо просто Id.

В общем, я бы предложил, чтобы один из способов его тестирования состоял в том, чтобы изменить код для создания очень простой процедуры без параметров, которая ничего не делает, и посмотреть, работает ли она, если это работает, а затем добавить одну параметр и т. д., пока он не сломается.

1 голос
/ 19 августа 2011

Возможно, это новые строки, встроенные в вашу строку C #. Ошибка

Обнаружен символ "" при ожидании одного из следующих действий

указывает мне, что есть специальный символ, который нельзя распечатать. Это также указывает на то, что проблема в первой строке.

Кроме того, обычно создание объектов в схемах SYSTEM или SYS - плохая идея.

Что касается ответов, указывающих пальцем на использование зарезервированного слова: хотя это не очень хорошая практика, скорее всего, это не виновник:

SQL> CREATE OR REPLACE PROCEDURE p(TYPE IN VARCHAR2) IS
  2  BEGIN
  3    dbms_output.put_line(TYPE);
  4  END;
  5  /

Procedure created
SQL> DECLARE
  2  BEGIN
  3    p('This is a test');
  4  END;
  5  /

This is a test

PL/SQL procedure successfully completed

SQL> 
0 голосов
/ 19 августа 2011

Спасибо за ответ, проблема была в форматировании строки в C #.Я решил это следующим образом:

    public static string CreateInsertCallProc =
            "CREATE OR REPLACE PROCEDURE INSERTCALL (inId in varchar2,inSimCard in varchar2,\n" +
                "inSurname in varchar2, inName in varchar2, inCallType in varchar2,\n" +
                "inCallDate in date, inCallNo in varchar2, inVoiceNetwork in varchar2,\n" +
                "inTimeType in varchar2,inTalkTime in number,inPriceWithDiscount in number,\n" +
                "inPriceWithoutDiscount in number, inLmTime in date)\n" +
            "AS\n" +
                "BEGIN\n" +
                    "INSERT INTO TMOBILE_R_CALLS (ID,SIM_CARD,SURNAME,NAME,CALL_TYPE,CALL_DATE,CALL_NO,\n" +
                        "VOICE_NETWORK, TIME_TYPE,TALK_TIME, PRICE_WITH_DISCOUNT, PRICE_WITHOUT_DISCOUNT,LM_TIME)\n" +
                    "VALUES(inId, inSimCard, inSurname, inName, inCallType, inCallDate, inCallNo, inVoiceNetwork,\n" +
                        " inTimeType, inTalkTime,inPriceWithDiscount,inPriceWithoutDiscount, inLmTime);\n" +
        "END;";

Также я изменяю имя столбца с Type на Time_Type и перемещаю таблицу из системы схем

0 голосов
/ 19 августа 2011

Я думаю, что вы не правы с этим выводом:

Потому что, если я выполню тот же код SQL на сервере Oracle, процедура будет создано без проблем.

Процедура создана без ошибок, а затем скомпилирована с ошибками - но без вывода сообщений.

Если вы используете sqlplus или sqlplusw , просто выполните команду SHOW ERRORS сразу после создания процедуры.

Если вы используете расширенные инструменты разработки, такие как PL / SQL Developer , TOAD , SQL Navigator или SQL Developer , просто откройте созданную функцию в специальном окне редактора и попробуйте скомпилировать его здесь. Вы должны увидеть те же ошибки компиляции.

В любом случае вы должны исправить некоторые ошибки в коде процедуры: использование зарезервированных слов (type) в качестве имени параметра и т. Д.

...