今天学习了几个知识点:
1、关于Oracle用户下不能编译存储过程而报错的解决;
2、创建自定义函数索引时出现的问题;
3、关于清空buffer_cache的方法;
4、关于利用type进行一些转换。
1、默认情况下,如果没有编译权限,则授权:
grant debug any procedure to xxx;
2、创建自定义函数索引时出现:
ORA-30553: The function is not deterministic
问题的解决方法:
只需在创建该函数的时候加上deterministic参数即可。
3、清空buffer_cache的方法:
buffer_cache是Oracle存放前面select出来的数据的缓冲区,这样如果后面再次执行该语句的时候可以直接从这里获取。
但是要在测试单个SQL语句速度的时候,需要排除这种因素,所以需要清空buffer_cache来实现这样的环境。
Oracle10g里面可以直接通过执行:
alter system flush buffer_cache;
来实现。
在Oracle9i里,Oracle提供了一个内部事件,用以强制刷新Buffer Cache,其语法为:
alter system set events 'immediate trace name flush_cache level 1';
类似的也可以使用alter system系统级设置:
alter session set events = 'immediate trace name flush_cache';
4、实例:如何将一条记录的所有字段按照一个字段一行记录的方式显示出来。
create or replace type line2row is table of varchar2(4000);
/
create table lrtest(id number(18), name varchar2(255), sex varchar2(1), address varchar2(255), nationality varchar2(10));
insert into lrtest values(28, 'lyon', 'm', 'hangzhou', 'CHN');
commit;
/
SQL> select l.id, l.name, l.sex, l.address, l.nationality from lrtest l;
ID NAME SEX ADDRESS NATIONALITY
---- ------- --- --------- -----------
28 lyon m hangzhou CHN
SQL> select * from table(select line2row(l.id, l.name, l.sex, l.address, l.nationality) from lrtest l);
COLUMN_VALUE
--------------------------------------------------------------------------------
28
lyon
m
hangzhou
CHN