Oracle 零散知识

来源:互联网 发布:苏大网络统一身份认证 编辑:程序博客网 时间:2024/04/30 08:54
 

一、使用dblink,从MS Sql server客户端访问Oracle服务器

1、创建数据源:ds_zhaozhenlong
   在windows的ODBC数据源管理器中,‘Oracle in oracle92’或者其他oracle数据源,测试连接是否成功。
2、在MS Sql server的企业管理其中,服务器对象/连接服务器,新建连接服务器,访问接口为‘Microsoft OLE DB Provider for Oracle’,
   或者其他数据提供者,
   如:连接服务器:‘link_zhaozhenlong_oracle’;
       访问接口 :‘Microsoft OLE DB Provider for Oracle’;
       产品名称 :‘zhaozhenlong’;
       数据源    :‘ds_zhaozhenlong’;--第一步中创建的名称
       访问接口字符串:‘User ID=cs;Password=cs’;--登录oracle的用户名和密码

   或者在查询分析器中执行:
       EXEC master.dbo.sp_addlinkedserver @server = N'link_zhaozhenlong_oracle',
            @srvproduct=N'orademo', @provider=N'MSDAORA', @datasrc=N'orademo',
            @provstr=N'User ID=cs;Password=cs'
       其中@srvproduct、@datasrc写实例名;@provstr为oracle的用户名和密码

3、测试:
   select * from link_zhaozhenlong_oracle..CS.TB_ZHAOZHENLONG
   --查询db link为link_zhaozhenlong_oracle下的cs用户的表的数据,
   --用户名称和表名要大写

二、oracle触发器的简单使用
2006年12月31日 星期日 下午 06:03--逐行触发

--保存历史数据
CREATE OR REPLACE TRIGGER HR.update_job_history
AFTER UPDATE OF job_id, department_id ON employees
FOR EACH ROW
BEGIN
add_job_history(:old.employee_id, :old.hire_date, sysdate,
                  :old.job_id, :old.department_id);
END;

--给新数据某一列赋值
CREATE OR REPLACE TRIGGER HR.insert_job_history
BEFORE INSERT ON employees FOR EACH ROW
BEGIN
    :NEW.hire_date := sysdate;
END;

--整个表触发
create or replace trigger tr_zhaozhenlong
after delete or insert
on t_zhaozhenlong_d
--for each row
declare v_pk varchar2(20);
begin
     select c1 into v_pk from t_zhaozhenlong_d where rownum<=1 order by rownum;
     update t_zhaozhenlong_m set c2 = (select count(1) from t_zhaozhenlong_d where c1 = v_pk)
     where c1 = v_pk;

     if update( t_zhaozhenlong_d.c5)

         begin
                 update t_zhaozhenlong_d set c6 = c5 where c1 = v_pk;
         end;    
end;

三、oracle 特有对象的用法 —— bulk collect
      declare
      type mytb is table of gas.short_name%type;
      mytb1 mytb;
      begin
      select short_name bulk collect into mytb1 from gas where rownum <= 100;
      end;

四、数据库实例、数据库与用户
1、在oracle中,新建一个数据库就是一个实例,每个数据库对应于一个服务,要使用该数据库,必须启动对应的服务;在sqlserver中,一个实例对应于一个服务,要在该实例下创建数据库对象,必须启动该实例对应的服务。因此,oracle的一个数据对应于sqlserver中的一个实例。
2、在oracle中,一个数据库中可以创建多个用户,每个数据库对象(如:表、存储过程等)归属一个用户,每个用户下数据库对象是不能同名的;在sqlserver中,每个数据库对象归属于一个数据库,每个数据库中数据库对象是不能同名的。即,oracle的一个用户对应与sqlserver的一个数据库。

五、移动oracle数据库文件的位置

1、在开始-运行的命令行:
      sqlplus sys/xxb@orademo as sysdba

2、select file_name from sys.dba_data_files;

      数据文件:
