我想在Oracle Connection URL
jdbc:oracle:thin:@<server>:<port1521>:<sid>
我的示例SQL语句:
select monkey_name from animals.monkey
我需要查询没有模式前缀animals.
的数据库,即当我运行此语句时
select monkey_name from monkey
默认情况下会使用animals
架构。
我需要在上面的连接URL中指定什么才能获得这样的效果?
感谢。
答案 0 :(得分:34)
您无法在连接网址中添加任何内容。
在Oracle中,每个用户都有自己的架构(即使不包含任何对象),这是他们的默认架构。登录/连接后,他们可以使用
更改其默认架构ALTER SESSION SET CURRENT_SCHEMA=animals
所以你需要在连接后做额外的声明。 可以在用户和/或数据库上有一个登录触发器,当他们登录时会运行它。我个人更喜欢在应用程序连接时使用显式语句。
答案 1 :(得分:13)
如果您使用C3PO,则可以在检查连接时执行此操作。
作为属性:
c3p0.preferredTestQuery=alter session set current_schema=animals
c3p0.testConnectionOnCheckout=true
作为Java代码:
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setPreferredTestQuery("alter session set current_schema=animals");
dataSource.setTestConnectionOnCheckout(true);
下行是每次从池中取出连接时都会发生这种情况。
如果您自己使用JDBC连接,则可以这样做:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = getConnection("jdbc:oracle:thin:@//server:1521/instance", "username", "password");
connection.createStatement().execute("alter session set current_schema=animals"));
答案 2 :(得分:11)
使用同义词怎么样?
create synonym monkey for animals.monkey;
select monkey_name from monkey
答案 3 :(得分:0)
您可以使用连接数据库用户创建触发器来更改当前架构。
create or replace trigger SET_SCHEMA_AFTER_LOGON
after logon on database
begin
execute immediate 'alter session set CURRENT_SCHEMA=animals';
end SET_SCHEMA_AFTER_LOGON;
答案 4 :(得分:0)
从 Java 1.7 开始,java.sql.Connection
上就有一个 setSchema
方法。
在 Oracle 的 oracle.jdbc.driver.PhysicalConnection
实现中,此方法执行 alter session set current_schema = ?
语句。