oracle批处理文件

oracle批处理文件.txt男人的话就像老太太的牙齿,有多少是真的?!问:你喜欢我哪一点?答:我喜欢你离我远一点!执子之手,方知子丑,泪流满面,子不走我走。诸葛亮出山前,也没带过兵!凭啥我就要工作经验?简单的oracle备份恢复批处理文件

建议一:

 

利用任务计划、批处理文件和ORACLEEXP导出功能,可以根据日期自动生成ORACLE备份文件,大大方便了ORACLE数据备份。:

1、建立批处理文件backup.bat\.

exp system/manager file=d:\backup\oracle\oracle%date:~0,10%.dmpowner=system log=d:\backup\oracle\oracle%date:~0,10%.log

将生成oracle2006-01-09.dmp文件

exp system/managerfile=d:\backup\oracle\oracle%date:~11,3%.dmp owner=systemlog=d:\backup\oracle\oracle%date:~11,3%.log

将生成oracle星期一.dmp文件,则每周循环保留一个备份文件,共7个备份文件循环

2、添加一个任务计划

利用任务计划向导,根据备份策略设置自动执行任务的时间频率(例如每天零时),执行d:\oracle\backup.bat

3、以后每天将在目录中生成形如“oracle2005-08-31.dmporacle2005-08-31.log”的备份和日志文件。

说明:

1%date%的值在不同的系统、语言版本下可能是不一样的,控制面板里面区域选项的设定也会改变%date%的值。请先在命令行中测试 echo %date% 的返回值。%date:~4,10% 是返回日期函数,~后的第一个参数是要截取的起始位置(从0开始),第二个参数是要截取的长度,如没有则是截取到最后,参数可酌情修改。

2、如需要准确的时间做为文件名,请用%time%函数,参数同上。

 

建议二:

 

@echo off

set filename=e:\data_bak\%date:~8,2%

exp userid=user/pass@esdata file=%filename%.dmpowner=user INDEXES=y grants=y constraints=y compress=y log=%filename%.log

rar a %filename%.rar %filename%.*

del %filename%.dmp

del %filename%.log

放计划任务里面定时执行,

文件名以日期的day部分来命名

备份后调用rar进行压缩

这样可以保存一个月的历史数据

注意:需要把program files/winrar目录下的rar.exe拷贝到系统system32目录下

如果是以星期命名,则需要将set filename=e:\data_bak\%date:~8,2%日修改为

set filename=e:\data_bak\%date:~0,3%

 

建议三:

 

以下为ORACLE 自动备份批处理文件内容,请配合任务计划实现

 

@ECHO OFF

SET BACKPATH=d:\

ECHO 准备备份数据库

REM 7天一个循环

IF EXIST %BACKPATH%\ONE GOTO ONE

IF EXIST %BACKPATH%\TWO GOTO TWO

IF EXIST %BACKPATH%\THREE GOTO THREE

IF EXIST %BACKPATH%\FOUR GOTO FOUR

IF EXIST %BACKPATH%\FIVE GOTO FIVE

IF EXIST %BACKPATH%\SIX GOTO SIX

IF EXIST %BACKPATH%\SEVEN GOTO SEVEN

ECHO E > %BACKPATH%\ONE

 

:ONE

SET BACKPATH_FULL=%BACKPATH%\ONE

REN %BACKPATH%\ONE TWO

GOTO BACK

:TWO

SET BACKPATH_FULL=%BACKPATH%\TWO

REN %BACKPATH%\TWO THREE

GOTO BACK

:THREE

SET BACKPATH_FULL=%BACKPATH%\THREE

REN %BACKPATH%\THREE FOUR

GOTO BACK

:FOUR

SET BACKPATH_FULL=%BACKPATH%\FOUR

REN %BACKPATH%\FOUR FIVE

GOTO BACK

:FIVE

SET BACKPATH_FULL=%BACKPATH%\FIVE

REN %BACKPATH%\FIVE SIX

GOTO BACK

:SIX

SET BACKPATH_FULL=%BACKPATH%\SIX

REN %BACKPATH%\SIX SEVEN

GOTO BACK

:SEVEN

SET BACKPATH_FULL=%BACKPATH%\SEVEN

REN %BACKPATH%\SEVEN ONE

GOTO BACK

:BACK

EXP TESTUSER/TEST FILE=%BACKPATH_FULL%.DMP

