oracle book
oracle 实例(Instance)和数据库(Database)的区别
实例:是一个非固定的、基于内存的基本进程与内存结构。当服务器关闭后,实例也就不存在了。
数据库(Database)指的是固定的、基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等。
一般情况下,Oracle数据库都是一个数据库对应一个实例
实例就是一组操作系统进程(或者是一个多线程的进程)以及一些内存。这些进程可以操作数据库;而数据库只是一个文件集合(包括数据文件、临时文件、重做日志文件和控制文件)。在
任何时刻,一个实例只能有一组相关的文件(与一个数据库关联)。大多数情况下,反过来也成立:一个数据库上只有一个实例对其进行操作。不过,Oracle的真正应用集群(Real
Application Clusters,RAC)是一个例外,这是Oracle提供的一个选项,允许在集群环境中的多台计算机上操作,这样就可以有多台实例同时装载并打开一个数据库(位于一组共享物理磁盘
上)。由此,我们可以同时从多台不同的计算机访问这个数据库。
每个用户都有一个schema是正确的,而且用户和其对应schema是唯一的关系,可以把与之对应的schema想象成就是此用户。
一个数据库应该可以包含多个用户,每一个用户都可以存在于各自的tablespace上,也可以共用1个,如果一个用户就是一个数据库,那么这个数据库最多只是一个表空间而已,而实际上
一个数据库要包含多个表空间(system sysaux users temp ……)。
是建立多个数据库或是建立多个用户,应该从你的实际业务需求出发,进行设计。
oracle 基本语句
-- 建表 create table tableA ( c_id int,c_name char(10),n_sal number(10,2) ); -- 加列 alter table tableA add abc char(10); -- 更新
-- 加了where id = 1 绝对用了行锁,把 id = 1 的这一行锁起来了,别的事务要再使用该语句时会挂停在语句那里 update tableA set id = 3 where id = 1; -- 删 delete tableA where id = 3; -- 扔表 drop table tableA purge;(永久) -- 删除2个表后 drop table table1; drop table table2; select * from tab;显示如下 TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- A TABLE BIN$0LXNXtRrmArgQAB/AQAJTw==$0 TABLE BIN$0LXNXtRsmArgQAB/AQAJTw==$0 TABLE purge recyclebin; 就把回收站的清空了,显示如下 TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- A TABLE -- 没有purge之前的话可以用这个来恢复 flashback table emp to before drop; -- 修改列名 alter table tbl_student rename column name_old to name_new; -- 表名注释 comment on TABLE tbl_student IS '学生表'; -- 列注释 comment on column tbl_student.name IS '姓名'; -- (大写为系统命令) SELECT * FROM student; -- 修改表名 ALTER TABLE student_old RENAME TO student_new; -- 修改列名 alter table student rename column name_old to name_new; -- 修改列结构 alter table student modify (name varchar2(16) default 'unknown');
-- 删除某一列
alter table student drop column name;
-- 添加索引
create index student_name on student(c_name);
create unique index student_id on student(c_id);
-- 删除索引
drop index student_name;
-- 查询索引 通过表名select
*
from
user_indexes
where
table_name=
upper
(
'表名'
);
-- 查询索引 通过索引名select
*
from
user_ind_columns
where
index_name=(
'索引名'
);
-- 查昨天
SELECT TRUNC(SYSDATE - 1, 'DD') FROM DUAL; -- 打印 2016/11/28
-- 查看所有用户
select username from dba_users;
-- 查看当前用户能看到的表
select * from user_tables;
ORACLE下有三个视图
-
DBA_TABLES 拥有DBA角色的用户可以查看系统中的所有表
-
USER_TABLES 登录数据库的当前用户拥有的所有表
-
ALL_TABLES 登录数据库的当前用户有权限查看的所有表
类似的,除了表,还有视图、存储过程、同义词等等对象,使用[DBA|USER|ALL]_TABLES可以查看到你想要的对象
两张表数据差异比较:
select * from A minus select * from B;
select * from B minus select * from A;
查匹配信息
-- regexp_substr(data,pattern) 取匹配到的串,如果c_req_xml为lob,则查出结果仍为lob不方便查看 select regexp_substr(t.c_req_xml ,'<NAME>.*</NAME>'), t.* from tbl_log_packet a ; -- dbms_lob.substr(lobdata,length,start_index) : 把lob转成str显示,方便在plsql中查看 select dbms_lob.substr (t.c_req_xml ,200,1) , t.* from tbl_log_packet a ; -- 结合使用 先用正则拿到简单的匹配lob串,然后把lob串转换成字符串 select dbms_lob.substr (regexp_substr(t.c_req_xml ,'<NAME>.*</NAME>'),200,1) , t.* from tbl_log_packet a ;
时间转换
-- 字符串转日期 to_date('2018-11-22 09:11:22','yyyy-mm-dd hh24:mi:ss'); -- 日期转字符串 to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') --取年份 select to_number(to_char(sysdate,'yyyy')) from dual --取月 select to_number(to_char(sysdate,'mm')) from dual
时间差:
-- START_DATE,END_DATE,计算这两个日期的时间差(分别以天,小时,分钟,秒,毫秒): -- 天: ROUND(TO_NUMBER(END_DATE - START_DATE)) -- 小时: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24) -- 分钟: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60) -- 秒: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60) -- 毫秒: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60 * 1000)
参考: http://www.cnblogs.com/xiao-yu/archive/2011/05/24/2055967.html
ORACLE恢复删除表或表记录
查看语句600分钟前的表数据
select * from web_isc_timetask as of timestamp (systimestamp - interval '600' minute) ;
oracle 监听配置
-- 查看用户 select username from dba_users; drop user tim cascade ; @*******************.sql执行脚本 sqlplus sys/oracle@bobo as sysdba conn bobo/bobo123@bobodb lsnrctl start开启监听 lsnrctl status D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora 修改这个,添加linux配置: timran11g = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.88)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = bobodb ) ) )
oracle数据类型和对应的java类型
oracle 锁表 解锁语句
查看锁表语句
select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid;
或者
select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID;
得到查询结果如下:
杀锁表进程
alter system kill session '206,36529';
oracle解析sql排查是否走索引
-- 先执行 explain plan for select * from SYS_USER where USERNAME='张三'; -- 后执行 select * from table(dbms_xplan.display);
数据库学习(三)----Oracle通过执行计划查看查询语句是否使用索引【纯转】==>https://www.cnblogs.com/whatlonelytear/p/11934356.html
索引优化问题
问: oracle where的执行顺序是从左往右那么可以过滤掉最多纪录的条件不是应该放在最左边么,为什么书上说最右?
答: 这个在ORACLE RBO (基于规则的优化器)时代还可能会有影响, 但是10g之后RBO被废弃了 现在都是CBO,基于成本的优化器 CBO是不吃你说的这一套的, 所以你无需在乎这些教条
https://zhidao.baidu.com/question/1638061886803896620.html
修改客户端编码为UTF-8
- 打开注册表,进入到HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_OraClient11g_home1
- 把SIMPLIFIED CHINESE_CHINA.ZHS16GBK 改为 SIMPLIFIED CHINESE_CHINA.AL32UTF8
oracle怎么在字符字段中查出只包含数字的数据
select * from tableA where regexp_substr("查询字段",'[0-9]+');
oracle 创建dblink databaselink
-- Create database link create database link LINK_Produce2TestProducebobo connect to zsmw IDENTIFIED BY zsmw123 using '(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521)) ) (LOAD_BALANCE = yes) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = zswx) (FAILOVER_MODE = (TYPE = SELECT) (METHOD = BASIC) (RETRIES = 180) (DELAY = 5) ) ) )';
上面的 identified by zsmw123 如果密码是纯数字,那么一定要加双引号 "123456". 不然...
然后就可以使用啦,如下
TRUNCATE TABLE WEB_PRD_PROD; INSERT INTO WEB_PRD_PROD (select *from WEB_PRD_PROD@LINK_Produce2TestProducebobo);
如果用的过程中发现,没有使用dblink的权限,那么运行下面代码
grant create database link to bobo ; --只有bobo用户能使用的dblink grant create public database link to user ;--所有用户都可以使用的dblink,该行的user好像不能更改成bobo之类的 grant drop public database link to user; --删除dblink的权限
还有一种dblink很简洁,但不清楚为什么可以这样
-- Drop existing database link
drop database link PCIS_TEST;
-- Create database link
create database link PCIS_TEST
connect to PCIS_TEST
using '10.15.22.18/V7DBtest2';
另外如果建立了正常的dblink,但是真实使用时超时没反应,可能是用了oracle rac集群,这个时候最好连rac的代理机,而不要连直机上的oracle
oracle 建用户,赋权限
-- 1、在cmd中输入 sqlplus / as sysdba -- 2、删除用户A,级所有和用户A关联的数据 drop user tele cascade; -- 3、重建用户A create user tele identified by tele; -- 4、赋权限 grant dba,connect,resource to tele; -- 5、登入A用户,就ok了 conn tele/tele
修改用户密码
alter user userName identified by "123456";
赋部分权限(补充)
--登录UserB grant all on tablename to UserA; -- 授权所有权限给UserA grant create tablespace to UserA; grant select on tabelname to UserA; grant update on tablename to UserA; grant execute on procedurename to UserA; --授权存储过程给UserA
oracle建表空间
--建表空间 create tablespace TBS_STUDENT nologging datafile '/data/app/oracle/oradata/testenv/student.dbf' size 50m autoextend on next 50m maxsize unlimited extent management local segment space management auto;
oracle 查看 用户,用户权限,用户表空间,用户默认表空间
授权一个用户查询另一个用户下的表.
遇到在某个用户下查询另一个用户下的表数据的情况,然而在没有授权时,会提示无权限操作的错误。那就需要通过授权处理后,再能进行查询操作,下面我们来看看是怎么处理的。
-- 1. a用户下授权查询所有表和视图给b用户 select 'grant select on a.' || tname || ' to b;' from tab; -- 说明:在a用户下执行该语句,执行后会生成对所有表的赋权限语句,拷贝出来执行就可以了。 -- 2. a用户下授权查询所有表给b用户 select 'grant select on '||table_name||' to b;' from user_tables; -- 3. a用户下授权查询所有序列给b用户 select 'grant select on ' || sequence_name || ' to b;' from dba_sequences where sequence_owner='A'; -- 4. a用户下授权查询单个表给b用户 grant select on a.tablename to b; -- 而授权更新. 删除的 语法和授权查询类似,只是关键字不通而已。 -- 1. 授权a用户下授权更新单个表给b用户 grant update on a.tablename to b; -- 2. 授权a用户下取消给b用户删除单个表的授权 revoke delete on a.tablename from b; -- 3. 授权a用户下授权删除单个表给b用户 grant delete on a.tablename to b; -- 4. 拥有dba权限的用户授权创建dblink给b用户 grant create database link to b; -- 5. 拥有dba权限的用户取消给b用户创建dblink的权限 revoke create database link from b;
授予一个只读用户各种查询权限
from lrr
DROP USER readUser CASCADE; CREATE USER readUser IDENTIFIED BY <password> DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK; -- 3 Roles for readUser GRANT CONNECT TO readUser; GRANT RESOURCE TO readUser; GRANT SELECT_CATALOG_ROLE TO readUser; ALTER USER readUser DEFAULT ROLE ALL; -- 17 System Privileges for readUser GRANT CREATE ANY JOB TO readUser; GRANT CREATE DATABASE LINK TO readUser; GRANT CREATE JOB TO readUser; GRANT CREATE SEQUENCE TO readUser; GRANT CREATE SYNONYM TO readUser; GRANT CREATE VIEW TO readUser; GRANT DEBUG ANY PROCEDURE TO readUser; GRANT DEBUG CONNECT SESSION TO readUser; GRANT EXECUTE ANY PROCEDURE TO readUser; GRANT SELECT ANY CUBE TO readUser; GRANT SELECT ANY CUBE DIMENSION TO readUser; GRANT SELECT ANY DICTIONARY TO readUser; GRANT SELECT ANY MINING MODEL TO readUser; GRANT SELECT ANY SEQUENCE TO readUser; GRANT SELECT ANY TABLE TO readUser; GRANT SELECT ANY TRANSACTION TO readUser; GRANT UNLIMITED TABLESPACE TO readUser;
https://www.cnblogs.com/Devin-Blog/p/5556234.html
oracle 创建临时表
CREATE GLOBAL TEMPORARY TABLE student ( id char(100), name char(100) , weight number(10,2) );
insert into student(id , name , weight) values('4489784','小朋友',64.78 );
oracle 导入导出 dmp
--导出:ROWS=N 表示导出0行数据,只导表结构 exp U_IPCIS_POLICY_PLATFORM/11@192.168.22.117:1521/DWXDBDEV owner=U_IPCIS_POLICY_PLATFORM ROWS=N file=d:/pfp.dmp --导入: imp tele/tele@127.0.0.1:1521/XE file=c:\temp\a.dmp full=y
oracle查看当前库编码
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'; select * from nls_instance_parameters where parameter='NLS_LANGUAGE';
如果显示的是ZHS16GBK,那项目都用UTF-8的话是没什么问题的
oracle 使用Oracle Instantclient 连接PLSQL中文乱码问题详解
说得漂亮:http://www.itozi.net/31697.html
oracle 自带http发送工具
发送大报文,带中文字符或全角字符的时候,一定使用设置长度lengthb而不是length.
utl_http.set_header(req,'Content-Length',lengthb(xmlstr));
oracle clob大字段增删改查
最佳方案(推荐): Java 存储和读取 oracle CLOB 类型字段的实用方法--https://www.cnblogs.com/lishupeng/p/6382225.html
使用PreparedStatement处理,全代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OracleDriver;
import oracle.sql.CLOB;
public class ClobTest {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String user = "his_xs";
String pwd = "123456";
String text = "这是要插入到CLOB里面的数据";
private void clobImport() throws ClassNotFoundException, SQLException {
// TODO Auto-generated method stub
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection(url, user, pwd);// 得到连接对象
String sql = "insert into clob_test(id,str) values ('1',?)";// 要执行的SQL语句
PreparedStatement stmt = conn.prepareStatement(sql);// 加载SQL语句
// PreparedStatement支持SQL带有问号?,可以动态替换?的内容。
Reader clobReader = new StringReader(text); // 将 text转成流形式
stmt.setCharacterStream(1, clobReader, text.length());// 替换sql语句中的?
int num = stmt.executeUpdate();// 执行SQL
if (num > 0) {
System.out.println("ok");
} else {
System.out.println("NO");
}
stmt.close();
conn.close();
}
// 将字CLOB转成STRING类型
public String ClobToString(CLOB clob) throws SQLException, IOException {
String reString = "";
Reader is = clob.getCharacterStream();// 得到流
BufferedReader br = new BufferedReader(is);
String s = br.readLine();
StringBuffer sb = new StringBuffer();
while (s != null) {// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
sb.append(s);
s = br.readLine();
}
reString = sb.toString();
return reString;
}
private void clobExport() throws ClassNotFoundException, SQLException,
IOException {
// TODO Auto-generated method stub
CLOB clob = null;
String sql = "select * from clob_test where id=1";
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection(url, user, pwd);// 得到连接对象
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
String id = "";
String content = "";
if (rs.next()) {
id = rs.getString("id");// 获得ID
clob = (oracle.sql.CLOB) rs.getClob("str"); // 获得CLOB字段str
// 注释: 用 rs.getString("str")无法得到 数据 ,返回的 是 NULL;
content = ClobToString(clob);
}
stmt.close();
conn.close();
// 输出结果
System.out.println(id);
System.out.println(content);
}
public static void main(String[] args) throws Exception {
ClobTest a = new ClobTest();
a.clobImport();
a.clobExport();
}
}
核心代码如下:
PreparedStatement stmt = conn.prepareStatement(sql);// 加载SQL语句 // PreparedStatement支持SQL带有问号?,可以动态替换?的内容。 Reader clobReader = new StringReader(text); // 将 text转成流形式 stmt.setCharacterStream(1, clobReader, text.length());// 替换sql语句中的? int num = stmt.executeUpdate();// 执行SQL
次级方案(推荐): Oracle 插入CLOB字段的简易写法(纯脚本操作插入到CLOB字段)--https://blog.csdn.net/yygg329405/article/details/54926907
通过TO_CLOB方法将字符串转为clob类型,每个转换的参数不能超过2000个字符,多个部分通过连接符 || 连接,测试通过,
但是在使用过程中,如果参数不规范如to_clob('<a>'</a><<>b'),会报异常,适合场合还是不够多
insert tablename(varcharcolumn,clobcolumn) values('string part',to_clob('clob chars part1 ')||to_clob('clob chars part2'))
备用方案: Java 对Oracle Clob(大字符串)格式的操作 增改查--https://www.cnblogs.com/chuanzifan/archive/2012/04/25/2470459.html
plsql对Oracle Clob (大字符串)格式的操作 增改查--使用declare 存过
oracle高效匹配
-- 这个比全匹配要快,当字段为clog,blob大字段时,非常明显 SELECT * FROM web_bas_trd_code WHERE dbms_lob.INSTR(c_class,'1123')>0;
oracle 去中文
select regexp_replace('梅赛德斯 -- 奔驰BJ645-3E2A多用途乘用车', '[€-]') from dual;
显示结果
-- (BJ645-3E2A
oracle clob字段中like查询
select t.id, t.sendxml from historyTBL t where dbms_lob.INSTR(t.sendxml, 'aaa', 1, 1) > 0;
在Oracle中,可以使用instr函数对某个字符串进行判断,判断其是否含有指定的字符。其语法为:
dbms_lob.instr(sourceString,findingString,start,appearPosition).
其中sourceString代表源字符串;destString代表想从源字符串中查找的子串;start代表查找的开始位置,该参数可选的,默认为1;appearPosition代表想从源字符中查找出第几次出现的destString,该参数也是可选的,默认为1;如果start的值为负数,那么代表从右往左进行查找。
oracle in 索引问题
用in 谓词的
1、 如果是列举出来的值列表 ,如 in (a ,b ,c ,d ,e ,...) 则可以使用该列索引,不管是使用了use_concat 还是no_expand
2、如果in 为子查询 如 in (select empno from emp ) 则将不会使用索引。并且采用nested loop 方式。
如果在子查询中还有条件 如:in (select empno from emp where empno ) 则是可以使用索引的,同样使用nested loop 方式。
如果使用提示器use_concat 还是no_expand 从结果上看也能使用到索引
oracle建同义词
--前提:dba登录 --建用户user_read create user user_read identified by user_read; --建连接权限 GRANT CONNECT TO user_read; --建同义词权限 GRANT CREATE SYNONYM TO user_read; --生成 用户user_read可以查询用户user_update下所有表权限 的sql select 'grant select on user1.' || t.table_name || ' to user2;' from user_tables t; --前提:user_update登录 --执行上一条sql语句导出的sql结果集,让user_read可以查本用户的所有表 --样例如下:GRANT SELECT ON student to user_read; select 'create or replace synonym '|| table_name || ' for user_update.' || table_name || ';' from user_tables; --前提:user_read登录 --执行上一条sql语句导出的sql结果集,用于建同义词 --样例如下: CREATE OR REPLACE SYNONYM student FOR user_update.student;
Oracle同义词Synonym创建删除--https://www.cnblogs.com/oraclestudy/articles/5779180.html
oracle—将指定用户下所有表的查询权限赋给另一个用户--https://blog.csdn.net/luofujiang/article/details/44060177
如果A表中指定id的行不存在,那么就插入新行到B表
INSERT INTO B (FUNCTIONID, ROLEID, UPDATETIME) SELECT '123', '1', SYSDATE FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM A WHERE ROLEID = '1')
oracle case when else end
--简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END
关于oracle select 锁表问题
即条件不成立的行级锁是无法锁定那一行数据,其它connection对该行(实际上根本找不到该行)还是可以继续CRUD操作
假如有student表如下 id = 1 , name = bobo
然后用份java代码,禁用connection自动提交,当执行select * from student where id = 2 for update;是不能互相锁住的,因为没有可以锁定的行级锁
oracle nologging
http://bbs.csdn.net/topics/370062658
1.查询当前数据库的归档状态:
select name,log_mode from v$database;
默认为 NOARCHIVELOG 非归档
2.在非归档模式下,update是否使用nologging没有效果。
在归档模式下,update是否使用nologging对提高速度有较明显的效果。
3.为了提高插入的速度,我们可以对表关闭写log功能。 SQL 如下:
sql> alter table table_name NOLOGGING;
插入/修改,完数据后,再修改表写日志:
sql> alter table table_name LOGGING;
4.没有写log, 速度会块很多,但是也增加了风险,如果出现问题就不能恢复。
所以具体情况,具体对待..
oracle修改表名和表字段成大写或小写
所有操作都围绕以下语句,自己拼sql就好了,网上用存过的牛鬼蛇神垃圾的一批
select * from user_tab_columns;
再结合
select 'alter table '||t.TABLE_NAME||' rename column "'||t.COLUMN_NAME||'" to "'||upper(t.COLUMN_NAME)||'";',t.* from user_tab_columns t;
遇见异常
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor.
[66000][12505] Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor oracle.net.ns.NetException: Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor.
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connection descriptor used by the client was:
-- 这里的sid_name错误 1*4.1*1.2*4.1**:1521:orcltest at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70) at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:460) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411) at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490) at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:474) at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:154)
注:
jdbc连接数据库的时候(比如datagrip工具),需要使用数据库的sid_name,而不是数据库的services_name.
而使用plsql连接数据库的时候,只需要数据库的services_name即可,所以修改连接字符串中的services_name 为sid_name.
查询sid_name的方法:
select INSTANCE_NAME from v$instance;
Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
该异常一般在java中才报, 在客户端工具类中不会报, 主要原因是在java中有的地方(像mybatis的xml语句中, 不需要出现; 结尾)
其它参考
ORACLE 更改用户名--https://blog.csdn.net/zkcharge/article/details/79182277