Oracle数据库遇到的问题集合(持续更新)

1.关与oracle的字符串连接问题:

oracle有自己的字符串连接函数concat(a,b),但是这个concat(a,b)函数,与mysql有所不同。

oracle的concat(a,b)函数,只能用于两个字符串连接,也就是无法用于2个字符串以上的多个字符串拼接,这也会导致多字段拼接时是及其不方便的。

并且,在oracle的concat(a,b)函数中是无法使用 + 进行字符串连接的,会出现

> ORA-01722: invalid number 的错误提示。

我一般在处理多个历史数据的插入,修改时,都喜欢用查询语句+字符串拼接,把insert或者update语句批量拼接查询出来,然后全部处理,在mysql中我是一直使用的concat(),oracle中,我推荐的是使用  ||  符号,这个 || 符号可以将前后的字符串连接起来。

连接的过程中,注意,oracle中不使用双引号,使用单引号对字符串进行包裹。如果要在字符串中表示单引号 ’   那么 需要进行转义,使用\的形式 或者是''  都可以转义出单引号

2.关于Oracle的group by的问题:

oracle中的group by和mysql中有所不同,这个问题也是我在进行拼接时出现的问题。

大家在查询时,会用到这个行转列的操作:listagg(a.name,';') within group (ORDER BY   a.id),

而使用了这个函数后,直接查询,就会报错:

> ORA-00937: not a single-group group function

这个时候,就得在查询语句后面加上group by,并且,这个group by后的字段,必须包括处listagg中的使用字段外的,查询字段中的全部字段,如果缺少字段就会报错:

> ORA-00979: not a GROUP BY expression

3.关于Oracle字段自增的问题:

这个问题是在后台调用了插入方法,数据库却没有主键自增的时候出现的问题,当时也是查了很多大佬们写的东西,才解决这个问题,下面就具体的分享一下这个问题。

首先我们要添加一个自增序列,类似于mysql的tsequence一样。

大佬们给这个主键自增说了很多种不同的方法,但是其实我感觉在我们开发过程中,一般来说我们是不直接对接数据库的(意思是我们是不直接建表的),所以建表时就直接添加自增,这个不是很常用,就不赘述了,还有就是insert时直接吧序列的下一个值放在对应字段上,但是我感觉这个也不是很常用,毕竟感觉这个算是定制化,并不是很通用。

下面就写一下用  自增序列+触发器 进行表的字段自增。

-- 创建自增序列:

CREATE SEQUENCE  xxx  //序列名
minvalue 1           //最小值
maxvalue 999999   //最大值
increment BY 1  //这个自增 一般来说都是自增1
START WITH ?;  //这个后面填写开始的值,一般来说是表字段的最大值。

-- 创建了自增序列其实还不够,这个时候后天如果进行插入,更新等方法,其实序列还是没有和表绑定在一起,这个时候,我们就得使用触发器了,也就是我们什么时候进行自增,给哪个字段自增。

-- 创建触发器
create or replace trigger t_demo  //t_demo是毒液
before insert on table1  //table1是绑定的表
for each row  //row就是字段
begin
 select xxx.Nextval into :new.id from dual; //这里一定要有这个;  不然会出现问题invalid不生效
end;

这样的话,我们在插入的时候,同时表的ID也会跟着进行自增,大功告成!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值