{"ORA-01036: недопустимое имя / номер переменной"} - Обновить базу данных Oracle с последней последовательностью номеров - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь обновить последний номер последовательности в оракуле базы данных, используя текстовое поле на C #.Когда я пытался выполнить свою программу, я получал сообщение об ошибке {"ORA-01036: недопустимое имя / номер переменной"} Я пытаюсь исправить эту проблему, но не нашел, как ее исправить,Я новичок в #C и Oracle Database.Может ли кто-нибудь здесь помочь мне решить эту проблему.Заранее спасибо Вот мой код

private void IDHEADER()
    {
        var result7 = new StringBuilder();
        using (var connectio1n = new OracleConnection(@"Data Source=mcf;Persist Security Info=True;User ID=tmci38001;Password=tmci38001;"))
        {
            string CommandText2 = "SELECT LAST_NUMBER FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'TMCI_SEQ_BC_AJU_HEADER'";
            OracleCommand command2 = new OracleCommand(CommandText2, connectio1n);
            connectio1n.Open();
            using (OracleDataReader dr = command2.ExecuteReader())
            {
                while (dr.Read())
                {
                    String a = dr[0].ToString();
                    ID_HEADER.Text = a;

                }
            }
        }
    }
private void btnUpd_Click(object sender, EventArgs e)
    {
        Cursor = Cursors.WaitCursor;
        DialogResult result = MessageBox.Show("Update Sequence ?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (result == DialogResult.Yes)
        {
            if (string.IsNullOrEmpty(ID_HEADER.Text))
            {
                MessageBox.Show("Please Fill in all necessary fields",
                                 "Incomplete Input", MessageBoxButtons.OK,
                                     MessageBoxIcon.Error);
            }
            else
            {
        String HEADER = ID_HEADER.Text.Trim();
OracleConnection db = new OracleConnection("Data Source=mcf;Persist Security Info=True;User ID=tmci38001;Password=tmci38001;");
db.Open();
OracleCommand cmd8 = new OracleCommand("ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY LPAD(TO_NUMBER(:HEADER),0); SELECT TMCI_SEQ_BC_AJU_HEADER.NEXTVAL FROM DUAL; ALTER SEQUENCE TMCI_SEQ_BC_AJU_HEADER INCREMENT BY 1 ", db);

          cmd8.BindByName = true;
          cmd8.Parameters.Add(":HEADER", HEADER);
          OracleDataReader oraReader8 = null;
          oraReader8 = cmd8.ExecuteReader();
          oraReader8.Close();
          db.Close();
          db.Dispose();
          IDHEADER();
          Cursor = Cursors.Default;
          MessageBox.Show("BC Sequence Successfully updated...");
            }
        }
    }

В качестве дополнительной информации выдается строка ошибки oraReader8 = cmd8.ExecuteReader ();

1 Ответ

0 голосов
/ 16 ноября 2018

Поскольку ваш запрос имеет несколько операторов (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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...