【问题标题】:Return auto increment value in Oracle SQL Insert statement?在 Oracle SQL Insert 语句中返回自动增量值?
【发布时间】:2019-04-19 19:42:27
【问题描述】:

我有应该返回自动增量列值的插入语句。这是我的插入示例:

myQuery = new query();
myQuery.name = "insertRec";
myQuery.setDatasource("db");
mySQL = "
    INSERT INTO myTable (
        First, Last, Email, ActionDate 
    )VALUES(
        :first, :last, :email, :actiondt
    )
";

myQuery.setSQL(mySQL);
myQuery.addParam(name="first", cfsqltype="cf_sql_varchar", value="#trim(form.first)#", maxlength="50");
myQuery.addParam(name="last", cfsqltype="cf_sql_varchar", value="#trim(form.last)#", maxlength="50");
myQuery.addParam(name="email", cfsqltype="cf_sql_varchar", value="#trim(form.email)#", maxlength="320");
myQuery.addParam(name="actiondt", cfsqltype="cf_sql_timestamp", value="#now()#");
myQuery.execute().getResult();
//result = myQuery.execute().getResult(); This line is commented because I was getting error message that test variable is not defined. Not sure why since test is declared and equals to myQuery.execute().getResult();

我运行此代码后,记录将出现在表格中。结果集如下所示:

RecordID  First  Last       Email        ActionDt
   7      John   Woss   jwoss@gmail.com  16-NOV-18

如您所见,RecordID(自动增量)就在那里。我想在 myQuery 完成后获得该值。如何实现?

【问题讨论】:

  • 创建一个局部变量,数字或整数,并将插入更改为 INSERT INTO myTable (...) values (...) RETURNING RecordID into local_variable;
  • 使用myQuery.getPrefix().generatedkey。这应该会为您提供查询中插入的 ID。
  • 只是一个快速的代码审查:与其将now() 作为参数传递,不如让数据库来做。删除addParam() 并将:actiondt 替换为sysdate()。主要区别在于now() 将返回来自 CF 服务器的时间,而sysdate 将是 db 服务器的时间。如果数据库时间没问题,那么使用sysdate 将使用更少的资源并且不会有阻塞的可能性。

标签: oracle coldfusion oracle-sqldeveloper coldfusion-10 cfml


【解决方案1】:

https://stackoverflow.com/a/34894454/432681 中所述,您可以通过相关序列上的 SELECT 检索自动递增的 ID。

因此,您的查询应该如下所示:

mySQL = "
    INSERT INTO myTable (
        First, Last, Email, ActionDate 
    )VALUES(
        :first, :last, :email, :actiondt
    );
    SELECT "sequenceForMyTable".currval from dual;
";

上面链接的答案中也描述了如何获取序列的名称。

https://stackoverflow.com/a/25268870/432681mentioned in the CFML documentation 中概述了第二种方法,它表示您可以使用getPrefix() 函数来访问生成的密钥。请注意,在这种情况下,resultexecute() 方法返回的对象,而不是 getResult()(因为查询不返回结果集)。因此,对于您的示例,您可以通过以下方式获取 ID:

result = myQuery.execute();
newID = result.getPrefix().generatedKey;

【讨论】:

  • 这将对数据库造成又一次打击。不是完全连接,而是另一个查询。我相信所需的信息会与查询对象一起返回给 CF Server。
  • 这就是它在 Oracle 中的工作方式。 INSERT 语句本身不返回 ID。虽然我找到了另一个使用 ColdFusion 内部函数的解决方案,所以我将它添加到我的答案中
猜你喜欢
  • 2010-12-31
  • 2011-10-19
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多