1、命令行登录oracle语句?
sqlplus system/manager as sysdba;
2、oracle服务有哪些?作用是什么?
OracleDBConsoleorcl 这个是采用浏览器使用的oracle企业管理器
OracleOraDb10g_home1iSQL*Plus 是isql*plus的服务,要使用isqlplus,必须开启该服务,其它的服务见下面
如果只用cmd中的sqlplus管理oracle的话,必须的就一个OracleServiceORCL
要是还要其它的至少两个:OracleServiceORCL OracleOraDb10g_home1TNSListener
一个数据库服务器,一个监听器(等待客户端工具来连接数据库的程序)
(1)OracleServiceSID
数据库服务,这个服务会自动地启动和停止数据库。如果安装了一个数据库,它的缺省启动类型为自动。服务进程为ORACLE.EXE,参数文件initSID.ora,日志文件SIDALRT.log,控制台SVRMGRL.EXE、SQLPLUS.EXE。
(2)OracleHOME_NAMETNSListener
监听器服务,服务只有在数据库需要远程访问时才需要(无论是通过另外一台主机还是在本地通过 SQL*Net 网络协议都属于远程访问),不用这个服务就可以访问本地数据库,它的缺省启动类型为自动。服务进程为TNSLSNR.EXE,参数文件 Listener.ora,日志文件listener.log,控制台LSNRCTL.EXE,默认端口1521、1526。
(3)OracleHOME_NAMEAgent
OEM代理服务,接收和响应来自OEM控制台的任务和事件请求,只有使用OEM管理数据库时才需要,它的缺省启动类型为自动。服务进程为DBSNMP.EXE,参数文件snmp_rw.ora,日志文件nmi.log,控制台LSNRCTL.EXE,默认端口1748。
(4)OracleHOME_NAMEClientCache
名字缓存服务,服务缓存用于连接远程数据库的Oracle Names 数据。它的缺省启动类型是手动。然而,除非有一台Oracle Names 服务器,否则没有必要运行这个服务。服务进程为ONRSD.EXE,参数文件NAMES.ORA,日志文件ONRSD.LOG,控制台 NAMESCTL.EXE。
(5)OracleHOME_NAMECMAdmin
连接管理服务,是构建Connection Manager服务器所用,只有服务器作为Connection Manager才需要,它的缺省启动类型是手动。服务进程为CMADMIN.EXE,参数文件CMAN.ORA,日志文件CMADM_PID.TRC,控制台CMCTL.EXE,默认端口1830。
(6)OracleHOME_NAMECMan
连接网关服务,是构建Connection Manager服务器所用,只有服务器作为Connection Manager才需要,它的缺省启动类型是手动。服务进程为CMGW.EXE,参数文件CMAN.ORA,日志文件CMAN_PID.TRC,控制台 CMCTL.EXE,默认端口1630。
(7)OracleHOME_NAMEDataGatherer
性能包数据采集服务,除非使用Oracle Capacity Planner 和 Oracle Performance Manager,否则不需要启动,它的缺省启动类型是手动。服务进程为VPPDC.EXE,日志文件alert_dg.log,控制台 vppcntl.exe。
(8)OracleHOME_NAMEHTTPServer
Oracle 提供的WEB服务器,一般情况下我们只用它来访问Oracle Apache 目录下的Web 页面,比如说JSP 或者modplsql 页面。除非你使用它作为你的HTTP服务,否则不需要启动(若启动它会接管IIS的服务),它的缺省启动类型是手动。服务进程为APACHE.EXE,参数文件 httpd.conf,默认端口80。
(9)OracleHOME_NAMEPagingServer
通过一个使用调制解调器的数字传呼机或者电子邮件发出警告(没试过),它的缺省启动类型是手动。服务进程PAGNTSRV.EXE,日志文件paging.log。
(10)OracleHOME_NAMENames
Oracle Names服务,只有服务器作为Names Server才需要,它的缺省启动类型是手动。服务进程NAMES.EXE,参数文件NAMES.ORA,日志文件NAMES.LOG,控制台NAMESCTL.EXE,默认端口1575。
(11)OracleSNMPPeerMasterAgent
SNMP服务代理,用于支持SNMP的网管软件对服务器的管理,除非你使用网管工具监控数据库的情况,否则不需要启动,它的缺省启动类型是手动。服务进程为AGNTSVC.EXE,参数文件MASTER.CFG,默认端口161。
(12)OracleSNMPPeerEncapsulater
SNMP协议封装服务,用于SNMP协议转换,除非你使用一个不兼容的SNMP代理服务,否则不需要启动,它的缺省启动类型是手动。服务进程为ENCSVC.EXE,参数文件ENCAPS.CFG,默认端口1161。
(13)OracleHOME_NAMEManagementServer
OEM管理服务,使用OEM时需要,它的缺省启动类型是手动。服务进程为OMSNTSVR.EXE,日志文件oms.nohup。
3、oracle 11g有两个压缩文件,并且需要解压到同一个文件夹下,如果只下载其中一个,或是未解压到同一文件夹下将导致安装不成功。
4、配置oracle客户端时,提示java版本不对,应修改文件D:\app\lenovo\product\11.2.0\dbhome_1\sqldeveloper\sqldeveloper\bin\sqldeveloper.conf,重新设置SetJavaHome,但要注意此文件是只读文件,不能直接修改,应该另存为之后,将其替换即可。
5、连接oracle时报错ORA-12504 TNS:监听程序在 CONNECT_DATA 中未获得 SERVICE_NAME?
数据库连接名为实例名orcl,而不是服务器ip名称。
5、用sys/manager登录时,提示拒绝登录?
密码改为大写MANAGER,oracle系统表中数据默认都为大写字母。
6、ORA-01017 invalid username/password;logon denied?
连接为数据库角色设置不对;
用户名密码错误;
修改密码时格式不对。应为大写字母小写字母数字的集合。
7、数据库查询语言大小写不敏感,但数据库中数据大小写敏感,如何关闭oracle大小写敏感设定?
alter system set sec_case_sensitive_logon=false;
8、动态执行表不可访问,本会话自动统计被禁止?
grant select on v_$statname to user;
9、复制表自身数据?
insert into users(userid,username,password) select * from users;
10、select * from emp where hiredate>'1-1月-1982';报错:ORA-01843: not a valid month?
11、ORA----12154:tns:无法解析指定的连接标识
安装目录中是否出现()等非法字符
数据库无法正常连接
12、nls字符集问题
修改环境变量NLS_LANG=AMERICAN_AMERICA.ZHS16GBK;
13、执行set dbms_output.putline on;时提示Cannot SET DBMS_OUTPUT.PUTLINE?
set serveroutput on or dbms_output.enable(buffer_size in integer default 20000);
14、PLS-00103: Encountered the symbol ";" when expecting one of the following: if?
分支条件elsif写成了else if。
15、select t1.*,rownum rn from (select * from emp)t1 where rownum>=6;emp表中记录数大于6条时,执行此语句时返回为空?
16、拼装sql语句执行时,报错:未找到from关键字?
拼装时from后面未带空格。
17、java中执行存储过程,提示游标已关闭,游标应该什么时候关闭?
oracle数据库既需要返回单个数据,又需要返回结果集时,需要使用存储过程,结果集使用游标形式返回。
18、oracle存储过程中,如果select时找不到记录,会触发例外,如果update时找不到记录,则不会触发例外?
19、oracle中查询情况:
1>查询单个数据,或是单个结果集,此时可以用一条语句查询出来;
2>查询多个数据,或是多个结果集,可以多次查询,也可以创建存储过程实现,但mysql和oracle返回结果集的方式有所不同。
1、mysql可以直接在存储过程中查询出来,在java中直接调用即可,实例如下:
a)创建存储过程
DROP PROCEDURE IF EXISTS mydb1.my_proc;
CREATE PROCEDURE test_20120119.`my_proc`()
BEGIN
select * from employee where id>2;
select * from employee where id<3;
END;
b)在java中调用存储过程
try {
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/test_20120119", "root",
"123456");
CallableStatement comm = null;
ResultSet ds = null;
String commStr = "";
String content = "";
commStr = "call my_proc()";
comm = ((java.sql.Connection) conn).prepareCall(commStr);
comm.execute();
ds = comm.getResultSet();
while (ds.next()) {
if (content == "") {
content += "结果集1:\nC1\tC2\tC3";
}
content += "\n" + ds.getInt(1) + "\t" + ds.getString(2) + "\t"
+ ds.getInt(3);
}
if (comm.getMoreResults() == true) {
content += "\n\n结果集2:\nC1\tC2\tC3";
ds = comm.getResultSet();
while (ds.next()) {
content += "\n" + ds.getInt(1) + "\t" + ds.getString(2)
+ "\t" + ds.getInt(3);
}
}
System.out.println(content);
} catch (Exception e) {
e.printStackTrace();
}
2、oralce中查询结果集,不能直接返回,只能通过游标变量接收并返回,实例如下:
a)创建一个包
--定义一个包,在该包中定义一个游标
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
b)创建存储过程,将查询结果集放入游标中
create or replace procedure proc_mulSets
(lowSalEmps out testpackage.test_cursor,
highSalEmps out testpackage.test_cursor) is
begin
open lowSalEmps for select * from emp where sal<2000;
open highSalEmps for select * from emp where sal>4000;
end;
c)在java中调用存储过程
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger");
CallableStatement comm = null;
ResultSet ds = null;
String commStr = "";
String content = "";
commStr = "call proc_mulSets(?,?)";
comm = ((java.sql.Connection) conn).prepareCall(commStr);
comm.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
comm.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);
comm.execute();
ds = (ResultSet) comm.getObject(1);
while (ds.next()) {
if (content == "") {
content += "结果集1:\nC1\tC2\tC3";
}
content += "\n" + ds.getInt(1) + "\t" + ds.getString(2) + "\t"
+ ds.getDouble(6);
}
ds = (ResultSet) comm.getObject(2);
content += "\n\n结果集2:\nC1\tC2\tC3";
while (ds.next()) {
content += "\n" + ds.getInt(1) + "\t" + ds.getString(2) + "\t"
+ ds.getDouble(6);
}
System.out.println(content);
} catch (Exception e) {
e.printStackTrace();
}
3>既查询数据,又查询结果集,可以多次查询,也可以创建存储过程实现,mysql中将变量、结果集分别看成不同结果集,oracle中声明一般变量返回数据,声明游标返回结果集。
oracle实例:
a)创建存储过程
create or replace procedure fenye
(tableName in varchar2,--表名
myPageSize in number,--每页大小
myPageNow in number,--当前页数
myRows out number,--总记录数
myPageCount out number,--总页数
p_cursor out testpackage.test_cursor--返回的记录集
) is
--定义sql语句
v_sql varchar2(2000);
--定义当前页第一条记录数和最后一条记录数
v_begin number:=(myPageNow-1)*myPageSize+1;
v_end number:=myPageNow*myPageSize;
begin
--执行sql,返回记录集
v_sql:='select * from (select t1.*,rownum rn from (select * from '||tableName||')t1
where rownum<='||v_end||') where rn>='||v_begin;
--打开游标
open p_cursor for v_sql;
--计算myRows
v_sql:='select count(*) from '||tableName;
execute immediate v_sql into myRows;
--计算myPageCount
if mod(myRows,myPageSize)=0 then
myPageCount:=myRows/myPageSize;
else
myPageCount:=myRows/myPageSize+1;
end if;
--关闭游标
--close p_cursor;
end;
b)java中调用存储过程
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "tiger");
CallableStatement cs = conn.prepareCall("{call fenye(?,?,?,?,?,?)}");
cs.setString(1, "emp");
cs.setInt(2, 5);
cs.setInt(3, 1);
cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
cs.execute();
int rowNum = cs.getInt(4);
int pageCount = cs.getInt(5);
ResultSet rs = (ResultSet) cs.getObject(6);
System.out.println("总记录数:" + rowNum + ",总页数:" + pageCount);
while(rs.next())
{
System.out.println("用户编号:"+rs.getInt(1)+",用户名: "+rs.getString(2));
}
20、存储过程可以提高查询效率,具体表现在哪些方面?