Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否在Oracle SQL Insert语句中返回自动增量值?_Oracle_Coldfusion_Oracle Sqldeveloper_Coldfusion 10_Cfml - Fatal编程技术网

是否在Oracle SQL 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

我有一个Insert语句,它应该返回自动递增的列值。以下是我的插入示例:

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内部函数的解决方案,但我已将其添加到我的答案中