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

Я пытаюсь создать хранимую процедуру из C# в 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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам