{“ ORA-01036:非法的变量名称/编号”}-更新最后一个编号序列Oracle数据库

时间:2018-11-16 02:16:10

标签: c# oracle

我正在尝试使用C#上的文本框更新数据库Oracle中的最后一个序列号。当我尝试执行程序时,收到错误消息 {“ ORA-01036:非法变量名称/数字”} 我正在尝试纠正此问题,但是我没有找到解决方法。我是#C和Oracle数据库的新手。这里有人可以帮助我解决这个问题吗? 先感谢您 这是我的代码

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 :(得分:0)

由于您的查询有多个语句(2条ALTER语句和1条SELECT语句)应立即执行,因此您必须将它们包装在匿名块中,并在{{之前使用OPEN ... FOR 1}}这样的语句:

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并连接参数值,因为您无法执行DDL语句(ALTERCREATE或{ {1}})作为块中的静态SQL:

ALTER

然后在DROP中使用不带冒号(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中的每个语句:

1)// standard cmd8.Parameters.Add("HEADER", HEADER); // alternative cmd8.Parameters.AddWithValue("HEADER", HEADER); 语句必须使用OracleCommand

2)ALTER语句必须使用ExecuteNonQuery()

相关问题:

How to execute multiple SQL statements in Oracle?

Getting error while trying to alter table in an sql block