C:/ORACLE/ORADATA/ORADEMO/SYSTEM01.DBF
C:/ORACLE/ORADATA/ORADEMO/UNDOTBS01.DBF
C:/ORACLE/ORADATA/ORADEMO/CWMLITE01.DBF
C:/ORACLE/ORADATA/ORADEMO/DRSYS01.DBF
C:/ORACLE/ORADATA/ORADEMO/EXAMPLE01.DBF
C:/ORACLE/ORADATA/ORADEMO/INDX01.DBF
C:/ORACLE/ORADATA/ORADEMO/ODM01.DBF
C:/ORACLE/ORADATA/ORADEMO/TOOLS01.DBF
C:/ORACLE/ORADATA/ORADEMO/USERS01.DBF
C:/ORACLE/ORADATA/ORADEMO/XDB01.DBF


3、shutdown immediate;

4、拷贝上面2中的原文件到新位置

5、将数据库起到mount状态

     在开始-运行的命令行:sqlplus /nolog

     connect sys/xxc@orademo as sysdba;

     startup mount;

6、rename第2步中所有文件,重复下面的语句:
alter database rename file 'C:/ORACLE/ORADATA/ORADEMO/SYSTEM01.DBF' to 'D:/ORACLE/ORADATA/ORADEMO/SYSTEM01.DBF';
     说明:原来的位置为'C:/ORACLE/ORADATA/ORADEMO/,新文件被拷贝到'D:/ORACLE/ORADATA/ORADEMO/

7、打开数据库:
      alter database open

      《特别说明》:在第6步中,你要rename的文件一定要是新文件,如果在移动的过程重,你open过数据库,那你在第4步中拷贝的文件已经不是最新的了,所以,在rename的过程中不要打开数据库,要么,如果你打开过,那未rename的文件一定要重新拷贝一个新的

六、如何取得一个select语句输出结果的列数?
问题:如何得到‘select * from xx,yy’ 的列数

分析:从数据上,很显然是xx,yy两个表的一个笛卡尔积,从列数上,是两个表列的和

解决方案: 在oracle中:

        1 create table zzzz as select * from xx,yy;

        2 select count(*) from user_tab_columns where lower(table_name) = 'zzzz';

        3 drop table zzzz;

这样,在第二条语句中就可以得到列数。

值得说明的是,xx,yy表中不能有重复的列名。


七、oracle 数据导入导出

drop user zhaozhenlong cascade;

CREATE USER zhaozhenlong PROFILE "DEFAULT"
    IDENTIFIED BY zhaozhenlong DEFAULT TABLESPACE zzlts
    QUOTA UNLIMITED
    ON zzlts
    ACCOUNT UNLOCK;

--说明:创建用户后,密码和用户名相同,请及时更改密码

--以DBA身份登录(当然,分配权限时一定要谨慎,这里只是测试数据的导入导出)

GRANT SYSDBA TO zhaozhenlong;
GRANT SYSOPER TO zhaozhenlong;
GRANT "DBA" TO zhaozhenlong;

--山东零管数据导入
--导入命令imp 要导入到某用户/要导入到某用户密码@数据库连接名称 file=要导入的文件位置及名称 此导出文件DMP时导出时的用户
imp zhaozhenlong/zhaozhenlong@zhaozhenlongdb file=//192.168.0.1/DatabaseBackup/zhaozhenlong01.DMP fromuser=zzl

--导出使用exp

八、oracle数据库字符集问题(数据抽取转换和修改db字符集)

情况一:数据抽取时,转换字符集:

A数据库是是US7ASCII 字符集,B是ZHS16GBK字符集,将A数据库的数据同步到B,可以使用:

utl_raw.cast_to_raw(列名)和utl_raw.cast_to_varchar2()来解决字符集不同的问题,如:

select gas_id,utl_raw.cast_to_raw(gas_id),utl_raw.cast_to_varchar2(utl_raw.cast_to_raw(gas_id)) from gas

情况二:修改db字符集:

方法1.在注册表中修改oracle 9字符集______________________
在注册表中ORACLE/HOME0/NLS_LANG=
原来为:AMERICAN_AMERICA.WE8ISO8859P1
修改为:SIMPLIFIED CHINESE_CHINA.ZHS16GBK