SET BACKPATH=

SET BACKPATH_FULL=

EXIT

 

建议四:

 

RMAN TARGET=RMAN/RMAN@ORCL < C:\RMAN.TXT

 

建议五:

 

在文本里编辑cmd命令。然后保存成bat文件。在windows中定义任务计划,就

可以自动执行了。

例:

 

   编辑文本文件

   delc:\exp\*.dmp

   expuserid=cw/cw@db file='c:\exp\*.dmp' tables=(student)

保存成bat文件

 

建议六:

 

写个简单的批处理文件备份恢复:

备份:

@echo off                        不显示命令行

 

echo 开始备份表.....                       打印信息               

D:                                                                     DOS切换到D:

cd oracle\ora92\bin                          切换到cdoracle\ora92\bin目录

exp 用户名/密码@数据库 file=d:\config_bak.dmp tables=(table1,table2)      备份表一表二到d:\config_bak.dmp

echo 备份完毕!

 

恢复:

@echo off           

 

echo 开始恢复表.....                     

D:

cd oracle\ora92\bin

imp 用户名/密码@数据库 file=d:\config_bak.dmp tables=(table1,table2) ignore=y  

sqlplus /nolog @oraStartup.sql>>oraStartup.log 调用sql文件

pause                                                                执行完sql文件以后暂停,看信息

echo 恢复完毕!

 

编写oraStartup.sql

conn 用户名/密码@数据库 as sysdba

select * from table1

quit

 

 

      

 

 

执行环境:可以在SQLPLUS.EXE或者DOS(命令行)中执行,

DOS中可以执行时由于 在oracle 8i 中 安装目录\ora81\BIN被设置为全局路径,

该目录下有EXP.EXEIMP.EXE文件被用来执行导入导出。

oraclejava编写,我想SQLPLUS.EXEEXP.EXEIMP.EXE这俩个文件是被包装后的类文件。

SQLPLUS.EXE调用EXP.EXEIMP.EXE他们所包裹的类,完成导入导出功能。

 

  下面介绍的是导入导出的实例,向导入导出看实例基本上就可以完成,因为导入导出很简单。

数据导出:

1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp

exp system/manager@TEST file=d:\daochu.dmp full=y

2 将数据库中system用户与sys用户的表导出

exp system/manager@TEST file=d:\daochu.dmpowner=(system,sys)

3 将数据库中的表table1 table2导出

exp system/manager@TEST file=d:\daochu.dmptables=(table1,table2)

4 将数据库中的表table1中的字段filed1"00"打头的数据导出

exp system/manager@TEST file=d:\daochu.dmptables=(table1) query=\" where filed1 like '00%'\"

 

上面是常用的导出,对于压缩我不太在意,用winzipdmp文件可以很好的压缩。

不过在上面命令后面 加上 compress=y 就可以了

 

  数据的导入

1 D:\daochu.dmp 中的数据导入 TEST数据库中。

imp system/manager@TEST file=d:\daochu.dmp

上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。

在后面加上 ignore=y 就可以了。

2 d:\daochu.dmp中的表table1 导入

imp system/manager@TEST file=d:\daochu.dmptables=(table1)

 

        导入

基本上上面的导入导出够用了。不少情况我是将表彻底删除,然后导入。

**************************************************

求助,批处理文件如何访问oracle数据库?

 

 

本人想通过windows的批处理文件访问数据库,并且执行我的SQLPL/SQL脚本,请教如何写?

 

小弟现在只会通过批处理文件连接到数据库,如何执行SQL就不会写了

sqlplus username/password@dbname

 

test.bat文件内容

 

sqlplus scott/tiger@dev @c:test1.sql

 

test1.sql的内容

 

set heading off

set termout off

set freeback off

spool c:test.sql

select * from emp where rownum<5;

spool off

 

双击执行bat文件后,察看输出的文件test.sql内容

 

 

      7369SMITH      CLERK           7902 17-12-80            800           

        20                                                                     

                                                                               

      7499ALLEN      SALESMAN        7698 20-2 -81           1600        300

        30                                                                     

                                                                               

      7521WARD       SALESMAN        7698 22-2 -81           1250        500

        30                                                                     

                                                                                

      7566JONES      MANAGER         7839 02-4-81           2975           

        20                                                                     

                                                                               

 

更改bat文件内容为

