gpt4 book ai didi

Java Oracle jdbc COLUMN 语句

转载 作者:行者123 更新时间:2023-12-01 19:03:57 25 4
gpt4 key购买 nike

问题如下通过在 SQL Plus 中执行以下查询,一切都很完美:

column firstname new_value v_firstname
select firstname from tbcustomer where customer_id = 111
select '&v_firstname', wrk.* from tbwork where customer_id = 111

但是当我尝试从Java程序执行这些查询时,我在第一个SQL查询上得到java.sql.SQLException: ORA-00900: invalid SQL statements

        Connection connection = null;
Statement stat = null;
String query = "column due_date new_value v_due_date";
try {

// Load the JDBC driver
String driverName = "oracle.jdbc.driver.OracleDriver";
Class.forName(driverName);
connection = DriverManager.getConnection(url, username, password);
stat = connection.createStatement();
boolean res_num = stat.execute(query);

} catch (ClassNotFoundException e) {
// Could not find the database driver
} catch (SQLException e) {
e.printStackTrace();
}

现在的问题是如何克服这个错误并执行第一个查询,或者您是否有任何其他解决方案来在 oracle session 上定义变量并在其他 SQL 语句中使用它。例如,第三个查询是我需要执行的众多查询之一,所有查询都将具有相同的名字字段

最佳答案

column 是一个 SQL*Plus 命令。它在 SQL 或 PL/SQL 中无效,因此您不能在 Java 应用程序中使用它。像 &v_firstname 这样的替换变量也是 SQL*Plus 构造——它们在 SQL 或 PL/SQL 中无效,因此不能在 Java 应用程序中使用它们。

如果您的目标是在单个查询中从 tbcustomer 获取 firstname 以及从 tbwork 获取所有列,则需要加入两张 table 。假设两个表都有一个 customer_id 列,这就是两个表应该如何连接

SELECT cust.firstname,
work.*
FROM tbcustomer cust
JOIN tbwork work ON (cust.customer_id = work.customer_id)
WHERE cust.customer_id = 111

假设您将对多个 customer_id 值执行此查询,但是 111 应该是绑定(bind)变量而不是文字,并且您的 Java 代码应该使用 PreparedStatement 准备 SQL 语句,然后在执行查询之前使用 setInt 方法绑定(bind)一个值,例如 111。

如果您想将其分成两个数据库调用,您可以简单地执行以下操作

PreparedStatement stmtGetFirstName = connection.prepareStatement("select firstname from tbcustomer where customer_id = ?");
stmtGetFirstName.setInt( 1, 111 );
ResultSet rsGetFirstName = stmtGetFirstName.executeQuery();
String firstName = rsGetFirstName.getString();

PreparedStatement stmtGetWork = connection.prepareStatement("select ?, work.* from tbwork where customer_id = ?");
stmtGetWork.setString( 1, firstName );
stmtGetWork.setInt( 2, 111 );
ResultSet rsGetWork = stmtGetWork.executeQuery();

如果您可以保证所有 6 亿次执行都发生在同一个数据库 session 中,则可以使用数据库上下文。您需要创建上下文及其在数据库中使用的包

SQL> create or replace context fname_ctx using scott.pkg_get_fname;

Context created.

SQL> ed
Wrote file afiedt.buf

1 create or replace package pkg_get_fname
2 is
3 procedure set_fname( p_customer_id in number );
4 function get_fname return varchar2;
5* end;
SQL> /

Package created.

SQL> create or replace package body pkg_get_fname
2 is
3 procedure set_fname( p_customer_id in number )
4 as
5 begin
-- Obviously, you'd get the data here from your table rather than hard-coding 'Bob'
6 dbms_session.set_context( 'fname_ctx', 'fname', 'Bob' );
7 end;
8
9 function get_fname
10 return varchar2
11 is
12 l_fname varchar2(100);
13 begin
14 l_fname := sys_context( 'fname_ctx', 'fname' );
15 return l_fname;
16 end;
17 end;
18 /

Package body created.

在 Java 中,您可以调用 pkg_get_fname.set_fname(111) 来设置上下文并在查询中使用函数 pkg_get_fname.get_fname

然而,关心性能并计划从 Java 对数据库执行 6 亿次查询似乎很奇怪。这将涉及中间层和数据库服务器之间通过网络进行的大量往返——如果您真的关心性能,您可以将该工作推送到数据库中的存储过程,以消除网络往返——旅行。事实上,您多次执行它们让我怀疑您正在执行大量的逐行处理,而不是让数据库执行基于集合的操作。这也将成为绩效不佳的主要原因。另外,数据库天生就是为了连接而生的,因此假设适当的索引就位,像这样的简单连接会明显增加查询成本,这是很不寻常的。

关于Java Oracle jdbc COLUMN 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11019428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com