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
,