方法2.登录oracle 修改字符集______________________
以sysdba身份登陆,修改props$表中NLS_CHARACTERSET=ZHS16GBK或自己需要的字符集,然后重新启动Oracle。

方法3.登录oracle,修改字符集______________________
问题描述:
                  varchar2(4000) abc;
                  intert into table_name(abc) values('这里有1500个汉字……');
                  报错:插入字符过长!经过测试,发现一个汉字占3个字节,所以报错!            问题所在:
                  使用的字符集是UTF8,就有可能出现这个错误!
                  使用命令查看:
                  SQL> select * from v$nls_parameters where
parameter='NLS_CHARACTERSET';
                  PARAMETER
--------------------------------------------------------------------------------
                  VALUE
--------------------------------------------------------------------------------
                  NLS_CHARACTERSET
                  AL32UTF8
解决方法:
                  建议使用ZHS16GBK字符集!
                  操作:
                          SQL> SHUTDOWN IMMEDIATE;
                          SQL> STARTUP MOUNT;
                          SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
                          SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
                          SQL> ALTER DATABASE OPEN;
                          SQL> ALTER DATABASE CHARACTER SET AL32UTF8/ZHS16GBK;
                          SQL> SHUTDOWN IMMEDIATE;
                          SQL> STARTUP;
                   
九、在sql server使用dblink

USE RetailManager_hb
IF EXISTS(
SELECT * FROM SYSOBJECTS WHERE ID = OBJECT_ID('dbo.#ZYHZDB_XC') AND OBJECTPROPERTY(ID,'IsTable') = 1
)
DROP TABLE dbo.#ZYHZDB_XC

IF NOT EXISTS(
SELECT * FROM master.dbo.sysservers WHERE SRVNAME = '192.168.0.2'
)
EXEC sp_addlinkedserver '192.168.0.2',N'SQL Server'
go

EXEC sp_addlinkedsrvlogin '192.168.0.2', 'false', NULL, 'sa', ''
go
USE RetailManager_hb
GO
----------------ZYHZDB_XC---------------------------------
        SELECT O.NAME 表名,C.NAME AS 列名,T.NAME AS 类型,C.LENGTH AS 长度,C.PREC 精度,C.SCALE AS 小数位数 ,
           可否为空=
           CASE C.ISNULLABLE
           WHEN 0
           THEN 'YES'
           ELSE 'NO'
          END,P.VALUE AS 显示标签
INTO #ZYHZDB_XC  
        FROM [192.168.0.2].ZYHZDB_XC.[dbo].SYSCOLUMNS C,
[192.168.0.2].ZYHZDB_XC.[dbo].SYSOBJECTS O ,
[192.168.0.2].ZYHZDB_XC.[dbo].SYSTYPES T ,
[192.168.0.2].ZYHZDB_XC.[dbo].SYSPROPERTIES P
        WHERE T.USERTYPE=C.USERTYPE AND
           O.ID=C.ID AND (O.TYPE='U')
           AND O.NAME NOT IN ('SYSCONSTRAINTS','SYSSEGMENTS') AND  
           O.ID*=P.ID AND
           P.SMALLID=*C.COLORDER
           ORDER BY O.NAME,C.NAME
------------------RetailManager_hb------------------------------------
        SELECT O.NAME 表名,C.NAME AS 列名,T.NAME AS 类型,C.LENGTH AS 长度,C.PREC 精度,C.SCALE AS 小数位数 ,
           可否为空=
           CASE C.ISNULLABLE
           WHEN 0
           THEN 'YES'
           ELSE 'NO'
          END,P.VALUE AS 显示标签
INTO #RetailManager_hb  
        FROM [192.168.0.2].RetailManager_hb.[dbo].SYSCOLUMNS C,
