首页 > 解决方案 > {"ORA-01036: 非法变量名/编号"} - 更新最后一个数字序列 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();中抛出的错误行

标签: c#oracle

解决方案


由于您的查询有多个应该一次执行的语句(2 个ALTER语句和 1 个语句),因此您必须将它们包装在匿名块中并使用before语句,如下所示:SELECTOPEN ... FORALTER

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 IMMEDIATEforALTER语句并连接参数值,因为您不能在块内将 DDL 语句(CREATEALTERDROP作为静态 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()

相关问题:

Oracle中如何执行多条SQL语句?

尝试更改 sql 块中的表时出错


推荐阅读