数据库日常笔记

  • 给表增加字段时,要注意相关视图,如果视图的创建如
create or replace view house as
select b.*, .......

b.*这样,就要重新运行下视图,否则会++报指定的列名数无效++这样的错误。

  • oracle通过in查询的数据为乱序,如果要顺序,可以使用decode

select * from table_name t
where t.id in
(
'235',
'dsafas',
'fsafsa',
'gdghdh',
'her',
'fw',
'fsafa'
)
order by decode
(
t.id,
'235',1,
'dsafas',2,
'fsafsa',3,
'gdghdh',4,
'her',5,
'fw',6,
'fsafa',7
);

也可以用instr

select * from lessee where id = '123' or id = '124' order by instr('123,124', id);
  • 使用REGEXP_SUBSTR函数进行字符串分割
SELECT REGEXP_SUBSTR ('hello my phone is 520 ', '[0-9]+') FROM dual; --520

http://blog.csdn.net/zz87250976/article/details/22856829
http://blog.csdn.net/itmyhome1990/article/details/50380749

  • instr函数返回字符串str中子字符串substr第一次出现的位置,在sql中第一字符的位置Z是1,如果 str不含substr返回0。

我想查找承租人签订了哪些合同,因为合同表中承租人id是分号拼接的,用全模糊效率太低,用instr如果返回大于0,则说明那份合同有这个承租人。

select * b where a.name='group1' and instr(a.id,b.id)>0;
  • 获取date数据的月份差months_between
starttime := to_char(startdate, 'yyyy-mm');
endtime := to_char(enddate, 'yyyy-mm');
select months_between(to_date(endtime, 'yyyy-mm'), to_date(starttime, 'yyyy-mm')) into accountmonth from dual;
  • ORA-01795: 列表中的最大表达式数为 1000

    in ()的数量不能超过1000,最好inselect语句。

  • oracle存储过程中update不成功的一个原因。存储中,变量名不能和表字段名一样。我遇到在update时变量名和字段名称一样,结果那个字段update失败,但其他字段更新成功。

  • ORA-12899 通过dblink进行数据插入时(同样的表),出现这个错误

12899::ORA-12899: 列 "IMPORTUSER"."BA_RESIDENTHMTSZ"."REGISTRAR" 的值太大 (实际值: 51, 最大值: 50)
ORA-02063: 紧接着 line (起自 BAWGB28)

后来一调查,发现是跟oracle的字符集编码有关:如果是以下字符集,一个汉字占用2个字节: SIMPLIFIED CHINESE_CHINA.ZHS16GBK 如果是以下字符集,一个汉字占用3个字节: SIMPLIFIED CHINESE_CHINA.AL32UTF8
(1)查看oracle字符集可以用下面的sql文查看: select userenv('language') from dual
(2)查看当前oracle环境中一个汉字占多少个字节可以用下面的sql文查看: select lengthb('啊') from dual。

  • 删除上千万数据的时候,不能直接delete,可以进行遍历,没删除1000个数据进行commit操作。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容