PostgreSQL/JDBC - 如何准备调用带有参数 CITEXT (TEXT) 的函数?
PostgreSQL/JDBC - How do I prepare-call a function with parameter CITEXT (TEXT)?
我创建了一个带有 CITEXT
列的 table,CITEXT
(TEXT
的不区分大小写的版本)是我之前使用 [=17= 加载的扩展]
CREATE TABLE artists (
artist_id SERIAL PRIMARY KEY,
artist CITEXT UNIQUE NOT NULL
);
CREATE OR REPLACE FUNCTION add_artist(_artist CITEXT) RETURNS INTEGER AS $$
DECLARE
_artist_id INT;
BEGIN
SELECT artist_id INTO _artist_id FROM artists WHERE artist = _artist;
IF (_artist_id IS NULL) THEN
INSERT INTO artists (artist) VALUES (
_artist
) RETURNING artist_id INTO _artist_id;
END IF;
RETURN _artist_id;
END;
$$ LANGUAGE plpgsql;
现在我尝试使用
调用java中的函数
public int addArtist(String name) throws SQLException {
int artist_id;
try (CallableStatement callableStatement =
connection.prepareCall("{ ? = CALL add_artist(?) }")) {
callableStatement.registerOutParameter(1, Types.INTEGER);
callableStatement.setString(2, name);
callableStatement.execute();
artist_id = callableStatement.getInt(1);
}
return (artist_id != 0) ? artist_id : -1;
}
如果传递给 sql 函数的参数是 INTEGER
或 VARCHAR(n)
.
类型,则调用函数的相同方法工作正常
我假设 callableStatement.setString(2, name);
抛出 SQLException
因为 setString()
将用于 VARCHAR(n) 字段?
org.postgresql.util.PSQLException: ERROR: function add_artist(character varying) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Position: 15
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:465)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:458)
at postgresql.PostgreSQL.addArtist(PostgreSQL.java:61)
at postgresql.PostgreSQLConnector.main(PostgreSQLConnector.java:26)
CallableStatement
没有像 setText(int i, String text)
这样的方法 - 我必须使用什么来代替?
我终于明白了。我所要做的就是使用 ::citext
.
将参数转换为 CITEXT
public int addArtist(String name) throws SQLException {
int artist_id;
try (CallableStatement callableStatement =
connection.prepareCall("{ ? = CALL add_artist(?::citext) }")) {
callableStatement.registerOutParameter(1, Types.INTEGER);
callableStatement.setString(2, name);
callableStatement.execute();
artist_id = callableStatement.getInt(1);
}
return (artist_id != 0) ? artist_id : -1;
}
我创建了一个带有 CITEXT
列的 table,CITEXT
(TEXT
的不区分大小写的版本)是我之前使用 [=17= 加载的扩展]
CREATE TABLE artists (
artist_id SERIAL PRIMARY KEY,
artist CITEXT UNIQUE NOT NULL
);
CREATE OR REPLACE FUNCTION add_artist(_artist CITEXT) RETURNS INTEGER AS $$
DECLARE
_artist_id INT;
BEGIN
SELECT artist_id INTO _artist_id FROM artists WHERE artist = _artist;
IF (_artist_id IS NULL) THEN
INSERT INTO artists (artist) VALUES (
_artist
) RETURNING artist_id INTO _artist_id;
END IF;
RETURN _artist_id;
END;
$$ LANGUAGE plpgsql;
现在我尝试使用
调用java中的函数public int addArtist(String name) throws SQLException {
int artist_id;
try (CallableStatement callableStatement =
connection.prepareCall("{ ? = CALL add_artist(?) }")) {
callableStatement.registerOutParameter(1, Types.INTEGER);
callableStatement.setString(2, name);
callableStatement.execute();
artist_id = callableStatement.getInt(1);
}
return (artist_id != 0) ? artist_id : -1;
}
如果传递给 sql 函数的参数是 INTEGER
或 VARCHAR(n)
.
我假设 callableStatement.setString(2, name);
抛出 SQLException
因为 setString()
将用于 VARCHAR(n) 字段?
org.postgresql.util.PSQLException: ERROR: function add_artist(character varying) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Position: 15
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:465)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:458)
at postgresql.PostgreSQL.addArtist(PostgreSQL.java:61)
at postgresql.PostgreSQLConnector.main(PostgreSQLConnector.java:26)
CallableStatement
没有像 setText(int i, String text)
这样的方法 - 我必须使用什么来代替?
我终于明白了。我所要做的就是使用 ::citext
.
CITEXT
public int addArtist(String name) throws SQLException {
int artist_id;
try (CallableStatement callableStatement =
connection.prepareCall("{ ? = CALL add_artist(?::citext) }")) {
callableStatement.registerOutParameter(1, Types.INTEGER);
callableStatement.setString(2, name);
callableStatement.execute();
artist_id = callableStatement.getInt(1);
}
return (artist_id != 0) ? artist_id : -1;
}