[192.168.0.2].RetailManager_hb.[dbo].SYSOBJECTS O ,
[192.168.0.2].RetailManager_hb.[dbo].SYSTYPES T ,
[192.168.0.2].RetailManager_hb.[dbo].SYSPROPERTIES P
        WHERE T.USERTYPE=C.USERTYPE AND
           O.ID=C.ID AND (O.TYPE='U')
           AND O.NAME NOT IN ('SYSCONSTRAINTS','SYSSEGMENTS') AND  
           O.ID*=P.ID AND
           P.SMALLID=*C.COLORDER
           ORDER BY O.NAME,C.NAME

---------------ER---RetailManager_hb------------------------------------
        SELECT O.NAME 表名,C.NAME AS 列名,T.NAME AS 类型,C.LENGTH AS 长度,C.PREC 精度,C.SCALE AS 小数位数 ,
           可否为空=
           CASE C.ISNULLABLE
           WHEN 0
           THEN 'YES'
           ELSE 'NO'
          END,P.VALUE AS 显示标签
INTO #ER20060109
        FROM RetailManager_hb.[dbo].SYSCOLUMNS C,
RetailManager_hb.[dbo].SYSOBJECTS O ,
RetailManager_hb.[dbo].SYSTYPES T ,
RetailManager_hb.[dbo].SYSPROPERTIES P
        WHERE T.USERTYPE=C.USERTYPE AND
           O.ID=C.ID AND (O.TYPE='U')
           AND O.NAME NOT IN ('SYSCONSTRAINTS','SYSSEGMENTS') AND  
           O.ID*=P.ID AND
           P.SMALLID=*C.COLORDER
           ORDER BY O.NAME,C.NAME

select * from #ER20060109
select * from #ZYHZDB_XC
select * from #RetailManager_hb

十、在oracle中,使用sqlldr将文件中的数据导入到数据库2

1、创建数据文件:
      如,在D:/创建 zhaozhenlong.txt 文件,文件内容为:
11,12,13
21,22,23
31,32,33

2、创建控制文件:
      如,在D:/创建 zhaozhenlong.ctl 文件,文件内容为:
load data
infile 'd:/zhaozhenlong.txt'
append into table zhaozhenlong
fields terminated by ','
(c1,c2,c3)

3、在数据库中创建表:
      create table zhaozhenlong(c1 varchar(20),c2 varchar(20),c3 varchar2(20));

4、在‘开始’/‘运行’中,执行:
     sqlldr userid=cs/cs@orademo control=d:/zhaozhenlong.ctl

5、查询数据库:
     select * from zhaozhenlong
     结果为:
C1 C2 C3
1 11 12 13
2 21 22 23
3 31 32 33

十一、racle游标

create or replace procedure pr_zhaozhenlong_cursor
is
     cursor cur_zhaozhenlong is
     select rpt_date,dept_id,item--,sum((qty-10)*0.4) as myqty
       from tb_zhaozhenlong
      where rpt_date between to_date('2007-01-01','YYYY-MM-DD') and to_date('2007-01-15','YYYY-MM-DD')
            and (item like 'S%'--首字母S
                 or item like '__S%'--第三个字母S
                 or item like '%a_%' escape 'a'--包含"_",其中 escape后的a为转义符
                 )
   order by dept_id,rpt_date,item;--, myqty desc; --根据别名排序
                
     --存放fetck...into的结果(单条数据)
     v_rptdate date;
     v_deptid varchar(20);
     v_item    varchar(20);
begin
     insert into tb_temp_zhaozhenlong(dept_id,qty)
    select dept_id,sum(qty) from tb_zhaozhenlong where rpt_date between to_date('2007-01-01','YYYY-MM-DD') and to_date('2007-01-15','YYYY-MM-DD') group by dept_id;
    --使用游标
    open cur_zhaozhenlong;
    if not cur_zhaozhenlong%isopen then
    open cur_zhaozhenlong;
    end if;
    loop
        fetch cur_zhaozhenlong into v_rptdate,v_deptid,v_item;
        /*
        if cur_zhaozhenlong%found then
            update tb_temp_zhaozhenlong set memo = memo + v_item where dept_id = v_deptid;
        else
            exit;
        end if;
        */
        --或者
        update tb_temp_zhaozhenlong set memo = memo + v_item where dept_id = v_deptid;
        exit when cur_zhaozhenlong%notfound;
    end loop;

    open cur_errormess;
    loop
      fetch cur_errormess
        into str_errormess0;
      exit when cur_errormess%notfound;
      str_errormess := str_errormess || '/n    ' || str_errormess0;
      exit when length(str_errormess)>=4000;
    end loop;
    close cur_errormess;

    str_errormess :=str_errormess ||'/n已经存在数据,需要重新提取!';

