最近因工作需要,需要将一些数据同步到oracle数据库,我以为语法应该差不多,没想到真的踩了几个坑,今天分享出来,供大家借鉴。
准备一张测试表test,字段有id、name和创建时间。
INSERT INTO "ROOT"."test"("id", "name", "create_time") VALUES (1, '添加1', '2020-11-26 20:00:00');
反手就是添加一条语句,你以为没问题?结果:
报错:日期格式不能转换为字符串
重点1:添加日期数据需要使用TO_DATE
INSERT INTO "ROOT"."test"("id", "name", "create_time") VALUES (1, '添加1', TO_DATE('2020-11-26 20:00:00','yyyy-mm-dd hh24:mi:ss'));
可以看到已经添加成功,我们查询一下。
批量添加数据
@Insert( " )
直接运行,wow竟然又出问题。
报错:bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
不明所以,直接把sql放在工具里执行。
insert into "ROOT"."test"("id","name","create_time")values( 2,'添加2',TO_DATE('2020-11-26 20:10:00', 'yyyy-mm-dd hh24:mi:ss')),( 3,'添加3',TO_DATE('2020-11-26 20:20:00', 'yyyy-mm-dd hh24:mi:ss')),( 4,'添加4',TO_DATE('2020-11-26 20:30:00', 'yyyy-mm-dd hh24:mi:ss'))
百度搜索:
提示我的语句未正常结束,不可能啊,检查了几遍也完整了啊。
开始怀疑:难道不支持这个语句?先执行一条:
冷笑,一条竟然可以成功,那就是oracle批量添加的语法有问题了。
批量添加数据正确语法
insert allinto "ROOT"."test"("id","name","create_time") values (3,'添加3',TO_DATE('2020-11-26 20:20:00', 'yyyy-mm-dd hh24:mi:ss'))into "ROOT"."test"("id","name","create_time") values (4,'添加4',TO_DATE('2020-11-26 20:30:00', 'yyyy-mm-dd hh24:mi:ss'))select 1 from dual;
注意:最后的select是固定语法。
上面,讲了Oracle的添加和批量添加的语法。后面会继续讲博主遇到的其他问题哦!
TNS-12541: TNS: 无监听程序 TNS-12560: TNS: 协议适配器错误 TNS-00511: 无监听程序
文章转自:http://www.luocs.com/archives/464.html
此文版权归作者 – yaogang所有,转载请注明yaogang©www.luocs.com。
Luocs说:这是我一个朋友的一个监听器问题解决案例,这是昨天发生的事情,我一直跟朋友一起Troubleshooting,折腾了半天最后是BUG所致。再次汗颜,Windows平台惹不起啊!好,那么下面开始分享我朋友的案例!
环境描述:
OS : Windows Server 2008 64Bit (做了HA)
DB : 11.1.0.7.0
排错过程:
前天应用不能访问
数据库
了 (后台应用能访问
数据库
),故障发生。
马上登录到服务器里查看监听状态,发现有TNS-12541 ,TNS-12560等错误
Luocs补充:我跟朋友要了错误代码,但他没有保存,就直接贴图。
从计算器的管理 –> 服务选项 –> 检查
oracle
监听服务程序,发现该服务已经停止。
手动把监听服务启动,这时候服务状态上显示为已启动,但在CMD窗口执行lsnrctl status的时候依然返回错误信息:
C:\>lsnrctl status
LSNRCTL for 64-bit Windows: Version 11.1.0.7.0 - Production on 12-11月-2012 18:1
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.10.203.218)(PORT=1521)))
TNS-12541: TNS: 无监听程序
TNS-12560: TNS: 协议适配器错误
TNS-00511: 无监听程序
64-bit Windows
Err
or: 61: Unknown
err
or
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
过段时间回显非常慢。
然后我检查了下告警日志,大量的
ora
错误
Fatal NI connect
err
or 12170.
VERSION INFORMATION:
TNS for 64-bit Windows: Version 11.1.0.7.0 - Production
Oracle
Bequeath NT Protocol Adapter for 64-bit Windows: Version 11.1.0.7.0 - Production
Windows NT TCP/IP NT Protocol Adapter for 64-bit Windows: Version 11.1.0.7.0 - Production
Time: 12-11月-2012 15:23:33
Tracing not turned on.
Tns
err
or struct:
ns main
err
code: 12535
TNS-12535: TNS:
操作
超时
ns secondary
err
code: 12560
nt main
err
code: 0
nt secondary
err
code: 0
nt OS
err
code: 0
Client address:
ORA
-609 : opiodr aborting process unknown ospid (4116_6104)
这时候朋友怀疑是不是监听器配置问题,就把原先的监听器删除重建了下,问题依然。
网上有个解决TNS-12535错误的案例,平台和版本都很类似,如下:
1、在
sql
net.
ora
文件中 增加如下行:
DIAG_ADR_ENABLED = OFF
2、在listener.
ora
文件中增加如下行:
DIAG_ADR_ENABLED_ = OFF
如何监听是listener时,则前面的名称为:DIAG_ADR_ENABLED_LISTENER = OFF
3、重新启动windows服务管理中的监听程序.先停止,然后再重新启动.
4、检查结果.发现可以了,返回的值在10毫秒.有时为0毫秒.成功!!
但这并不是问题发生原因,在继续排查过程中偶然发现监听日志大小居然为4G。然后把这现象告诉了Luocs。
过了一会儿,Luocs回应是
ora
-导入“ gopkg.in/rana/
ora
.v4”包
ora
实现了
Oracle
数据库
驱动程序。
Golang
Oracle
数据库
驱动程序TL; DR;
只需使用它import(“ database /
sql
” _“ gopkg.in/rana/
ora
.v4”)func main(){
ora
-import“ gopkg.in/rana/
ora
.v4”包
ora
实现了
Oracle
数据库
驱动程序。
Golang
Oracle
数据库
驱动程序TL; DR;
只需使用它import(“ database /
sql
” _“ gopkg.in/rana/
ora
.v4”)func main(){db,
err
:=
sql
.Open(“
ora
”,“用户/ [受电子邮件保护]:port / sid“)defer db.Close()//设置超时(Go 1.8)ctx,取消:= context.WithTimeout(context.Background(),5 * time.Second)//设置预取计数(Go 1.8)ctx =
ora
.WithStmtCfg(ctx,
ora
.Cfg()。Stmt
oracle
11g
基本
客户端,主要是
sql
plus,
sql
ldr,exp,imp这几个
命令
。最最主要的还是
sql
ldr,想找个单独可用的
sql
ldr,在
Oracle
10g Client 精简优化安装包不到12M http://download.csdn.net/download/mysky2008/4382509 下载了10g的,但本地测试出现
sql
*loader 704错误,不知道怎么解决,也找不到其他资源,最后去找安装了完整版的同事,借鉴这个下载链接里面的文件,删除了其他没用到的东西(经历了好几个小时,一个一个dll测试过去),最后
sql
plus,
sql
ldr可用。 如果是遇到
sql
*loader 284错误的,是因为缺少nls语言支持,可以到这里https://pan.baidu.com/s/1
eRR
0N0u 下载完整版的语言支持,之后覆盖nls这个目录就好。 解压后设置环境变量
ORACLE
_HOME 到client_1目录,TNS_ADMIN还是指向原来tnsnames.
ora
所在的目录,在Path加上BIN目录就可以了
如果使用
sql
ldr 报以下错误 可能环境变量少配置
Message 2100 not found; No message file for product=RDBMS, facility=UL
自己写的
数据库
装载工具,平时工作中用于装载大文本文件到
数据库
表,也能直接装载excel,不过excel只能使用第一个sheet,且不支持合并的单元格。
jdk要求版本1.6及以上。
使用方法: java -jar lynload.jar,即可看到中文
命令
行参数(unix下需设置gbk字符集环境才能看中文,没gbk环境不能看中文,但不影响导入数据)。
1.同时支持多个
数据库
.
2.支持任意字符串作为列分隔符,什么竖线逗号或者十六进制字符及任意组合字符串都行
3.支持任意字符串作为每行分隔符,例如\r,\r\n,或者十六进制字符或任意指定的字符串(例如可实现把整个日志文件装入
数据库
的单个clob字段).
4.支持任意大小的文本,装入几十GB都试过没问题。
5.明确到每一行的错误信息.(装载时会生成一个.
err
文件,里面有装载出错的每一行错误原因(少字段还是格式不符合要求等等)。
6.可以作为库使用在jsp等后台直接调用,将整个jar作为库,使用
Ora
Load类的int ProcLoad(Connection in_conn, String args[])函数就可以实现类似功能了。例如 new
Ora
Load.ProcLoad( null, "-u test -p testpwd -i 127.0.0.1 -s
ora
10 -f test.txt -t tmp_test -c , -e gbk");
具体参数如下:
Usage:
-db database type
1或者
oracle
,
oracle
数据库
,不区分大小写,默认1,需java1.5及以上版本
2或者
sql
server, ms
sql
server
数据库
,不区分大小写,需java1.6及以上版本
3或者my
sql
, my
sql
数据库
,不区分大小写,需java1.5及以上版本
4或者sybase, sybase
数据库
,不区分大小写(暂
未
测试)
数据库
连接的url.默认空字符串
如果有url参数,则-i-p-s-dn参数全无效。
如果没有url参数,则必须提供-i-p-s参数,程序里面好拼凑url
例如: jdbc:
sql
server://localhost:1433; DatabaseName=sample
-i ip address:port
ip地址和端口,中间用冒号隔开
url不为空则此参数无效
如果不带端口,系统根据
数据库
类型采用默认端口
oracle
数据库
: 默认为1521端口
sql
server
数据库
: 默认为1433端口
my
sql
数据库
: 默认为3306端口
sybase
数据库
: 默认为5000端口
例如: 127.0.0.1:1521
例如: 192.168.0.1
-s serviceid or database name
oracle
服务名或者其他
数据库
的
数据库
名
url不为空则此参数无效
-u username
用户名,必输
-p Password
登录密码,必输
-t TableName
要插入的表名,可以带用户,必输
例如: scott.emp 或者 emp都行
-f FileName
来源的文件名,必输
-ff FileName format
来源的文件名类型:txt,文本文件;xls:Excel2003或2007文件),默认是txt
对于Excel文件的导入,仅导入第一个sheet的内容,其他sheet的内容忽略
-e Encoding
文件的编码,默认gbk
-c Cut split string
分隔字符串,可以是多个字符组合,默认竖线
-r commit rows
每插入多少行提交一次,-1表示不提交,默认-1,如果设置了ac参数为1,则此参数无效。
注意:如果设置了此参数,每到此行数会执行一次commit,如果是外部调用此过程要注意所有数据会被提交
-ac all commit
0.插入成功的都提交,失败的登记文本,默认0; 1.全部插入成功后才提交(有失败则回滚并
结束
)
-a column flag
第一行的类型
0.没有列名行,默认0。此值为0则it参数不生效。
1.第一行是逗号分隔的包括列类型的列信息,例如NAME VARCHAR2(30),注意,区分大小写
2.第一行是列分隔符分隔的列名(不包括列字段信息),注意,列名区分大小写
-it insert type
1.导入的列需要跟
数据库
列名个数及名称完全相同,顺序无所谓,默认1
2.仅导入文件字段名与
数据库
字段名完全相同的数据,顺序无所谓
3.第一行是列信息,按此列信息创建新表导入数据(暂不用)
4.忽略第一行,无论第一行是什么数据全部忽略,从第二行按列字段顺序匹配装载
必须在-a 参数 > 0时才生效,否则无意义
-d date formate
日期格式,参考java的SimpleDateFormate类参数,默认自动识别
可识别格式:yyyyMMdd, yyyy-MM-dd, yyyy/MM/dd, yyyyMMdd:HHmmss(等于
oracle
的yyyymmdd:hh24miss)
yyyy年,MM月,dd日,HH 24小时制时,hh 12小时制时,mm 分, ss秒
-l line end string
每条记录结尾的分隔符,默认是 \r\n回车换行符,支持前面-c参数说的转义符
oracle
例子: 登陆scott用户,裝载a.txt的逗号分隔的gbk编码文本内容到scott.emp
java -jar xxx.jar -i 127.0.0.1 -p 1521 -s
ora
10 -u system -p manager -t scott.emp -f a.txt -c ,
sql
server例子: 登陆11.8.126.181
数据库
的test用户,裝载f: est.xlsx的excel数据到tmp_i表
java -jar -db
sql
server -i 11.8.126.181 -s abcd -u test -w test -f f: est.xlsx -t tmp_i -ff xls
my
sql
例子: 登陆本机
数据库
的root用户,裝载a.txt的文本数据到tmp_i表,不提交
java -jar xxx.jar -db my
sql
-i 127.0.0.1 -s gjjgj -u root -w root -f a.txt -t tmp_i
最近因工作需要,需要将一些数据同步到
oracle
数据库
,我以为语法应该差不多,没想到真的踩了几个坑,今天分享出来,供大家借鉴。 准备一张测试表test,字段有id、name和创建时间。添加数据INSERT INTO "ROOT"."test"("id", "name", "create_time") VALUES (1, '添加1', '2020-11-26...
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。出现这个错误的情况还是挺多的,当抛出此错误提示信息,代表着
SQL
语句本身就是有问题的!5
数据库
不同的版本或不同的
数据库
支持的
SQL
的语法规则是不一样的,一句
SQL
语句在一个数据中是
正确
的在另一个
数据库
中
未
必也
正确
。我的语句中正好存在表别名,且加了。...
在
Oracle
数据库
中,如果将一张表里面的数据复制到另外一个对象中。通常会有这两种方法:insert into select 和 select into from
insert into select:是PL/
SQL
language 的赋值语句,可以将select 出来的N行(0到任意数)结果集复制一个新表中
select into from:是标准的
SQL
语句,可以...
如果你在使用
Oracle
.EntityFrameworkCore 在执行一些分页查询或者其他数据
操作
时,遇到“
ORA
-
00933
:
SQL
命令
未
正确
结束
”,
请先检查你的DbContext中Use
Oracle
(...)的写法:
services.AddDbContextPool<PartnerDbContext>(options =>
op...
INSERT INTO Student(name,sex,age,address,birthday) VALUES('Nike','男','18','北京','2000-01-01')
,('Nike','男','18','北京','2000-01-01')
,('Nike','女','18','北京','2000-01-01')
,('Nike','女','18','北京','2000-01-01')
,('Nike','男',
Oracle
查询提示
ORA
-
00933
:
SQL
command not properly ended 原因排查问题描述问题排查与解决
一段
sql
语句,在postgre
数据库
中运行
未
出现问题,切换到
oracle
数据库
后报错。
SQL
语句如下
select T.code as CODE
from info_table as T
在
ora
lcle执行后报如下错误
>
ORA
-
00933
:
SQL
command not properly ended
问题排查与解决
在网上查询了该报错之后看到