一、merge into插入数据出现主键冲突?
在后台中开发了一个存储过程用到merge into,主要是根据主键值来查看目标表中是否有该主键值,如果有进行更新,否则插入,然而在测试过程中经常出现ORA-00001 主键冲突。
前端开发人员口口声声说传入的数据不会有重复值,怀疑数据库的问题。我相信Oracle不会有这样的bug。
索性我在后台演示出现该错误的方法。
1、创建测试表
create table T_TEST
(
A CHAR(1),
B NUMBER
)
2、创建测试存储过程
create or replace procedure test(i_num in number) is
begin
MERGE INTO t_test t
USING (SELECT '1' a, ROWNUM b FROM DUAL CONNECT BY ROWNUM <= i_num) TA
ON (t.a = TA.a)
WHEN MATCHED THEN
UPDATE SET T.b = t.b + TA.b
WHEN NOT MATCHED THEN
INSERT VALUES (TA.a, TA.b);
commit;
end test;
3、执行存储过程test
SQL> exec test(12);
PL/SQL procedure successfully completed
SQL> select * from t_test;
A B
- ----------
1 12
1 11
1 10
1 9
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
12 rows selected
SQL>
4、清空t_test
SQL> truncate table t_test;
Table truncated
SQL>
5、添加主键
SQL> ALTER TABLE T_TEST ADD CONSTRAINT PK_T_TEST PRIMARY KEY (A) USING INDEX;
Table altered
6、在t_test中添加一行数据
SQL> exec test(1);
PL/SQL procedure successfully completed
SQL> select * from t_test;
A B
- ----------
1 1
7、此时尝试再次添加多行数据,此时会出现错误ORA-30926,原因是在Using选项后面中a有多个重复值
SQL> exec test(10);
begin test(10); end;
ORA-30926: 无法在源表中获得一组稳定的行
ORA-06512: 在 "TEST.TEST", line 3
ORA-06512: 在 line 1
SQL>
8、清空t_test
SQL> truncate table t_test;
Table truncated
9、尝试添加多行a值相同的数据,提示主键冲突
SQL> exec test(10);
begin test(10); end;
ORA-00001: 违反唯一约束条件 (TEST.PK_T_TEST)
ORA-06512: 在 "TEST.TEST", line 3
ORA-06512: 在 line 1
SQL>
由此可以证明还是由于传入的数据有重复值导致的。
具体得在程序中继续跟踪,好让他们心服口服。
二、oracle怎么导出数据?
1、打开电脑左下角【开始菜单】,在右侧找到【运行】选项2、在弹出的运行栏输入【cmd】,点击确定3、在弹出的cmd命令行界面输入【exp】命令,点击回车4、此时进入oracle命令行界面,输入用户名和密码,点击回车5、登录成功设置导出数据参数,选择数据文件导出路径,点击回车6、参数设置完成,此时进行导出表数据操作7、操作完成找到存放的路径,可以看到此书生成一个DMP文件。
三、oracle怎样导出数据?
1、打开oracle数据库,点击登陆选项,点击文件选项,点击新建选项,最后点击sql窗口;
2、然后在sql窗口中进行编写sql语句的操作,勇sql语句进行查询出想要导出来的数值;
3、然后在查询出来数据的地方,不要选中数据,把鼠标放到空白单元格处进行鼠标右键操作,找到复制到Excel选项;
4、然后在复制到excel中选择想要保存的格式-->作为xls保存,打开后则是excel形式的数据;
5、默认的保存路径-->将鼠标放在excel名称上-->会出现路径-->根据路径打开即可。
四、oracle数据库里怎么把字体调大?
说的不太清楚
1,加大字体是在界面CSS上设置字号大小的
2,表示单个字节可以放多少个字
五、oracle数据库如何造数据?
oracle数据库造数据的方法无非两种:
一个是使用oracle的建库工具dbca,这是一个图形界面工具,而且使用起来也方便且容易理解。
另一种方法就是手工库,这也就是我们今天要讨论的内容。
手工建库比起使用dbca建库来说,是比较麻烦的,但是如果我们学好了手工建库的话,就可以使我们更好的理解oracle数据库的体系结构。
六、怎么把oracle数据导入sqlserver数据?
可以的
1、在目的SQL Server数据库服务器上安装ORACLE Client软件或者ORACLE ODBC Driver.
通过oracle客户端,在netmanager中建立“服务(TNS server)”,并测试连接上oracle数据库正常
2、在sqlserver的DTS(导入和导出数据工具)进行
(1)选择数据源:
数据源:oracle in oracle9i
选择:用户/系统DSN:
点击新建DSN:选择数据源类型:系统数据源,
下一步:选择驱动程序:oracle in oracle9i,下一步,完成 ,
进入oracle odbc driver configration页面
再输入:datasorce name:GZDS
TNS server name:gz(通过netmanager定义好TNS server)
user:(oracle登录用户)
填写好以后,进行"TEST Connection"
可以连通,则点击“ok”,DSN建立完成
数据源选择完成,点击“下一步”进入“选择目的”
(2)选择目的
目的:用于SQL Server的Microsoft OLE DB提供程序
服务器:192.168.0.63
选择:使用sqlserver身份登录
用户名:sa 密码:pass
并刷新,选择好数据库:test(目的数据库,提前建立好的)并点击“下一步”
a.从数据源复制表和数据(下一步:选择源表及视图)
b.用一条查询语句指定要传输的数据(进行sql编辑)
(通过以上选择好要复制的数据表或者相关视图)
再点击下一步“保存、调度和复制包”
(3)“保存、调度和复制包”
时间:立即运行
再点击下一步:进行:“正在完成DTS导入导出”向导
(4)完成:
点击:“完成”按钮,系统进入数据复制“正在执行包”的页面,
可以看到数据正在复杂的进度条
注意:在ORACLE表和SQL Server表之间'转换'那步很重要,
可以改变默认的字段数据类型,如image->text,decimal->int
七、oracle全局数据库和oracle实例?
全局数据库和实例,只有在集群时才有区别。一个全局数据库对应多个实例。
八、Oracle使用Merge into有没有简单的写法?一条数据原表没有。怎么删除目标表的这行数据?
必须都要写一遍,你这要删除需要按条件delete啊,merge的原理你要弄明白啊,merge是根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入
九、oracle怎么批量insert数据?
百万级的数据量真的不算大,使用一些常用的同步就好了,创建一个DBLINK,然后使用MERGE就可以了,两个库中的主键不一样,就从对方的库中抽过来(INSERT 操作),相同则更新(UPDATE操作)
或者使用触发器也可以,当数据有变动时,自动执行相应的操作写入到对方库中。
十、oracle 数据库性能?
一、数据库性能指标
数据库性能一般用两个方面的指标来衡量:响应时间和吞吐量。响应越快,吞吐量越大,数据库性能越好。
1. 操作系统有关的指标:CPU平均利用率、内存平均占用率、硬盘占用率、I/O数量、网络时延
2. 数据库有关的指标:I/Owait、Mem平均使用率、cpu平均使用率、在一次I/O操作中所读的最大BLOCKS数、Log的增长情况、数据库的访问速度、数据库能支持的最大用户数、数据库CACHE命中率、不同数据库参数下的性能情况、锁的处理
二、Oracle
注:以下指标取自Oracle的性能分析工具Statspack所提供的性能分析指标。
1.关于实例效率(Instance Efficiency Percentages)的性能指标
(1)缓冲区未等待率(Buffer Nowait %)
指在缓冲区中获取Buffer的未等待比率。该指标的值应接近100%,如果该值较低,则可能要增大buffer cache。
(2)Redo缓冲区未等待率(Redo NoWait %)
指在Redo缓冲区获取Buffer的未等待比率。该指标的值应接近100%,如果该值较低,则有2种可能的情况:
1.online redo log没有足够的空间;
2.log切换速度较慢。
(3)缓冲区命中率(Buffer Hit %)
指数据块在数据缓冲区中的命中率。
(4)内存排序率(In-memory Sort %)
指排序操作在内存中进行的比率。当查询需要排序的时候,数据库会话首先选择在内存中进行排序,当内存大小不足的时候,将使用临时表空间进行磁盘排序,但磁盘排序效率和内存排序效率相差好几个数量级。
(5)共享区命中率(Library Hit%)
该指标主要代表sql在共享区的命中率。
(6)软解析的百分比(Soft Parse %)
该指标是指Oracle对sql的解析过程中,软解析所占的百分比。软解析(soft parse)是指当Oracle接到Client提交的Sql后会首先在共享池(Shared Pool)里面去查找是否有之前已经解析好的与刚接到的这一个Sql完全相同的Sql。当发现有相同的Sql就直接用之前解析好的结果,这就节约了解析时间以及解析时候消耗的CPU资源。
(7)闩命中率(Latch Hit%)
指获得Latch的次数与请求Latch的次数的比率。