为啥这个 JDBC 语句会导致异常?

Posted

技术标签:

【中文标题】为啥这个 JDBC 语句会导致异常?【英文标题】:Why this JDBC statement causes an exception?为什么这个 JDBC 语句会导致异常? 【发布时间】:2016-03-14 15:29:48 【问题描述】:

我已将 JDBC 与 PostgreSQL 链接。我们如何使用占位符创建视图?

但我收到此错误:

SQL 异常:错误:没有参数 $1 位置:72

queryString = "CREATE VIEW clients AS (SELECT client_id FROM Client WHERE firstname = ?)";
pStatement = conn.prepareStatement( queryString );

System.out.println("Enter the name of a client");
br = new BufferedReader( new InputStreamReader(System.in) );
String client_name = br.readLine();

pStatement.setString(1, client_name);
pStatement.executeUpdate();

最后一行 (pStatement.executeUpdate();) 导致异常。为什么?

【问题讨论】:

不确定在创建查询中是否会正确考虑占位符。查看此主题并尝试打印最终查询,以了解在您的 setString 之后语句的实际外观。 ***.com/questions/2683214/… 您无法创建带有参数的视图(顺便说一句:create view 的选择周围的括号完全没用) 【参考方案1】:

创建一个名为 "clients" 的视图来过滤客户端子集似乎并不可取 - 您确定不只是想要一个准备好的语句,而不是一个视图吗?

如果您确实想动态创建视图,则需要在 Java 中构造 SQL(DDL 语句不能参数化):

String queryString = "CREATE VIEW \"clients_named_%1$s\" AS (SELECT client_id FROM client WHERE firstname = '%1$s')";

System.out.println("Enter the name of a client");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String clientName = br.readLine();

// sanitize in a way that makes sense for your data
clientName = clientName.replaceAll("\\W", "");

Statement stmt = conn.createStatement();
stmt.executeUpdate(String.format(queryString, clientName));

不用说,在这种情况下清理用户输入很重要。

【讨论】:

以上是关于为啥这个 JDBC 语句会导致异常?的主要内容,如果未能解决你的问题,请参考以下文章

求教大神,java中的jdbc程序为啥要加finally,不是加了try catch以后,后面的语句就会执行了啊

为啥在构造函数中抛出异常会导致空引用?

为啥创建静态 const std::string 会导致异常?

为啥创建静态 const std::string 会导致异常?

为啥异常会导致 Node.js 中的资源泄漏?

为啥强制降级会导致 .Net Core 中的程序集加载异常?