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也会跟着进行自增,大功告成!!