是否在Oracle SQL Insert语句中返回自动增量值?
我有一个Insert语句,它应该返回自动递增的列值。以下是我的插入示例:是否在Oracle SQL Insert语句中返回自动增量值?,oracle,coldfusion,oracle-sqldeveloper,coldfusion-10,cfml,Oracle,Coldfusion,Oracle Sqldeveloper,Coldfusion 10,Cfml,我有一个Insert语句,它应该返回自动递增的列值。以下是我的插入示例: myQuery = new query(); myQuery.name = "insertRec"; myQuery.setDatasource("db"); mySQL = " INSERT INTO myTable ( First, Last, Email, ActionDate )VALUES( :first, :last, :email, :actiondt
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
mySQL = "
INSERT INTO myTable (
First, Last, Email, ActionDate
)VALUES(
:first, :last, :email, :actiondt
);
SELECT "sequenceForMyTable".currval from dual;
";
如您所见,RecordID(自动递增)就在那里。我希望在我的查询完成后获得该值。如何实现这一点?如中所述,您可以通过选择相关序列来检索自动递增的ID
因此,您的查询应该如下所示:
RecordID First Last Email ActionDt
7 John Woss jwoss@gmail.com 16-NOV-18
mySQL = "
INSERT INTO myTable (
First, Last, Email, ActionDate
)VALUES(
:first, :last, :email, :actiondt
);
SELECT "sequenceForMyTable".currval from dual;
";
如何获得序列的名称也在上面的链接答案中描述
和中还介绍了第二种方法,即可以使用getPrefix()
函数访问生成的密钥。请注意,在本例中,result
是由execute()
方法返回的对象,而不是getResult()
(因为查询不返回结果集)。因此,对于您的示例,这是如何获取ID的:
result = myQuery.execute();
newID = result.getPrefix().generatedKey;
创建一个局部变量、数字或整数,并将insert更改为insert到myTable(…)值(…),将RecordID返回到局部变量中;使用myQuery.getPrefix().generatedkey。这将为您提供查询中插入的ID。只需快速查看代码:不要将
now()
作为参数传递,只需让数据库执行即可。移除addParam()
并将:actiondt
替换为sysdate()
。主要区别在于now()
将返回来自CF服务器的时间,sysdate
将返回数据库服务器的时间。如果数据库时间正常,那么使用sysdate
将使用更少的资源,并且不会有阻塞的可能。这将对数据库造成另一次冲击。不是完全连接,但仍然是另一个查询。我相信所需的信息将与查询对象一起返回到CF服务器。这就是它在Oracle中的工作方式。INSERT语句本身不返回ID。虽然我发现了另一个使用ColdFusion内部函数的解决方案,但我已将其添加到我的答案中