- 给表增加字段时,要注意相关视图,如果视图的创建如
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操作。