end;
/

十二、oracle的类型(记录变量)

create or replace procedure pr_zhaozhenlong_type
is
     --记录,相当于结构
     type myrecodetype is record(myid tb_zhaozhenlong."id"%type,myname tb_zhaozhenlong.item%type);--注意 :在声明变量、查询数据时,关键字做列名要用双引号括起来
     myrecode myrecodetype;
     --表
     type mytabletype is table of tb_zhaozhenlong.item%type index by binary_integer;
     mytable   mytabletype;
     --嵌套表
     --create or replace type myobjecttype as object(dept_name varchar2(20),dept_add varchar2(100));
     /*
     create or replace type myobject is table of myobjecttype;
     create table mydept(dept_no varchar2(10),dept_1 myobject) nested table dept_1 store as dept_1;
     */
     --varray
     /*
     create type myvarray is varray(10) of myobjecttype;
     create table mydept_zzl(id varchar2(10),works myvarray);
     */
     v_item varchar2(20);
     v_item1   tb_zhaozhenlong.item%type;
     v_item2   v_item%type;
     --存放fetck ... bulk collect into 提取的所有数据(结果集)
     --type tb_type is table of

begin
     --记录
     select "id",dept_id into myrecode from tb_zhaozhenlong where "id" = '1';--&identity;
     --dbms_output.put_line(myrecode.myname);    
     --表
     select item into mytable(0) from tb_zhaozhenlong where "id" = '1';--&identity;
     mytable(-1) :='negative';
     mytable(1) :='negative';
     dbms_output.put_line(mytable(-1));
     dbms_output.put_line(mytable(1));
     dbms_output.put_line(mytable(1));
     dbms_output.put_line(mytable(1));--这样访问是错误的,因为没有此元素
end;
/

十三、对视图的增、删、改、查

如果符合视图 及物理表的约束条件,就可以对视图进行增删改查操作

drop view view_zhaozhenlong1
create view view_zhaozhenlong1 as select * from tb_zhaozhenlong with check option;
insert into view_zhaozhenlong1(DEPT_ID,ITEM,RPT_DATE) values('zhao','zhen',sysdate);

--如果有where条件,并且指定了 with check option属性,那么插入的数据必须符合视图的where条件
drop view view_zhaozhenlong2
create view view_zhaozhenlong2 as select * from tb_zhaozhenlong where dept_id = 'f' with check option;
insert into view_zhaozhenlong2(DEPT_ID,ITEM,RPT_DATE) values('zhao','zhen',sysdate);
insert into view_zhaozhenlong2(DEPT_ID,ITEM,RPT_DATE) values('f','zhen',sysdate);

drop view view_zhaozhenlong3
create view view_zhaozhenlong3 as select * from tb_zhaozhenlong where dept_id = 'f';
insert into view_zhaozhenlong3(DEPT_ID,ITEM,RPT_DATE) values('zhao','zhen',sysdate);

待整理:

物化视图
create materialized view mv_name
build immediate
on commit
as
select * from username.table@link_name;
我单独执行
select * from username.table@link_name;可以查的到,但是执行以上建视图就提示没权限select ?不知道还需要啥权限...

十四、oracl动态sql语句,调用包或执行dml语句

declare
     type refcursor is ref cursor;
     rc_zhaozhenlong refcursor;