sqlplus scott/tiger@dev <c:test1.sql (执行完窗口即关闭)

 

输出文件内容为

 

SQL> select * from emp where rownum<5;

 

      7369SMITH      CLERK           7902 17-12-80            800           

        20                                                                     

                                                                               

      7499ALLEN      SALESMAN        7698 20-2 -81           1600        300

        30                                                                      

                                                                               

      7521WARD       SALESMAN        7698 22-2 -81           1250        500

        30                                                                      

                                                                               

      7566JONES      MANAGER         7839 02-4-81           2975           

        20                                                                      

                                                                               

 

SQL> spool off

 

/

**************************************************

Oracle数据库定时自动备份批处理代码(Windows

Oracle数据库定时自动备份批处理代码(Windows

 

    这是最近写的一个Oracle数据库自动备份的批处理,经过测试正常运行,记录如下。包括两部分,逻辑备份和冷备份,如有不完整之处,还往看到本文的高手指导!

 

注:这些内容是本人经过一番学习和多次测试调试后的结果,如果想转载,请以连接的形式,谢谢合作!

 

第一部分,逻辑备份

 

下面是:AutoBackup_Logic.bat --逻辑备份的主文件,直接在计划任务中调用就可以了。

@echo off

 

rem

rem 需要配置的参数说明:

rem BAT_HOME:即本批处理所在的目录;

rem DUMP_DIR:即要备份到的数据文件目录,存在与数据字典表:dba_directories 中。

rem

 

set BAT_HOME=E:\BAT

set DUMP_DIR=E:\Temp\DBBackup

set BKFILE=%Date:~0,4%%Date:~5,2%%Date:~8,2%

set HHMMSS=%time:~0,2%%time:~3,2%%time:~6,2%

 

call %BAT_HOME%\LogicBackup.bat %DUMP_DIR%>%BAT_HOME%\LogicBackup_%BKFILE%%HHMMSS%.log

 

echo Completed!

 

下面是:LogicBackup.bat

@echo off

 

rem call LogicBackup.bat %DUMP_DIR%

rem==========================================================================================

rem     本批处理实现支持expdp数据泵的Oracle数据库版本的数据库逻辑备份,流程为:导出数据到

rem dump_dir 数据库目录下,然后把dmp文件以rar格式放入当天备份日期命名的目录下,便于以后按

rem 照日期恢复。

rem

rem 需要配置的参数说明:

rem BAT_HOME:即本批处理所在的目录;

rem BKDIR:是调用本批处理时传进来的参数 dump_dir,即要备份到的数据文件目录。

rem

rem Author: Sanlavo

rem Time: 2007-06-07

rem==========================================================================================

rem

 

 

echo 备份开始...

echo 当前的时间是: %DATE% %time%

 

set BAT_HOME=E:\BAT

set BKDIR=%1

set BKFILE=%Date:~0,4%%Date:~5,2%%Date:~8,2%

set HHMMSS=%time:~0,2%%time:~3,2%%time:~6,2%

 

expdp system/sys parfile=%BAT_HOME%\ScriptsLib\parfiletest.sql

 

if not exist %BKDIR%\%BKFILE%_LOGIC (

md %BKDIR%\%BKFILE%_LOGIC

) else (

echo 目录 %BKDIR%\%BKFILE%_LOGIC 已经存在

)

 

echo 开始压缩文件...

rar a%BKDIR%\%BKFILE%_LOGIC\%BKFILE%%HHMMSS%_LOGIC_FULL.rar %BKDIR%\*.dmp

echo 压缩文件 %BKFILE%%HHMMSS%_LOGIC_FULL.rar 完成

 

echo 开始移动文件...

move %BKDIR%\*.dmp %BKDIR%\%BKFILE%_LOGIC\

move %BKDIR%\*.log %BKDIR%\%BKFILE%_LOGIC\

echo 移动文件完成

 

echo 开始删除dmp文件...

del /f /s /q %BKDIR%\%BKFILE%_LOGIC\*.dmp

echo 删除dmp文件完成

 

net send %userdomain% "数据库逻辑备份已于:%DATE% %time% 完成!"

 

echo .

echo 备份已于:%DATE% %time% 完成!

echo .

 

rem 移动批处理的日志文件到备份目录下面

xcopy %BAT_HOME%\LogicBackup_%BKFILE%*.log%BKDIR%\%BKFILE%_LOGIC\

echo Successfully Completed!

 

下面是expdpparfile参数的文件(parfiletest.sql)内容:

directory=dump_dir

dumpfile=DBBackup_Logic_%U.dmp

logfile=DBBackup_Logic.log

filesize=80M

full=y

job_name=EXP_DB_FULL

 

到此,逻辑备份批处理完成,可以用命令来定时执行,例如:

 

c:\>at 06:06 /every:S E:\BAT\AutoBackup_Logic.bat

 

这样,逻辑备份将会在每周星期六凌晨六点六分执行。

 

第二部分,冷备份:

 

下面是:AutoBackup.bat --主文件

@echo off

 

set BAT_HOME=E:\BAT

set DUMP_DIR=E:\Temp\DBBackup

 

call ColdBackup.bat orcl %DUMP_DIR%>%BAT_HOME%\ColdBackup_%DATE:~0,10%.log

 

pause

 

下面是备份流程文件:ColdBackup.bat

@echo off

rem E:\BAT>ColdBackup.bat orcl E:\Temp\DBBackup

rem

rem==============================================

rem 要备份的文件列表有:参数文件、控制文件、数据文件、重做日志文件

rem

rem 参数文件有:

rem %ORACLE_HOME%\database\spfile<sid>.ora

rem %ORACLE_HOME%\database\PWD<sid>.ora

rem %ORACLE_HOME%\database\pfile<sid>.ora

rem

rem 控制文件:可以通过查询数据字典视图v$control 确认控制文件的位置和清单

rem select status,name from v$controlfile;

rem

rem 数据文件:可以通过查询数据字典视图 dba_data_files 确定数据文件的位置和清单

rem select status,file_name from dba_data_files;

rem

rem 重做日志文件:查询数据字典v$logfile可以确认联机重做日志文件的位置和清单

rem select group#,status,member from v$logfile;

rem Author: Sanlavo

rem Time: 11:35 2007-5-31

rem==============================================

rem

 

rem 请在这里配置好本批处理程序所放的路径BAT_HOME以及ORACLE_HOME:

set ORACLE_HOME=D:\oracle\product\10.2.0\db_1

set BAT_HOME=E:\BAT

set BKFILE=%Date:~0,4%%Date:~5,2%%Date:~8,2%

set HHMMSS=%time:~0,2%%time:~3,2%%time:~6,2%

 

rem 数据库脱机

call %BAT_HOME%\ShutdownDB.bat %1

 

rem %1 为数据库<SID> %2为备份文件路径

 

rem 创建备份目录

if exist %2\%BKFILE%_DBBackup (

echo %2\%BKFILE%_DBBackup 已经存在

) else (

mkdir %2\%BKFILE%_DBBackup

echo %2\%BKFILE%_DBBackup 已经创建

)

 

rem copy备份文件到备份目录中

rem call xcopyfiles.bat %1 %2

 

rem begin ==============================================

echo 数据库 %1 冷备份开始...

 

rem 备份 dbs 目录下参数文件

xcopy %ORACLE_HOME%\dbs\*.* %2\%BKFILE%_DBBackup\dbs/S /I /C /Y /F

 

rem 备份 %ORACLE_HOME%\database 目录下参数文件

xcopy %ORACLE_HOME%\database\*.*%2\%BKFILE%_DBBackup\database /S /I /C /Y/EXCLUDE:ScriptsLib\databaseExclude.lst /F

 

rem 备份数据库控制文件、数据文件、重做日志文件

rem 创建数据库<SID>命名的文件夹,存放相关文件

if not exist %2\%BKFILE%_DBBackup\%1 (

md %2\%BKFILE%_DBBackup\%1

)

rem filepath.txt中读取文件路径信息并copy到目标路径

for /f %%i in (%BAT_HOME%\ScriptsLib\filepath.txt) do(

xcopy %%i %2\%BKFILE%_DBBackup\%1 /S /I /C /Y /F

)

 

echo 数据库 %1 冷备份完成!

rem end ==============================================

 

echo 启动数据库

rem 上面的操作过程中以及修改了环境路径,所以掉不到该批处理文件

%BAT_HOME:~0,2%

cd %BAT_HOME%

call %BAT_HOME%\StartupDB.bat %1

 

:Operation

 

:End

 

rem if exist *.dmp (

rem move *.dmp %BKFILE%_DBBackup & goto End1

rem echo Move dump file successfull

rem )else (

rem echo 不存在数据库备份文件 & goto End1

rem )

 

rem End

rem :: 把日期目录下的文件移动到当前目录

rem :: move %BKFILE%_DBBackup\*.bat

 

rem :End1

rem echo *

rem echo Operation Successfully

rem echo *

 

pause

 

上文中的:databaseExclude.lst 内容如下:

.log

.exe

 

即,排除日志文件和exe文件,其他的全部备份。

 

上文中的:filepath.txt

内容是经过数据字典查询后得到的比如控制文件、数据文件、日志文件等的路径列表,例如:

 

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF

D:\SDEDB.DBF

E:\SDEDB\SDE_DATA01.DBF

E:\SDEDB\SDE_INDEX01.DBF

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\WJ01.DBF

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG

D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG

 

...

 

在冷备份中涉及到数据库的关闭和启动,这里不在罗索了。关于冷备份的执行,也可以模仿逻辑备份部分,在计划任务中调用。

 

**************************************************

oracle本地批绑定

可以在 PL/SQL 块的内部运行 SQL 语句,一般的方法是:

 

A 使用通常位于服务器端的 PL/SQL 引擎,做纯粹的 PL/SQL 执行。但是,客户端程序有它自己的 PL/SQL 引擎。

 

B 所有的 SQL DML 语句都被送到 SQL 引擎进行执行,结果和数据或 DML 执行后结果再传送加 PL/SQL 引擎。

 

 

 

这样导至的结果:当 SQL 语句在 PL/SQL 引擎和 SQL 引擎之间进行传送的时候,可能会发生上下文切换。在 PL/SQL 内执行 SQL 时,一件很重要的事情就是要保证查询最优化。由于代码往往是 PL/SQL 代码与 SQL 代码混合一起的,所以其执行过程还应该包括两种代码的解析。

 

 

 

不同引擎之间传送语句的操作被称为上下文切换,而上下文切换可能导致代码的执行达不到最佳。

 

 

 

解决这种情能问题的方法之一就是通过使用批绑定。在 Oracle 8i 中引入的批绑定,全面提高了 PL/SQL 的执行性能,在 Oracle9i 中又做了以下加强:

 

       如果涉及到DML 的批绑定发生异常,使用 SAVE EXEPTIONS 子句处理仍可以连续运行。

 

       直接在单个DML 语句中支持批动态 SQL 处理多行数据的能力。

 

可以与 RETURNING 子句一起使用动态 SQL ,支持多行更新和删除。在 oracle 9i 以前本地动态 SQL 只在单行输出才支持 RETURNING 子句。

 

 

 

 

 

接下来介绍可以提高程序执行性能的批绑定的各种特性,然后介绍以下语句的技术:

 

       DML

 

批查询

 

批动态 SQL

 

 

 

DML

 

       DML是由使用 PL/SQL index-by 表或集合作为 DML 语句的输入、批量地执行 INSERT UPDATE DELETE 的语句组成的。可以使用 FORALL 语句执行批 DML ,如:

 

create or replace procedure batch_dml(errnumoutnumber,errtext outvarchar2)

is

   typeuser_record isrecord(  -- 定义记录类型

     id number,

    namevarchar2( 200 ),

     sexvarchar2( 2 )

   );

   type user_tabistableof user_record indexbybinary_integer; -- 定义记录类型的 index-by

 

   user_recsuser_tab;

begin

    for idx in 1.. 5 loop   -- 初始化数据

        user_recs(idx).id:=idx;

        user_recs(idx).name:= 'xxxxx' ||idx;

        user_recs(idx).sex:= 'F' ;

    endloop;

    deletefromt_user;

    for idx inuser_recs.first..user_recs.lastloop

       insertinto t_user values(user_recs(idx).id,user_recs(idx).name,user_recs(idx).sex);

    endloop;

    commit;

    errnum:= 0 ;

    errtext:= '';

exception

    whenothersthen

        errnum:=sqlcode;

        errtext:=sqlerrm; 

end batch_dml;

对于这段代码, FOR LOOP 循环每执行一次,其中的insert 语句就会被送到 SQL 引擎一次,也就发生一次上下文切换。这意味着当数据量很大的时候阻塞就会很严重,而这时 insert 语句也就会影响数据库更多的记录行,而使用批绑定可以很大程度上提高程的执行性能。

 

绑定指的是在 SQL 语句中为 PL/SQL 变量赋值,而一次性地将整个值集合绑定称为批绑定。批绑定能减少数据往返的次数,因些在 PL/SQL SQL 引擎之间上下文切换次数也会减少。这样显著提高程序的执行性能。可以使用 FORALL 语句来执行 DML 批绑定。其语法如下:

 

       FORALLindex IN index-by.first..index-by.last [save exceptions]

 

                    Sql_statement;

 

下面我们把上面的 batch_dml 改成批绑定的 DML ,代码如下:

 

create or replace procedure batch_dml(errnumoutnumber,errtext outvarchar2)

is

   --typeuser_record is record(  --?¨ò?????ààDí

    -- idnumber,

   --  name varchar2(200),

   --  sex varchar2(2)

  --  );

   --typeuser_tab is table of user_record index by binary_integer; --?¨ò?user_recordààDíμ?index-by±íààDí

   --user_recsuser_tab;

  

   typeuser_id_tab istableofnumberindexbybinary_integer;

   typeuser_name_tab istableofvarchar2( 20 ) indexbybinary_integer;

   typeuser_sex_tab istableofvarchar2( 2 ) indexbybinary_integer;

  

   user_iduser_id_tab;

   user_nameuser_name_tab;

   user_sexuser_sex_tab;

begin

    for idx in 1.. 50000 loop   -- 初始化数据

        user_id(idx):=idx;

        user_name(idx):= 'xxx' ||idx;

        user_sex(idx):= 'F' ;

    endloop;

    deletefromt_user;

    forall idxin user_id.first..user_id.last

       insertinto t_user values(user_id(idx), user_name(idx),user_sex(idx));

    commit;

    errnum:= 0 ;

    errtext:= '';

exception

 

    when othersthen

         commit;

 

    errnum:=sqlcode;

        errtext:=sqlerrm; 

end batch_dml;

插入 50000 条记录仅用了 2.16

 

 

 

使用 FORALL 时,多个 INSERT UPDATE DELETE 语句是在一个数据库调用中完成的。这就缩短了程序的执行时间。只有单条引用了集合元素的 INSERT UPDATE DELETE 语句才可以使用 FORALL 进行执行。

 

 

 

SQL 出错以后

 

当发生 SQL 错误的时候,产生错误的那条 SQL 操作是以一种自动回滚的方式终止的,而接着程序的执行就停止下来。只有产生错误的这条 SQL 才可以回滚。而一旦执行成功,前的 SQL 语句是不再回滚了。

 

 

 

SAVE EXCEPTION 子句

 

Oracle 9i 中增强了批 DML 在发生异常时处理的错误及失败的程序执行能力。这是通过 FORALL 语句的 SAVE EXCEPTION 子句来实现,其语法如下:

 

 FORALL  index in lower..upper  save exceptions

 

 

 

SAVE EXCEPTIONS 子句是 oracle 9i 中引入的,它在一个隐式游标属性 SQL%BULK_EXCEPTIONS 中保存错误行,允许 FORALL 语句继续处理其余行。

 

下面这一段代码是 SQL%BULK_EXCEPTIONS 的应用例子:

 

create or replace procedure batch_dml(errnumoutnumber,errtext outvarchar2)

is

 

 

   typeuser_id_tab istableofnumberindexbybinary_integer;

   typeuser_name_tab istableofvarchar2( 20 ) indexbybinary_integer;

   typeuser_sex_tab istableofvarchar2( 2 ) indexbybinary_integer;

  

   user_iduser_id_tab;

   user_nameuser_name_tab;

   user_sexuser_sex_tab;

  

  bulk_bind_excep EXCEPTION;

  pragmaexception_init(bulk_bind_excep,- 24381 );

begin

    for idx in 1.. 50000 loop   --3?ê??ˉindex-by????

        user_id(idx):=idx;

        user_name(idx):= 'xxx' ||idx;

        user_sex(idx):= 'F' ;

    endloop;

    user_id( 40000 ):= 39999 ;

    user_id(10000 ):= 9999 ;

    deletefromt_user;

    forall idxin user_id.first..user_id.lastsaveexceptions

       insertinto t_user values(user_id(idx), user_name(idx),user_sex(idx));

    errnum:= 0 ;

    errtext:= '';

exception

    whenbulk_bind_excep then

         for iin 1 ..sql%bulk_exceptions.countloop

            dbms_output.put_line( 'Iteration '||SQL%bulk_exceptions(i).error_index|| 'failed with error '||sqlerrm(sql%bulk_exceptions(i).error_code));

         endloop;

         commit;

   whenothersthen

         commit;

        errnum:=sqlcode;

        errtext:=sqlerrm; 

end batch_dml;

这个例子是修改了上面的程序,加上 save exceptions 异常处理,当批 dml 发生异常时也能正常运行。

 

 

 

FORALL 语句属性

 

与隐式游标的属性一样,批绑定操作也有与之关联的标量属性,这些标量属性有 %found %NOTFOUND %ROWCOUNT %ROWCOUND 属性是基于批绑定的 SQL 语句全部执行完成以后的。 %FOUND %NOTFOUND 指的是刚刚执行的那一条 SQL 语句。

 

 

 

批查询

 

可以使用 bulk collect into collection_name ,其中 collect_name index-by 表、嵌套表或 Varray 的名称。可以在 select into fetch into returning into 子句中使用 bulk collect 。可以在 into 例表中经引用多个类集。

 

  select ..into 语句中使用 bulk  collect

 

语法如下:

 

Select column_name bulk collect into collect_name

 

例子:

 

create or replace procedure bulkcollectdemo(

    errnumoutnumber,

    errtextoutvarchar2

)

authidcurrent_user

is

 type uidtabistableof t_user.id%type;

 type unametabistableof t_user.name%type;

 id_tab uidtab;

 name_tabunametab;

begin

   selecta.id,a.name  bulkcollectintoid_tab,name_tab from t_user a orderby a.id;

   for i inid_tab.first..id_tab.lastloop

      null;

   endloop;

   errnum:= 0 ;

   errtext:= '';

exception

  whenothersthen

    errnum:=sqlcode;

    errtext:=sqlerrm;  

end;

 

使用 bulk collect 的主要优点是:它减少在 SQL PL/SQL 引擎之间的上下文切换次数,最大程度的提高程序执行的性能,在选择记录里可以使用 rownum 来限制加载的行数。实现这种功能的代码如下:

 

select id bulk collect into region_name whererownum<51;

 

 

 

Fetching 中使用 BULK COLLECT

 

从游标中取多行数据时,可以使用 bulk collect 。其语法如下:

 

 Fetchcursor_name bulk collect into collection_name

 

下面的例子是修改上一个存储过程的,其代码如下:

 

create or replace procedure bulkcollectdemo(

    errnum outnumber,

    errtextoutvarchar2

)

authidcurrent_user

is

 type uidtabistableof t_user.id%type;

 type unametabistableof t_user.name%type;

 id_tab uidtab;

 name_tabunametab;

 cursorcur_tuser is

    selectid,namefrom t_user orderby id;

begin

   open cur_tuser;

   fetchcur_tuser bulkcollectinto id_tab,name_tab;

  dbms_output.put_line(id_tab.count);

   for i inid_tab.first..id_tab.lastloop

      if i= 37then

       dbms_output.put_line( '------' );

      endif;

   endloop;

   closecur_tuser;

   errnum:= 0 ;

   errtext:= '';

exception

  whenothersthen

    errnum:=sqlcode;

    errtext:=sqlerrm;  

end;

 

不能在 forall 语句中使用 select ... bulkcollect 语句

 

 

returning into 中使使用 bulk collect

 

 

 

弄不明白暂时不管

 

 

 

 

 

批动态 SQL

 

本地动态 SQL 比静态 SQL 更优,它的执行也更快,在 Oracle 9i 之前,只能使用 DBMS_SQL 来执行批动态 SQL Oralce 9i 已经增强了本地动态 SQL ,使其支持批处理操作。

 

1 、通过使用 SELECT INTO 语句,将 BULK COLLECT EXECUTE IMMEDIATE 结合在一起进行批查询,其语法如下:

 

Execute immediate select statement bulk collect into collection_name;

 

 

 

2 、将 execute immediate forall 语句结合起来一起使用进行批 DML, 语法如下:

 

   Forall indexin lower..upper

 

       Execute  immediate sql_statement  usingcollection_name;

 

  例子:

 

       Forall Iin  region_ids.first..region_ids.last

 

         Executeimmediate insert into region_tab value (:ip_ids,:ip_name) using region_ids(i),region_names(i);

 

 

 

3 、使用 fetch..bulk collect into... 从使用本地动态 SQL 打开的游标中进行批取值,语法如下:

 

       Opencursor_variable_name for dyn_sql_statement;

 

Fetch cursor variable_name bulk collect intocollection_name;

 

例子:

 

Cursor cur_tuser is select tname form t_user order byid;

 

Begin

 

  opencur_tuser;

 

  fetchcur_tuser bulk collect into  tname;

 

使用动态语句,把以上代码改成如下:

 

Type rc is ref cursor;

 

Cur_tuser rc;

 

Begin

 

  Open cur_tuserform select name form t_user;

 

  Fetchcur_tuser bulk collect into region_names;

 

**************************************************

WinRar命令行定时自动备份Sql数据库文件(2008-11-03 17:35:47)标签:杂谈   分类:软件开发

 

WinRar命令行定时自动备份Sql数据库文件

步骤

1.安装Winrar;

2.新建文本文件,输入代码:

 

 

 程序代码

@echo off

net stop MSSQL

cd d:\progra~1\winrar

winrar.exe a -ag -k -r -s -ibck -inulE:\SQLDataBase\Back\SQL.rar E:\SQLDataBase\SQL2005

net start MSSQL

exit

3.将代码保存为BackSQL.bat

4.设置系统计划任务,定时运行BackSQL.bat,这样即可达到定时备份sql数据库目的;

 

 

net stop MSSQL 或者(net stop MSSQL$SQLEXPRESS):关闭系统服务 MSSQLMSSQL$SQLEXPRESS,其中$SQLEXPRESS为实例名,可以不带;(sql2000默认为MSSQL,安装两个sql的第二个sqlserver默认为MSSQL$SQLEXPRESS)

cd d:\progra~1\winrar:Winrar安装目录;

winrar.exe:运行winrar;

a :备份所有文件;

-ag :当创建压缩文件时,以格式“YYYYMMDDHHMMSS”附加当前日期字符串,文件名SQLYYYYMMDDHHMMSS.rar;

-k :锁定压缩文件;

-s :创建固实压缩文件;

-ibck :后台运行;

-inul :禁用错误提示,避免无法压缩数据库文件时,不执行后续的数据库服务的开启;

E:\SQLDataBase\Back\SQL.rar :备份的路径和基本名称(-ag参数会自动在SQL后加上系统当前时间);

E:\SQLDataBase\SQL2005 :要备份的文件目录;

net start MSSQL:开启sql服务;

 

**************************************************

 

**************************************************

 

**************************************************

 

**************************************************

 

**************************************************

 

**************************************************

Oracle数据库备份与恢复的方法 冷备份(2008-11-03 11:29:52)标签:杂谈   分类:Oracle技术

 

冷备份

冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份时将关键性文件拷贝到另外的位置的一种说法。对于备份Oracle信息而言,冷备份时最快和最安全的方法。冷备份的优点是:

1、 是非常快速的备份方法(只需拷文件)

2、 容易归档(简单拷贝即可)

3、 容易恢复到某个时间点上(只需将文件再拷贝回去)

4、 能与归档方法相结合,做数据库“最佳状态”的恢复。

5、 低度维护,高度安全。

但冷备份也有如下不足:

1、 单独使用时,只能提供到“某一时间点上”的恢复。

2、 再实施备份的全过程中,数据库必须要作备份而不能作其他工作。也就是说,在冷备份过程中,数据库必须是关闭状态。

3、 若磁盘空间有限,只能拷贝到磁带等其他外部存储设备上,速度会很慢。

4、 不能按表或按用户恢复。

如果可能的话(主要看效率),应将信息备份到磁盘上,然后启动数据库(使用户可以工作)并将备份的信息拷贝到磁带上(拷贝的同时,数据库也可以工作)。冷备份中必须拷贝的文件包括:

1、 所有数据文件

2、 所有控制文件

3、 所有联机REDO LOG文件

4、 Init.ora文件(可选)

值得注意的使冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态时,执行数据库文件系统备份是无效的。

下面是作冷备份的完整例子。

1) 关闭数据库

 

 

 

sqlplus /nolog sql>;connect /as sysdbasql>;shutdown normal;

2) 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数文件

 

sql>;cp <file>; <backup directory>;

3) 重启Oracle数据库

 

sql>;startup

 

**************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值