在过程中的oracle语句中插入错误

时间:2018-11-06 16:47:56

标签: sql oracle plsql oracle11g procedure

                        try
                        {
                            oESHIH.Fields.FieldByName("INVNUMBER").SetValue(sInvoiceNumber, true);
                        }
                        catch(Exception ex)
                        {
                            WriteLogFile.WriteLog("Error inserting invoice number: " + sInvoiceNumber + " for customer: " + sCustomerID);

                            for (int i = 0; i < accpacSession.Errors.Count; i++)
                            {
                                WriteLogFile.WriteLog("Sage error message: " + accpacSession.Errors[i].Message);
                            }
                        }

当我尝试执行该插入操作时,出现ORA-00984错误,我认为它的一切似乎都很好,而且我无法弄清楚自己做错了什么。

错误表明此处不允许使用该列。

1 个答案:

答案 0 :(得分:1)

该错误表明您的变量是一个字符串,因此您必须将其用语句中的单引号引起;并且由于它们将位于另一个字符串(语句本身)内,因此需要对其进行转义。

在评论中,id_seq是一个字符串,id_fk是一个数字,因此类似:

stmt_ins_bck:= 'insert into sii_bck_tab(id_bck_tab,nome_tab,id_bck_cfg_tab) VALUES ('
  || SII_BCK_TAB_ID_SEQ.CURRVAL || ',''' || id_seq || ''',' || id_fk || ')';
-------------------------------------^^................^^ escaped single quotes
EXECUTE IMMEDIATE stmt_ins_bck;

但是使用绑定变量更简单并且通常更有效:

stmt_ins_bck:= 'insert into sii_bck_tab(id_bck_tab,nome_tab,id_bck_cfg_tab) VALUES (:v1,:v2,:v3)';
EXECUTE IMMEDIATE stmt_ins_bck USING SII_BCK_TAB_ID_SEQ.CURRVAL, id_seq, id_fk;

或者可能是因为序列引用在语句的固定部分中是合理的:

stmt_ins_bck:= 'insert into sii_bck_tab(id_bck_tab,nome_tab,id_bck_cfg_tab) VALUES (SII_BCK_TAB_ID_SEQ.CURRVAL,:v1,:v2)';
EXECUTE IMMEDIATE stmt_ins_bck USING id_seq, id_fk;