Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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
Java ResultSet中的虚假数据_Java_Database_Oracle_Jdbc_Resultset - Fatal编程技术网

Java ResultSet中的虚假数据

Java ResultSet中的虚假数据,java,database,oracle,jdbc,resultset,Java,Database,Oracle,Jdbc,Resultset,我在使用JDBC的结果集上遇到了一些问题 这是我的亲戚: create table person ( person_id number(5) generated always as identity minvalue 1 maxvalue 99999 increment by 1 start with 1 cycle cache 10, firstname varcha

我在使用JDBC的结果集上遇到了一些问题

这是我的亲戚:

create table person (
person_id   number(5) generated always as identity
            minvalue 1
            maxvalue 99999
            increment by 1 start with 1
            cycle
            cache 10,
firstname   varchar(10) not null,
lastname    varchar(10) not null,
);
我试图在元组中插入一个(firstname,lastname),然后从中获取personid。以下是我的JDBC代码:

//connection is taken care of beforehand and is named con
prep = con.prepareStatement("insert into person (firstname, lastname) values (?, ?)", Statement.RETURN_GENERATED_KEYS);
        prep.setString(1, firstname);
        prep.setString(2, lastname);
        prep.execute();
        ResultSet generated = prep.getGeneratedKeys();
        if (generated.next()) {
            String key = generated.getString("0");
            System.out.println(key);
        }
这一切都很好。但我的问题是键应该是整数,而不是字符串。每次运行这个程序时,我都会得到一个结果集,其中包含一个字符串“aaa3vaaagaafwbaag”,或者类似的东西。我想获取person_id,以便以后在Java程序中使用它

在搜索结果集或语句本身的执行过程中,我是否做错了什么;博士 细节 你的问题似乎很困惑

上的每个
get…
方法有两种形式

  • 传递列号(一个
    int
  • 传递列名(字符串)
你似乎把这两者结合在一起:

String key=generated.getString(“0”)

我怀疑您是否有一个名为单位数零的列。除了名称选择不当外,标准SQL还禁止以数字开头标识符

所以这句话毫无意义。您可能是指第一列使用了零
0
,并错误地将其括在引号中,从而将您想要的
int
转换为实际的
字符串

即使这样的意图也是错误的。文档错误地将
int
描述为“columnIndex”。通常,“索引”是指基于零的计数偏移量。但实际上,
ResultSet::getString(int)
要求您传递一个序号,计数从一开始。因此
getString(0)
永远无效

因此,如果要以文本形式检索结果集第一列的值,请执行以下操作:

String key = generated.getString( 1 ) ; // Retrieve first column of result set as text.
同样,这在代码上下文中是错误的。显然,您正试图检索在插入过程中生成的主键值。您的主键列
person\u id
被定义为
number(5)
,它不是文本类型。因此,作为
字符串进行检索是不合适的

NUMBER(5)
不是标准SQL。如果您碰巧使用的是Oracle数据库,那么这将是一个精度为5的整数类型,即最多有5位数字的数字。因此,在Java中通过调用将其作为整数类型检索

我上面的评论是针对数据库的。但对于Oracle,请参见说明Oracle数据库在调用
getGeneratedKeys
时不返回生成的序列号。相反,它会返回。

tl;博士 细节 你的问题似乎很困惑

上的每个
get…
方法有两种形式

  • 传递列号(一个
    int
  • 传递列名(字符串)
你似乎把这两者结合在一起:

String key=generated.getString(“0”)

我怀疑您是否有一个名为单位数零的列。除了名称选择不当外,标准SQL还禁止以数字开头标识符

所以这句话毫无意义。您可能是指第一列使用了零
0
,并错误地将其括在引号中,从而将您想要的
int
转换为实际的
字符串

即使这样的意图也是错误的。文档错误地将
int
描述为“columnIndex”。通常,“索引”是指基于零的计数偏移量。但实际上,
ResultSet::getString(int)
要求您传递一个序号,计数从一开始。因此
getString(0)
永远无效

因此,如果要以文本形式检索结果集第一列的值,请执行以下操作:

String key = generated.getString( 1 ) ; // Retrieve first column of result set as text.
同样,这在代码上下文中是错误的。显然,您正试图检索在插入过程中生成的主键值。您的主键列
person\u id
被定义为
number(5)
,它不是文本类型。因此,作为
字符串进行检索是不合适的

NUMBER(5)
不是标准SQL。如果您碰巧使用的是Oracle数据库,那么这将是一个精度为5的整数类型,即最多有5位数字的数字。因此,在Java中通过调用将其作为整数类型检索


我上面的评论是针对数据库的。但对于Oracle,请参见说明Oracle数据库在调用
getGeneratedKeys
时不返回生成的序列号。相反,它返回。

您的问题是Oracle默认返回插入记录的ROWID,而不是生成的标识符。发件人:

如果没有明确指示键列,则使用Oracle JDBC驱动程序 无法确定需要检索哪些列。当输入列名时 或者使用列索引数组,Oracle JDBC驱动程序可以识别 列包含要检索的自动生成的键。 但是,当
语句.RETURN\u GENERATED\u KEYS
整数标志为 使用时,Oracle JDBC驱动程序无法识别这些列。当 整数标志用于指示自动生成的关键帧将被删除 返回时,
ROWID
伪列作为键返回。
ROWID
然后可以从
ResultSet
对象中获取,并可用于 检索其他列

因此,如果您使用
语句。返回生成的\u键
,您将获得ROWID,然后可以使用该ROWID选择插入的行以获得其他值(包括生成的标识符)

如果您想专门检索生成的id,对于Oracle,您需要显式地请求该列,如下所示:

String[] columns = { "PERSON_ID" }
prep = con.prepareStatement(
        "insert into person (firstname, lastname) values (?, ?)", columns);
prep.setString(1, firstname);
prep.setString(2, lastname);
prep.executeUpdate();
ResultSet generated = prep.getGeneratedKeys();
if (generated.next()) {
    int key = generated.getInt("PERSON_ID");
    System.out.println(key);
}

您的问题是Oracle在默认情况下返回插入记录的ROWID,而不是生成的标识符。发件人:String[] columns = { "PERSON_ID" } prep = con.prepareStatement( "insert into person (firstname, lastname) values (?, ?)", columns); prep.setString(1, firstname); prep.setString(2, lastname); prep.executeUpdate(); ResultSet generated = prep.getGeneratedKeys(); if (generated.next()) { int key = generated.getInt("PERSON_ID"); System.out.println(key); }