ResultSet中的虚假数据

ac_*_*ook 0 java database oracle jdbc resultset

我使用JDBC在ResultSet中遇到了一些问题.

这是我的关系:

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,
);
Run Code Online (Sandbox Code Playgroud)

我正在尝试将(名字,姓氏)插入元组,然后获取其中的person_id.这是我的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);
        }
Run Code Online (Sandbox Code Playgroud)

这很好用.但我的问题是密钥应该是整数,而不是字符串.每次我跑,我得到一个包含"AAA3vaAAGAAAFwbAAG",或类似的规定的字符串的ResultSet.我想获取person_id,以便稍后在我的Java程序中使用它.

在搜索ResultSet或执行语句本身方面,我有什么问题吗?

Bas*_*que 5

TL;博士

int id = generated.getInt( 1 ) ;
Run Code Online (Sandbox Code Playgroud)

细节

你的问题似乎很困惑.

每种get…方法有两种形式ResultSet.

  • 传递一个列号(一int)
  • 传递列名(a String)

你好像把这两者合二为一:

String key = generated.getString("0");

我怀疑你有一个以零个数字命名的列.除了是一个糟糕的名称选择,标准SQL禁止用数字启动标识符.

所以这条线毫无意义.也许你的意思是第一列使用零0并错误地将其包装在引号中,从而将您的意图int转换为实际的String.

即使这样的意图也是错的.该ResultSet::getString文档错误地将其描述int为"columnIndex".通常"索引"表示从零开始的计数偏移.但实际上ResultSet::getString( int )要求你传递一个序数,从一开始计数.所以getString( 0 )永远不会有效.

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

String key = generated.getString( 1 ) ; // Retrieve first column of result set as text.
Run Code Online (Sandbox Code Playgroud)

然而,在您的代码中,这将是错误的.您显然正在尝试检索在生成期间生成的主键值INSERT.您的主键列person_id定义为number(5)不是文本类型.因此检索为String不合适.

NUMBER(5)不是标准的SQL.如果您碰巧使用的是Oracle数据库,那么doc说这将是一个精度为5的整数类型,意味着最多五位数的数字.因此,通过调用将其作为Java中的整数类型检索ResultSet::getInt.

int id = generated.getInt( 1 ) ;  // Retrieve the new row’s ID from the first column of the result set of generated key values returned by the `INSERT` prepared statement.
Run Code Online (Sandbox Code Playgroud)

我上面的评论一般是针对数据库的.但是对于Oracle,请参阅Mark Rotteveel回答,解释Oracle数据库在调用时返回生成的序列号getGeneratedKeys.相反,它返回ROWID伪列.