我有一些空间数据集,这些数据集可以在开源元数据目录软件GeoNetwork和PostGIS数据库中获得。问题是创建数据库的学生对相同的数据集使用不同的ID。因此,GeoNetwork中的ID与PostGIS数据库中的ID不同。他们只有相同的名字。
如果有人将新数据集上载到GeoNetwork中,也会将相同的数据集上载到PostGis数据库中。我希望将ID列添加到数据库中,以便给字段提供与GeoNetwork中的ID相同的ID。我认为我只能通过使用文件名来做到这一点,因为在这两种情况下它们是相同的。
我想用以下代码修改eclipse中的表:
Connection con = null;
PreparedStatement ps = null;
final String sqlps = "ALTER TABLE ? ADD COLUMN ?";
String filen = filename.substring(0, filename.indexOf('.'));
try {
con = DriverManager.getConnection("jdbc:postgresql_postGIS://localhost:5433/geonetwork?user=postgres&password=dominik1");
try {
ps = con.prepareStatement(sqlps);
ps.setString(1, filen);
ps.setString(2, "GN_ID");
ps.execute();但我发现了一个错误:
Exception:org.postgresql.util.PSQLException:错误:语法错误在$1位置: 13
看来Postgres在准备好的语句中与?有问题。有人知道这个问题的解决办法吗?
我也尝试使用一个普通语句,但这给了我一个findbug错误,我试图将一个非常量字符串传递给sql语句上的execute方法。所以我真的不知道怎么解决这个问题。
发布于 2014-08-27 01:52:40
坏消息是:准备好的陈述不是那样工作的。参数只能是数据,不能是代码或标识符。
好消息是:根本不需要ALTER TABLE语句的参数。
final String sqlps = "ALTER TABLE filen ADD COLUMN gn_id integer";
...
ps = con.prepareStatement(sqlps);
ps.execute();integer。之后可能会添加一个NOT NULL约束。发布于 2014-08-26 17:46:10
不能将?参数用于标识符。这在数据库品牌中很常见。
使用格式(),如下所示:
text sql = format('ALTER TABLE %I ADD COLUMN %I', table_name, column_name);
%I的意思是标识符。它将在替换%I值时使用标识符规则。
为了增加安全性,您可以使用白名单字符和标识符名,如果它们不传递白名单,则抛出异常。
PostgreSQL将静默地截断超过64个字符的标识符名,因此请记住这一点。
https://dba.stackexchange.com/questions/74990
复制相似问题