Поскольку ваш запрос имеет несколько операторов (2 ALTER
операторы и 1 SELECT
оператор), которые должны выполняться одновременно, вы должны заключить их в анонимный блок и использовать OPEN ... FOR
перед ALTER
операторами, подобными этому:
OracleCommand cmd8 = new OracleCommand(@"BEGIN
OPEN :1 FOR ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY LPAD(TO_NUMBER(:HEADER),0);
SELECT TMCI_SEQ_BC_AJU_HEADER.NEXTVAL FROM DUAL;
OPEN :2 FOR ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY 1;
END;", db);
Если приведенный выше запрос не работает, используйте EXECUTE IMMEDIATE
для операторов ALTER
и объедините значение параметра, поскольку вы не можете выполнять операторы DDL (CREATE
, ALTER
или DROP
) как статический SQL внутри блока:
OracleCommand cmd8 = new OracleCommand(@"BEGIN
EXECUTE IMMEDIATE 'ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY LPAD(TO_NUMBER(' || :HEADER || '),0)';
SELECT TMCI_SEQ_BC_AJU_HEADER.NEXTVAL FROM DUAL;
EXECUTE IMMEDIATE 'ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY 1';
END;", db);
Затем используйте имя параметра без префикса двоеточия (:
) в OracleCommand.Parameters
:
// standard
cmd8.Parameters.Add("HEADER", HEADER);
// alternative
cmd8.Parameters.AddWithValue("HEADER", HEADER);
КакВ крайнем случае, если приведенные выше решения не работают, используйте каждый оператор внутри OracleCommand
отдельно с этим условием:
1) ALTER
операторы должны использовать ExecuteNonQuery()
2) SELECT
оператор должен использовать ExecuteReader()
Связанные проблемы:
Как выполнить несколько операторов SQL в Oracle?
Получение ошибки припытается изменить таблицу в блоке sql