Firebird: изменить таблицу и создать хранимую процедуру из С#

Я пытаюсь создать хранимую процедуру из С# в Firebird 2.1. Код такой:

String sql = @"EXECUTE BLOCK AS BEGIN " +
    "ALTER TABLE EXAMPLE ALTER FIELD1 TYPE Char(50); " +
    "SET TERM ^ ; CREATE PROCEDURE name ( input_parameter_name < datatype>, ... )" + 
    "RETURNS ( output_parameter_name < datatype>, ... ) AS DECLARE VARIABLE variable_name < datatype>;" +
    "BEGIN /* write your code here */ END^ SET TERM ; ^" + 
    " END";

    public int Execute(string sql)
    {
        int result = 0;

        if (this.OpenConnection() == true)
        {
            FbTransaction transaction = Fbconnection.BeginTransaction();
            try
            {
                FbCommand command = new FbCommand(sql, Fbconnection, transaction);
                int rc = command.ExecuteNonQuery();
                result = rc;
                transaction.Commit();
            }
            catch (Exception e)
            {
                globals.logfile.log(e.ToString());
                globals.logfile.flush();
                result = 0;
            }
            finally
            {
                this.CloseConnection();
            }
        }
        return result;
    }

Приведенное сообщение об ошибке:

FirebirdSql.Data.FirebirdClient.FbException (0x80004005):
Ошибка динамического SQL Код ошибки SQL = -104 Неизвестный токен — строка 1, столбец 24 ALTER

Должно быть что-то маленькое, но я не могу понять.


person Giancarlo    schedule 16.02.2014    source источник


Ответы (1)


DDL не разрешен в PSQL (хранимые процедуры, триггеры, блок выполнения), поэтому выполнение подобного ALTER TABLE отклоняется.

Также SET TERM не является частью синтаксиса операторов Firebird. Это характерно для инструментов запросов, таких как isql и FlameRobin, поскольку они используют терминаторы операторов, такие как ;, чтобы узнать, когда достигнут конец оператора и могут быть отправлены на сервер. При выполнении блоков PSQL эти инструменты должны следить за другим терминатором оператора, чтобы предотвратить отправку неполных операторов на сервер. В реальном синтаксисе оператора Firebird ; является только частью блоков PSQL.

Вам нужно будет выполнить ALTER TABLE и CREATE PROCEDURE отдельно без EXECUTE BLOCK.

person Mark Rotteveel    schedule 17.02.2014
comment
Привет, Марк, мне потребовалось некоторое время, чтобы вернуться к этому, но я протестировал его, и он отлично работает. В очередной раз благодарим за помощь. - person Giancarlo; 22.02.2014