1、使用oracle用户登录: oracle/oracle
2、打开终端
3、查看本机IP地址:ifconfig,下图红色框中为ip地址
4、启动数据库:sqlplus sys/oracle as sysdba,在sql视图中输入startup
退出sql视图exit,启动监听lsnrctl start
启动监听:lsnrctl start
查看监听:lsnrctl status
停止监听:lsnrctl stop
1.ORA-20000: ORU-10027: 执行存储过程的错误
循环执行存储过程时,出现报错:
解决方法:
经过一系列的分析以及查看网上的资料终于知道了问题的解决方法,出现的原因是因为我在存储过程中使用了dbms_output.put_line(); 由于过程中有循环,因此输出量比较大,致使缓存不够报错.网上的解决方法是set serveroutput on size 100000 (相当于把缓存设置大一点),但是我执行时候报错 ORA-00922: missing or invalid option,之后还是修改了自己的语句,既然是输出过多导致,我就将数据语句放在循环外面,这样只要输出语句小于缓存就可以了.
2.Oracle中的trunc函数
ORACLE中TRUNC是截取的函数
用在日期类型上,就是截取到日或时间
SELECT TRUNC(SYSDATE) FROM DUAL;
默认是截取系统日期到日,得到2012-12-19
比如值为"2012-12-19 14:30:50"的日期变量
TRUNC(SYSDATE)得到 2012-12-19 , 和TRUNC(SYSDATE,'DD')一样
TRUNC(SYSDATE,'YYYY'),得到2012-1-1
TRUNC(SYSDATE,'MM'),得到2012-12-1
TRUNC(SYSDATE,'DD'),得到2012-12-19
TRUNC(SYSDATE,'HH')或HH24,得到2012-12-19 14:00:00
TRUNC(SYSDATE,'MI'),得到2012-12-19 14:30:00
TRUNC(SYSDATE,'SS'),是会报错的,直接用SYSDATE不用TRUNC
另外说明一下,截取后得到的仍为date数据类型
TRUNC(x,y)用在数值上时(没有四舍五入功能,如果要四舍五入用ROUND(x,y)):
TRUNC(89.985)=89 --缺省的y值默认是0,截取到个位
TRUNC(89.985,1)=89.9 --截取1位小数
TRUNC(89.985,2)=89.98 --截取2位小数
TRUNC(89.985,4)=89.98 --截取4位小数,与原值不变
TRUNC(89.985,-1)=80 --截取到十位,个位补充0
3.oracle忘记sys密码解决
两种方法找回sys密码:
1.用windows验证(请确认OracleBaseDir/ora92/network/admin/sqlnet.ora文件中
SQLNET.AUTHENTICATION_SERVICES= (NTS)
这行未被注释),然后敲入
sql> connect sys/随意密码 as sysdba;
sql> alter user sys identified by 'new_password';
2.通过orapwd命令重新创建密码文件(每个DB有自己的密码文件)
先把OracleBaseDir/ora92/database/pwd+DBSID名.ora改成另外的文件名,
进入sqlplus,
sql> orapwd.exe file=OracleBaseDir/ora92/database/ pwd myoracle.ora password=newpwd(entries=10);
将OracleBaseDir/ora92/database/myoracle.ora文件名改为pwd+DBSID名.ora
最后,重新启动Oracle服务。
4. count(*),count(1)和count(主键)的区别
如果null参与聚集运算,则除count(*)之外其它聚集函数都忽略null.
如:
ID DD
1 e
2 null
select count(*) from table --结果是2
select count(DD) from table ---结果是1
如:
ID DD
1 e
2 null
select count(*) from table --结果是2
select count(DD) from table ---结果是1
不考虑Null的情况
count(1)和count(主键) 这两个只扫描主键Index就可以得到数据,
count(*)是扫描表的。
所以count(1)和count(主键)这两个效率高。
还有一种写法是count(ROWID)这也是只扫描Index的,效率高。
count(1)和count(主键) 这两个只扫描主键Index就可以得到数据,
count(*)是扫描表的。
所以count(1)和count(主键)这两个效率高。
还有一种写法是count(ROWID)这也是只扫描Index的,效率高。
5.Start with...Connect By子句递归查询
简单介绍如下:
在扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:
第一步:从根节点开始;
第二步:访问该节点;
第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;
第四步:若该节点为根节点,则访问完毕,否则执行第五步;
第五步:返回到该节点的父节点,并执行第三步骤。
总之:扫描整个树结构的过程也即是中序遍历树的过程
通过子节点向根节点追朔.
Sql代码
select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid
(
paredeptid是父id,
deptid是当前id
)
通过根节点遍历子节点.
Sql代码
select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid
再次复习一下:start with ...connect by 的用法, start with 后面所跟的就是就是递归的种子。
递归的种子也就是递归开始的地方 connect by 后面的"prior" 如果缺省:则只能查询到符合条件的起始行,并不进行递归查询;
connect by prior 后面所放的字段是有关系的,它指明了查询的方向。