遇到的oracle问题汇总

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、存储过程可以提高查询效率,具体表现在哪些方面?

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值