begin
     --给动态语句传值(USING 子句)
     --执行 dml语句
     execute immediate 'insert into tb_zhaozhenlong(rpt_date,dept_id,item) values(:1,:2,:3)' using sysdate,'zhao','zhenlong';
     commit;
    
     --不能执行带ref cursor参数的包
     --因此,通过pr_zhaozhenlong,将数据插入到临时表,再从临时表取数据
     execute immediate 'begin pa_zhaozhenlong.pr_zhaozhenlong(:1,:2,:3,:4); end;'
     using in sysdate,in sysdate,in 'zhaozhenlong',out rc_zhaozhenlong;
    
     --调用包
     execute immediate 'begin pa_zhaozhenlong.pr_zhaozhenlong1(:1,:2,:3); end;'
     using in sysdate,in sysdate,in 'zhaozhenlong';
    
     --调用无参存储过程
     execute immediate 'begin pr_zhaozhenlong_loop; end;';
end;

动态执行ddl语句,参看《在oracle存储过程中执行动态sql》http://hi.baidu.com/zhao_e893/blog/item/53a658edd98e03d4b21cb175.html

十五、oracle的例外处理

create or replace procedure pr_zhaozhenlong_exception
is
     i int;
     ex_zhaozhenlong exception;
     pragma exception_init(ex_zhaozhenlong,-2291);
     ex_no_name exception;

begin
------------------------------------------------------------
--错误处理
     update tb_zhaozhenlong set qty = i where item = '1' ;
     if sql%notfound then
        raise ex_no_name;
     end if;
    
--2、判断DML语句是否执行成功
     --insert into mytable values(2,'bbbbb','b');
     --执行成功
     if sql%found then
        dbms_output.put_line('True');
     --未执行成功
     elsif sql%notfound then
     --else if sql%notfound then
     --注意esle if 与elsif的区别:如果时前者,则必须在结尾写end if;否则,用end if
        dbms_output.put_line('True');
     elsif null then
        dbms_output.put_line('注意在condition中使用null,等同于false');
     elsif i>1000 then
        goto end_dml;
     elsif i between 1 and 10 then
        dbms_output.put_line('注意 if 与between 的用法');
     else
        null; --null语句不会执行任何操作
     end if;
     --end if;
     commit;
     --影响的行数
     <<end_dml>>
     dbms_output.put_line(sql%rowcount);
/*
--4、case
--为了避免case_not_found的例外,应该带else
     case
         when p_name = 'zhao' then
               update mytable set myname = 'zhen' where "id" = '1';
     end case;
     open rc_zhaozhenlong for
      select case myname when 'zhao' then '1' when 'zhen' then '2' else '3' end case ,
             case when myname = 'zhaozhenlong' then '4' else '5' end as myname1
        from mytable;
*/
     --在应用程序中自定义错误信息
     select round(qty) into i from tb_zhaozhenlong where "id" = 1;
     if i is null then
          raise_application_error(-2001,'无销售量');
     end if;
    
exception
     when ex_zhaozhenlong then
          dbms_output.put_line('该数量不存在');
     when ex_no_name then
          dbms_output.put_line('该名称不存在');
     when too_many_rows or no_data_found then
          dbms_output.put_line('too_many_rows');
     when others then
          dbms_output.put_line('错误号:' ||sqlcode);    --返回错误信息号,和错误信息
          dbms_output.put_line('错误信息:' ||sqlerrm);   

end pr_zhaozhenlong_exception;
/


十六、oracle语句跟踪

--1、打开sqlplus
sqlplus /nolog

--2、以sys的dba身份登录
connect sys@orademo as sysdba;

--3、产生plustrace角色
@oracle/ora92/sqlplus/admin/plustrce.sql

--4、给某普通用户授角色
grant plustrace to cs;

--5、以此普通用户登录
connect cs

--6、创建跟踪表plan_table
@/oracle/ora92/rdbms/admin/utlxplan.sql

--打开时间显示
set time on;
打开自动分析统计,不显示SQL语句的运行结果
set autotrace on;

