浅析Oracle和SqlServer存储过程的调试、出错处理数据库
“丽丽霹雳”通过精心收集,向本站投稿了9篇浅析Oracle和SqlServer存储过程的调试、出错处理数据库,下面是小编精心整理后的浅析Oracle和SqlServer存储过程的调试、出错处理数据库,希望能够帮助到大家。
篇1:浅析Oracle和SqlServer存储过程的调试、出错处理数据库
在大型数据库中,因为 开发 的需要,经常地需要调用Procedure,开发Procedure在 Oracle 和Sqlserver上因为语法不同,而有所区别,但是在调试上,都是比较的不容易,尤其是在一些错误处理上, 首先说调试: 1、对于Oracle的调试,可以借助于第三方的工具,比
在大型数据库中,因为开发的需要,经常地需要调用Procedure,开发Procedure在Oracle和Sqlserver上因为语法不同,而有所区别,但是在调试上,都是比较的不容易,尤其是在一些错误处理上。
首先说调试:
1、对于Oracle的调试,可以借助于第三方的工具,比如Pl/Sql Developer,我在用的版本是6.0.5.926;首先对该Procedure右键处理,添加“add debug information”,然后选择“test”,打开新的测试窗口,在下方对应的输入输出变量地方,添加相应的测试数据,注意:这里的数据输入,不需要引号,输出参数不需要输入然后点击“start debugger”,或者按F9,进行测试,可以选择测试的步骤如“step into”等,然后可以在下面的script窗口看到,中间变量;
2、对于SqlServer调试,我还没有找到比较好的第三方工具,目前是采用将中间的变量值或者sql语句插入到另一个表中,或者直接print出来的方式。第一种需要借助 exec('') 方法,注意里面的取变量值的写法,可参考下面的例子:
exec('update SupplyplanLack set Completedate = GetDate
from supplyPlanLack a where '+ @ssTmp +' and
'+@iCompleteQty+'>= (select s.RequestQty * a.RationQty as ReqQty
from Balance a, SupplyPlan s where a.Vehicle = s.Vehicle
and a.Part=s.Part and a.SupplyPlanNo = s.SupplyPlanNo
and '+ @ssTmp +')')
在print中,需要注意类型的转换,一般是借用 convert(varchar(11),@spNOTo) 方法来实现,否则会提示类型转换错误!
3、错误处理上,对于Sqlserver可以采用开始自定义变量,然后根据不同判断,改变该值然后推出的方法来处理,见下例
set @exec_num=0
if (@spNOFrom=0 or @spNOTo=0 or @reuseUser=NULL)
begin
set @exec_num=1
goto the_end
end
the_end:
return
或者是这种:
set nocount on
if (@property is null) or (@property = '')
begin
raiserror('Must specify a property name.',-1,-1)
return (1)
end
或者是对该错误全局变量 @@error 数值的判断上,
原文转自:www.ltesting.net
篇2:关于Oracle和SQL存储调试和出错处理数据库
在大型数据库中,因为 开发 的需要,经常需要调用Procedure,在 Oracle 和 SQL Server上开发Procedure因为语法不同,而有所区别;调试Procedure,在两个系统上都不太容易,尤其是进行错误处理时更是如此。 调试: 1. 对于Oracle的调试,可以借助于第三方的工
在大型数据库中,因为开发的需要,经常需要调用Procedure。在Oracle和SQLServer上开发Procedure因为语法不同,而有所区别;调试Procedure,在两个系统上都不太容易,尤其是进行错误处理时更是如此。
调试:
1. 对于Oracle的调试,可以借助于第三方的工具,比如Pl/SQL Developer,以6.0.5.926版本为例,首先对该Procedure右键处理,添加“add debug information”,然后选择“test”,打开新的测试窗口,在下方对应的输入输出变量处,添加相应的测试数据。注意:这里的数据输入,不需要引号,输出参数不需要输入!
然后点击“start debugger”,或者按F9进行测试,可以选择测试的步骤如“step into”等,然后可以在下面的script窗口看到中间变量。
2. 对于SQLServer调试,在没有找到较好的第三方工具的情况下,目前采用的是将中间的变量值或者SQL语句插入到另一个表中,或者直接print出来的方式。第一种需要借助 exec('') 方法,注意里面的取变量值的写法,可参考下面的例子:
exec('update SupplyplanLack set Completedate = GetDate()from supplyPlanLack a where '+ @ssTmp +' and'+@iCompleteQty+' >= (select s.RequestQty * a.RationQty as ReqQtyfrom Balance a, SupplyPlan s where a.Vehicle = s.Vehicleand a.Part=s.Part and a.SupplyPlanNo = s.SupplyPlanNoand '+ @ssTmp +')')
在print中,需要注意类型的转换,一般是借用 convert(varchar(11),@spNOTo) 方法来实现,否则会提示类型转换错误,
3. 错误处理上,对于SQLServer可以采用开始自定义变量,然后根据不同判断,改变该值再推出的方法来处理,见下例:
set @exec_num=0if (@spNOFrom=0 or @spNOTo=0 or @reuseUser=NULL)beginset @exec_num=1goto the_endendthe_end:return
或者是这种:
set nocount onif (@property is null) or (@property = '')beginraiserror('Must specify a property name.',-1,-1)return (1)end
或者是对该错误全局变量 @@error 数值的判断上。
(责任编辑:铭铭 mingming_ky@126.com TEL:(010)68476636)
原文转自:www.ltesting.net
篇3:关于Oracle存储过程测试
常规方式保存测试信息
创建相关数据表
创建数据表TestInfoLog,和序列号SEQ_TestInfoLog
参考当前目录下的 TestInfoLog.sql ,运行这部分脚本,
创建测试信息保存包
创建一个测试信息保存的 Package
参考当前目录下的 PKG_Test_Info.pck,编译这个包。
具体例子
例子1
在一个PL/SQL块中使用测试包来保存测试信息,参考当前目录下的 example1.sql
-- 简单使用的一个例子,结果查询
select * from TESTINFOLOG
declare
i integer :=1;
begin
PKG_Test_Info.clearAllLogInfo;
PKG_Test_Info.setLogContext('匿名块测试','无',1);
PKG_Test_Info.logInfo('i=1');
PKG_Test_Info.logInfo('当前日期='||To_char(sysdate,'yyyy-mm-dd'));
end;
例子2
在一个存储过程中保存测试信息
参考当前目录下的Test_PKG_Test_Info.prc
---在存储过程中保存测试信息,结果查询 select * from TESTINFOLOG
create or replace procedure Test_PKG_Test_Info(p_Param1 int,
p_Param2 int,
p_保存日志信息 int default 1) is
begin
if(p_保存日志信息)=1 then
PKG_Test_Info.clearAllLogInfo;
PKG_Test_Info.setLogContext('存储过程测试', 'Test_PKG_Test_Info', 1);
PKG_Test_Info.logInfo('p_Param1='||to_char(p_Param1)||',p_Param2='
||to_char(p_Param2));
end if;
end ;
卸载脚本
参考 uninsall.sql ,如果需要卸载运行这个脚本
其它的方式保存测试信息
Log4plsql的介绍
Log4plsql是一个open source的工具,是一个在Oralce PL/SQL 下实现的LOG框架。
Log4plsql 是基于log4J 演化得来的。
相关站点
log4plsql.sourceforge.net/
sourceforge.net/projects/log4plsql/
Log4plsql来做测试。
1.触发器的测试信息保存
1个触发器的例子,在触发器中记录相关信息
代码位于当前文件所在目录的 LOG_DML.sql
CREATE OR REPLACE TRIGGER LOG_DML BEFORE
INSERT OR UPDATE OR DELETE
ON T_ESSAIS FOR EACH ROW
BEGIN
IF DELETING OR UPDATING THEN
PLOG.INFO('T_ESSAIS:OLD:'||USER||':'||ld.data);
END IF;
IF INSERTING OR UPDATING THEN
PLOG.INFO('T_ESSAIS:NEW:'||USER||':'||:new.data);
END IF;
end;
2.存储过程中测试信息保存
在存储过程中进行日志操作,把相关存储过城的参数信息记录到日志数据表
代码位于当前文件所在目录的 testAssert.sql
create or replace procedure testAssert(p_Param1 int,p_Param2 varchar2)
IS
pCTX PLOG.LOG_CTX;
BEGIN
--如果 p_Param1<=1,那相关信息就将写入日志
PLOG.ASSERT(pCTX, p_Param1>1, 'p_Param1>1 always false');
--如果 p_Param2'man',那相关信息就将写入日志
PLOG.ASSERT(p_Param2 = 'man', 'p_Param2 man ');
PLOG.ASSERT(1 is null, '1 is null always false');
PLOG.ASSERT(NOT 1>1, 'NOT 1>1 never false');
PLOG.ASSERT(1>2, '1>2 always false', -1,
pRaiseExceptionIfFALSE=>TRUE ,
pLogErrorReplaceError=>FALSE);
PLOG.ASSERT(1>3, 'Never test there is a raise in previous assert');
END;
3.实现了树型目录的日志例子
代码位于当前文件所在目录的 testAssert2.sql
/**
*
purpose:这是一个在存储过程过程通过日志方式进行记录测试信息的例子,实现了树型目录的日志记录方式
*
*
* 使用方式
*
编译该存储过程*
* 删除TLOG表中的日志信息: delete from TLOG
*
* 测试该存储过程
* begin testassert2(10,'wdz123@hotmailcom');end;
*
* 察看结果 select from tlog
*
* @param p_Param1 是一个入口参数 ,它的值将被记录进入 日志中
* @param p_Param2 是另外一个入口参数 ,它的值将被记录进入 日志中
***/
create or replace procedure testAssert2(p_Param1 int, p_Param2 varchar2) IS
v_CTX PLOG.LOG_CTX;
v_Year varchar2(4);
BEGIN
---设置日志信息的根结点名称
v_CTX := PLOG.init('测试信息');
---构造树型日志的第2级
PLOG.setBeginSection(v_CTX, 'procedure_testAssert2_测试信息');
PLOG.setBeginSection(v_CTX, '检测入口参数');
--如果 p_Param1<=1,那相关信息就将写入日志
PLOG.ASSERT(v_CTX, p_Param1 >1, 'p_Param1>1 always false');
--如果 p_Param2'man',那相关信息就将写入日志
PLOG.ASSERT(p_Param2 = 'man', 'p_Param2 man ');
---关闭树型日志的第2级目录
PLOG.setEndSection(v_CTX, '检测入口参数');
---下面是根据实际业务需要进行一序列处理
null; ---这里是一些业务处理代码
---end 相关实际业务处理
---检查业务处理结果
--构造又一个2级树型日志目录
PLOG.setBeginSection(v_CTX, '检查业务处理结果');
---这里是根据实际需要,对相关处理结果的检查代码
select to_char(sysdate, 'YYYY') into v_Year from dual;
PLOG.assert(v_CTX,
v_Year = '',
'当前年份应该是=2003,实际是=' || v_Year);
---end 这里是根据实际需要,对相关处理结果的检查代码
--关闭当前的树型日志的第2级目录
PLOG.setEndSection(v_CTX, '检查业务处理结果');
PLOG.setEndSection(v_CTX, 'procedure_testAssert2_测试信息');
END;
Log4plsql的应用
由于PLOG 提供了assert的处理,因此可以考虑在存储过程和包中进行一些测试结果的检查,根据需要把测试结果保存下来,对于一些基于算法的存储过程的测试,可以考虑使用一些脚本来做一些自动化的回归测试,
应用例子
1.说明:
这个例子可能不能应用起来(没有相关的数据库环境,缺少相应的包),但是可以open一些脚本出来,来说明相关的表达意思。如果是公司内部,可以在福州项目数据库下可以运行起来。
2.参考文档
参考 带申请的业主整合算法的测试,有申请,没有产权阁楼,没有产权分摊,不存在人口安置。
相关存储过程/包
PKG_ConDebugInfo.Normal_OwnerReq_Recursive
PLOG包
相关文档
参考《测试__带申请的业主整合算法的测试.doc》
测试数据的输入,采用手工的方式输入,根据需要也可以全部脚本生成。
参考文档《测试__带申请的业主整合算法的测试.doc》列出的测试数据要求。
测试数据的动态修改/生成,根据测试用例,动态改变/生成测试数据。
参考 PKG_ConDebugInfo.Normal_Owner_UpdateData3
测试结果的检查
参考 PKG_ConDebugInfo.Normal_Owner_Check_Data3
扩展
为了基于pl/sql的测试信息做的更好。可以从以下几个方面来做。
1.可以考虑自己去修改 Log4plsql提供的PLOG包,
1.1修改数据表TLOG,增加一些字段保存其他信息(比如:可以保存客户端IP)。
修改存储过程PLOG.addRow ,把相关信息保存到测试数据表。
可以从后台获取一些运行环境信息,比如采取下面的类似方式获取一些信息
SYS_CONTEXT('USERENV','CURRENT_USER')
SYS_CONTEXT('userenv', 'ip_address')
1.2增加其他一些方法
根据实际需要可以往PLOG包增加其他一些方法,比如日志的删除之类的。
最好还是另外包装1层,象上面的Oracle包PKG_ConDebug一样,定义1个包来做一些相关包装。
2.修改视图 VLOG,按照具体要求来现显示一些测试结果信息。
例如:创建下面的视图。
create or replace view vlog2 as
select
LUSER 数据库用户,
plog.getLevelInText(llevel) as 测试信息等级,
LSECTION 日志目录,
LTEXTE 错误信息,
LDATE 产生错误时间
from tlog a
3.算法测试的自动化
可以根据需要,增强上面Log4plsql的应用中关于测试数据的生成部分,并且做到据根据业务需要,测试测试数的生成可以带有随机性。或者按照关键用例为主来生成测试数据。
篇4:oracle 存储过程经典实例
/**
--将相同分类下的知识分配到不同的分类下面
-- whwu2
*/
create or replace procedure test_pro --定义存储过程名
is
row_num number := 1; --变量的声明与赋初始值
total_num varchar2(1000); --变量的声明
tmp_kbcCode varchar2(1000);
CURSOR myCusor IS --游标的定义
select tt.kbccode from knowledgebase_category tt;
begin
WHILE row_num <= 3 LOOP
dbms_output.put_line('执行while循环'); ---打印一些调试信息
row_num := row_num +1;
END LOOP;
--------------方法的执行体------------------------------
select to_number(count(1)) into total_num from knowledge; --对 total_num 进行赋值
dbms_output.put_line('Total_num' || total_num); ---打印一些调试信息
open myCusor; --打开游标
loop
fetch myCusor
into tmp_kbcCode; --循环遍历游标,并把游标里面的值依次赋给 tmp_kbcCode
exit when myCusor%notfound;
if (row_num + 10) < total_num then
-- if 条件
update knowledge tt
set tt.kbccode = tmp_kbcCode
where tt.kcode in (select kcode
from (select t.kcode, rownum rn from knowledge t)
where rn >= row_num
and rn <= row_num + 10);
row_num := row_num + 10;
end if;
end loop;
commit;
end test_pro;
篇5:如何调用Oracle存储过程
一个存储过程大体分为这么几个部分:
创建语句:create or replace procedure 存储过程名
如果没有or replace语句,则仅仅是新建一个存储过程,如果系统存在该存储过程,则会报错。Create or replace procedure 如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程。
存储过程名定义:包括存储过程名和参数列表。参数名和参数类型。参数名不能重复, 参数传递方式:IN, OUT, IN OUT
IN 表示输入参数,按值传递方式。
OUT 表示输出参数,可以理解为按引用传递方式。可以作为存储过程的输出结果,供外部调用者使用。
IN OUT 即可作输入参数,也可作输出参数。
参数的数据类型只需要指明类型名即可,不需要指定宽度。
参数的宽度由外部调用者决定。
过程可以有参数,也可以没有参数
变量声明块:紧跟着的as (is )关键字,可以理解为pl/sql的declare关键字,用于声明变量。
变量声明块用于声明该存储过程需要用到的变量,它的作用域为该存储过程,
另外这里声明的变量必须指定宽度。遵循PL/SQL的变量声明规范。
过程语句块:从begin 关键字开始为过程的语句块。存储过程的具体逻辑在这里来实现。
异常处理块:关键字为exception ,为处理语句产生的异常。该部分为可选
结束块:由end关键字结果。
存储过程的参数传递方式
存储过程的参数传递有三种方式:IN,OUT,IN OUT .
IN 按值传递,并且它不允许在存储过程中被重新赋值。如果存储过程的参数没有指定存参数传递类型,默认为IN
例子:
创建:
CREATE OR REPLACE PROCEDURE P_1(S_NO INT)
AS
S_AGE INT;
BEGIN
SELECT SAGE INTO S_AGE FROM STU WHERE SNO=S_NO;
DBMS_OUTPUT.PUT_LINE(S_AGE);
END P_1;
调用:
EXEC P_1(1);
即直接调用 存储过程名 就ok
篇6:Delphi与SQLServer存储过程编程详解数据库
前言 经常有很多初学者问到在delphi中如何调用 SQL Server的存储过程 ?问题其实很好解决,但问得多了,也就不愿答了,下面我将用实例进行说明,从在SQL Server中创建存储过程到调用的完整实例。 首先,打开 sql server管理器,在pubs 数据库 中建一个 测试 表
前言
经常有很多初学者问到在delphi中如何调用SQLServer的存储过程?问题其实很好解决,但问得多了,也就不愿答了。下面我将用实例进行说明,从在SQL Server中创建存储过程到调用的完整实例。
首先,打开sqlserver管理器,在pubs数据库中建一个测试表,表名为test,字段有id,name,和desc,全部为字符型,如果你不知道建表,那么打开sql查询分析器,贴上以下的代码,然后按执行,就会自动生成test表.
use pubs
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[test]
GO
CREATE TABLE [dbo].[test] (
[id] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[name] [char] (12) COLLATE Chinese_PRC_CI_AS NULL ,
[descrip] [char] (30) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
然后,我们来创建一个存储过程,其功能为在test中插入一条新记录.创建存储过程的代码如下,同样的,你也可以复制到查询分析器里直接执行就可以:
CREATE PROCEDURE myInsert
@id char(10) ,
@name varchar(12),
@descrip varchar(30)
AS
begin
insert into test (id,name,descrip) values (@id,@name,@descrip)
if @@rowcount=0
begin
raiserror('error',16,1)
rollback transaction
end
end
GO
接下来,新建一个工程文件,在form1上放置如下控件,并设置属性(括号内):
一个ADOConnection1: TADOConnection;
(LoginPrompt:=false;
connectionstring:=Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=pubs;Data Source=(local);)
一个ADOStoredProc1: TADOStoredProc;属性为:
(connection:=adoconnection1;
procedurename:=myinsert;//上面我们创建的那个)
一个ADOTable1: TADOTable;属性为:
(connection:=adoconnection1;
tablename:=test; //上面我们创建的那个)
一个Datasource1,属性为:
(dataset:=Tadotable;)
一个 DBGrid1: TDBGrid;属性为
(datasource:=datasource1;)
一个Button1,在其Onclick中写到:
with adoStoredproc1 do
begin
Parameters.ParamByName('@id').Value := '2';
parameters.ParamByName('@name').Value := 'myname';
parameters.ParamByName('@descrip').Value :='nosubject';
ExecProc;
end;
Adotable1.Close;
adotable1.Open;
原文转自:www.ltesting.net
篇7:数据库面试题:存储过程
存储过程和函数的区别是什么?
答:存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。
而函数通常是数据库已经定义的方法,它接收参数并返回某种类型的值,并且不涉及特定用户表,例如聚集函数avg、max、count等,日期时间单数day、month等。
PL/SQL(Procedural Language/SQL, PL/SQL)是编写数据库存储过程的一种过程语言,它结合了SQL的数据操纵能力
和过程化语言的流程控制能力,是SQL的过程化扩展。
综上PL/SQL就是对数据的操纵过程化
存储过程的优点
它是由PL/SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只要调用即可。
1、由于存储过程不像解释执行的SQL语句那样在提出操作请求时才进行语法分析和优化工作,因而运行效率高,
它提供了在服务器端快速执行SQL语句的有效途径。
2、存储过程降低了客户机和服务器之间的通信量。客户机上的应用程序只要通过网络向服务器发出存储过程的名字和参数,就可以让RDBMS执行许多条的SQL语句,并执行数据处理。只有最终处理结果才返回客户端。
3、方便实施企业规则。可以把企业规则的运算程序写成存储过程放入数据库服务器中,由RDBMS管理,既有利于集中控制,又能方便地进行维护。当用户规则发生变化时,只需要修改存储过程,无需修改其他应用程序。
[数据库面试题:存储过程]
篇8:SQLSERVER Pager store procedure分页存储过程数据库教程
复制代码代码如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Pagination]
@Page int = 1, -- 当前页码
@PageSize int = 10, -- 每页记录条数(页面大小)
@Table nvarchar(500), -- 表名或视图名,甚至可以是嵌套SQL:(Select * From Tab Where ID>1000) Tab
@Field nvarchar(800) = '*', -- 返回记录集字段名,“,”隔开,默认是“*”
@OrderBy nvarchar(100) = 'ID ASC', -- 排序规则
@Filter nvarchar(500), -- 过滤条件
@MaxPage smallint output, -- 执行结果 -1 error, 0 false, maxpage true
@TotalRow int output, -- 记录总数 /* -07-12 22:11:00 update */
@Descript. varchar(100) output -- 结果描述
AS
BEGIN
-- =============================================
-- Author: Jimmy.Yu
-- Create date: 2007-5-11
-- Description: SQL 以上版本 通用分页存储过程
-- =============================================
Set ROWCOUNT @PageSize;
Set @Descript. = 'successful';
-------------------参数检测----------------
IF LEN(RTRIM(LTRIM(@Table))) !>0
Begin
Set @MaxPage = 0;
Set @Descript. = 'table name is empty';
Return;
End
IF LEN(RTRIM(LTRIM(@OrderBy))) !>0
Begin
Set @MaxPage = 0;
Set @Descript. = 'order is empty';
Return;
End
IF ISNULL(@PageSize,0) <= 0
Begin
Set @MaxPage = 0;
Set @Descript. = 'page size error';
Return;
End
IF ISNULL(@Page,0) <= 0
Begin
Set @MaxPage = 0;
Set @Descript. = 'page error';
Return;
End
-------------------检测结束----------------
Begin Try
-- 整合SQL
Declare @SQL nvarchar(4000), @Portion nvarchar(4000);
Set @Portion = ' ROW_NUMBER OVER (ORDER BY ' + @OrderBy + ') AS ROWNUM FROM ' + @Table;
Set @Portion = @Portion + (CASE WHEN LEN(@Filter) >= 1 THEN (' Where ' + @Filter + ') AS tab') ELSE (') AS tab') END);
Set @SQL = 'Select TOP(' + CAST(@PageSize AS nvarchar(8)) + ') ' + @Field + ' FROM (Select ' + @Field + ',' + @Portion;
Set @SQL = @SQL + ' Where tab.ROWNUM >' + CAST((@Page-1)*@PageSize AS nvarchar(8));
-- 执行SQL, 取当前页记录集
Execute(@SQL);
--------------------------------------------------------------------
-- 整合SQL
Set @SQL = 'Set @Rows = (Select MAX(ROWNUM) FROM (Select' + @Portion + ')';
-- 执行SQL, 取最大页码
Execute sp_executesql @SQL, N'@Rows int output', @TotalRow output;
Set @MaxPage = (CASE WHEN (@TotalRow % @PageSize)0 THEN (@TotalRow / @PageSize + 1) ELSE (@TotalRow / @PageSize) END);
End Try
Begin Catch
-- 捕捉错误
Set @MaxPage = -1;
Set @Descript. = 'error line: ' + CAST(ERROR_LINE() AS varchar(8)) + ', error number: ' + CAST(ERROR_NUMBER() AS varchar(8)) + ', error message: ' + ERROR_MESSAGE();
Return;
End Catch;
-- 执行成功
Return;
END
相对应的页面逻辑中写的对应调用该存储过程的方法(C#)
篇9:Oracle批量导出存储过程
Oracle批量导出存储过程
法一:
PL/SQL工具导出
法二:
Sql代码
SET echo off;
SET heading off;
SET feedback off;
spool C:\Documents and Settings\Administrator\桌面\proc.sql;
--1、用sys用户等陆的话:
Sql代码
select text from dba_source where owner= 'lingfeng' and type = 'PROCEDURE';
--2、用一般用户(要导出其下存储过程的用户):
Sql代码
select text from user_source;
spool off;
法三:(自己写存储过程导出)
1.创建DIRECTORY
Sql代码
create or replace directory PROCE_DIR as 'C:/Documents and Settings/Administrator/桌面';
如创建报没权限的错误,则以system的用户登录,给当前用户赋权
--赋权语句
Sql代码
grant create any directory to bijian;
--撤权语句
Sql代码
revoke create any directory from bijian;
创建之后可通过如下语句查询是否创建成功
Sql代码
select * from dba_directories;
2.创建导出存储过程
Sql代码
create or replace procedure loadProce(owner varchar2)
is
type user_source_table_type is table of user_source.text%TYPE INDEX BY BINARY_INTEGER;
user_source_table user_source_table_type;
file_handle utl_file.file_type;
stor_text VARCHAR2(4000);
sql_stat varchar2(1000);
sql_stat2 varchar2(1000);
sql_stat3 varchar2(1000);
nCount NUMBER;
i NUMBER;
begin
sql_stat:='select distinct(name) from all_source where wner = ''' || upper(owner) || '''';
execute immediate sql_stat bulk collect into user_source_table;
file_handle:=utl_file.fopen('PROCE_DIR','test.sql','W');
for j in 1..user_source_table.count loop
i:=1;
sql_stat2:='SELECT MAX(LINE) FROM ALL_SOURCE WHERE WNER=''' || upper(owner) || ''' AND NAME=''' || user_source_table(j) || '''';
--dbms_output.put_line(sql_stat2);
execute immediate sql_stat2 into nCount;
WHILE i<=nCount LOOP
sql_stat3:='SELECT TEXT FROM ALL_SOURCE WHERE WNER=''' || upper(owner) || ''' AND NAME=''' || user_source_table(j) || ''' and line = ' || i;
--dbms_output.put_line(sql_stat3);
execute immediate sql_stat3 into stor_text;
i:=i+1;
utl_file.put(file_handle,stor_text);
END LOOP;
end loop;
utl_file.fclose(file_handle);
commit;
end loadProce;
3.调用,将TYPE BODY、PROCEDURE、TYPE、FUNCTION、TRIGGER、PACKAGE BODY、PACKAGE保存到桌面的test.sql中
Sql代码
begin
loadproce('bijian');
end;
【浅析Oracle和SqlServer存储过程的调试、出错处理数据库】相关文章:
2.系统从oracle版本转化为sqlserver版本数据库教程






文档为doc格式