select * from tb_zhaozhenlong;
结果为:
        08:53:45 SQL> select * from tb_zhaozhenlong;       
        60 rows selected.
        Execution Plan
        ----------------------------------------------------------
           0      SELECT STATEMENT Optimizer=CHOOSE
           1    0   TABLE ACCESS (FULL) OF 'TB_ZHAOZHENLONG'
       
        Statistics
        ----------------------------------------------------------
                  0 recursive calls
                  0 db block gets
                 11 consistent gets
                  0 physical reads
                  0 redo size
               2763 bytes sent via SQL*Net to client
                536 bytes received via SQL*Net from client
                  5 SQL*Net roundtrips to/from client
                  0 sorts (memory)
                  0 sorts (disk)
                 60 rows processed       
        08:53:52 SQL>
关闭自动分析统计
set autotrace off;
set time off;
_______________________________________________________________________
补充:
其它参数说明:
SET AUTOTRACE OFF | ON EXPLAIN | ON STATISTICS | ON | TRACEONLY | TRACE EXPLAIN
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
SET AUTOTRACE ON ----------------- 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY ------ 同set autotrace on,但是不显示查询输出

查看IO数:
SELECT * FROM v$filestat ;
explain plan for select * from dual;

十七、当你误删了Oracle数据时,恢复数据

--查看当前数据语句
select * from tb_zhaozhenlong1;
--
drop table tb_zhaozhenlong1;
create table tb_zhaozhenlong1 as select * from tb_zhaozhenlong --2007-01-02 19:23:00没有时间戳

update tb_zhaozhenlong1 set "id" = rownum;
commit;--2007-01-02 19:26:00没有时间戳
--2007-01-02 19:28:00
delete from tb_zhaozhenlong1;--2007-01-02 19:29:00
commit;

insert into tb_zhaozhenlong1
select * from tb_zhaozhenlong1 as of timestamp to_timestamp('2007-01-02 19:28:00','YYYY-MM-DD HH24:MI:SS');
commit;--2007-01-02 19:33:00

--查看历史数据语句
select * from tb_zhaozhenlong1 as of timestamp to_timestamp('2007-01-02 19:50:00','YYYY-MM-DD HH24:MI:SS');
--查询2007-01-02 19:28:00到2007-01-02 19:33:00,看到2007-01-02 19:26:00到2007-01-02 19:29:00期间的数据,不包括2007-01-02 19:29:00
--查询2007-01-02 19:33:00到2007-01-02 19:38:00,看到2007-01-02 19:29:00到2007-01-02 19:33:00期间的数据,不包括2007-01-02 19:29:00
--查询2007-01-02 19:39:00到      现在         ,看到2007-01-02 19:33:00到2007-01-02 19:33:00期间的数据

十八、修改了服务器名称, 导致oracle监听服务(OracleOraHome92TNSListener)不能启动

1 问题:如果在安装了oracle之后,修改了oracle数据库服务器的名称,导致其监听服务不能启动。

2 处理方法:
修改oracle的监听初始化文件listener.ora(文件位置:ora92/network/admin),将其LISTENER中的HOST改成你修改后的数据库服务
器的名称。如:
LISTENER =
(DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
      )
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = MI)(PORT = 1521))
      )
    )
)


二九、当丢失了REDO01.LOG,REDO02.LOG...文件之后(丢失日志文件)打开数据库失败的解决方法

--说明:对正在使用的数据库,一定要谨慎

sqlplus /nolog

SQL> connect sys/xxb@demo as sysdba;

SQL> recover database until cancel;
Media recovery complete.

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

--重新设置日志文件

SQL> alter database open resetlogs;
Database altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup;
ORACLE instance started.

Total System Global Area 126950220 bytes
Fixed Size                   453452 bytes
Variable Size             109051904 bytes
Database Buffers           16777216 bytes
Redo Buffers                 667648 bytes
Database mounted.
Database opened.

--完成,退出
SQL>exit;

二十、在Oracle命令提示符,执行sql文件中脚本
sqlplus /nolog;
connect xc1118/xc1118@sdlgdb;
@ d:/createtable.sql;
@ ?/admin/sample/droptable.sql;

select count(1) from xxx;

原创粉丝点击