存储过程简单案例以及使用方法

上传人:宝路 文档编号:6822608 上传时间:2017-09-14 格式:DOC 页数:10 大小:479.01KB
返回 下载 相关 举报
存储过程简单案例以及使用方法_第1页
第1页 / 共10页
存储过程简单案例以及使用方法_第2页
第2页 / 共10页
存储过程简单案例以及使用方法_第3页
第3页 / 共10页
存储过程简单案例以及使用方法_第4页
第4页 / 共10页
存储过程简单案例以及使用方法_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《存储过程简单案例以及使用方法》由会员分享,可在线阅读,更多相关《存储过程简单案例以及使用方法(10页珍藏版)》请在金锄头文库上搜索。

1、存储过程使用方法总结以及案例分析归纳起来 PB 中调用 Oracle 存储过程有以下四种方法:方法一: 以关键字 RPCFUNC 声明存储过程;方法二: 以 DECLARE PROCEDURE 语句声明存储过程;方法三: 以动态 SQL 语句实现;方法四: 调用函数 PBDBMS.PutLine。一般情况下,方法一能得到较好的运行效率和更完善的功能。因此推荐使用方法一。但是某些类型的存储过程只能使用其他方法。以下重点介绍方法一和方法二。两种方法比较起来,有以下几点主要区别: 方法一适用于具有 IN、 OUT 和 IN OUT 参数的存储过程,而方法二仅支持 IN 和 OUT参数,不支持 IN

2、OUT 参数; 方法一对参数的数目无限制,方法二最多支持 255 个参数; 方法一不支持记录(Recorder) 的传递,方法二可传递和接收记录。一、方法一操作步骤:1)在用户对象画笔中创建一个 ClassStandard 类型的,从 Transaction 继承的用户对象。2)在此用户对象中,声明 Local External Functions,将存储过程以 RPCFUNC 关键字声明为外部函数。在 Declare Local External Functions 对话框中按 Procedures 按钮选择要调用的后台存储过程,或直接输入类似 subroutine TEST(long id

3、,ref string name)RPCFUNC ALIAS FOR “DEV TEST”的语句。例如中 DEV TEST 的参数为(id IN NUMBER,name IN OUT VARCHAR2)。3)保存该用户对象。4)在 Application 画笔中,进入应用属性对话框,在 Variable Types 页,将上Transaction 用户对象设置为缺省的全局变量 SQLCA。5)脚本中,编码调用相应的外部函数。形式:SQLCA 函数名( 参数)。如可用“SQLCA TEST(lnid,lsname);”调用例子中定义的 DEV TEST 存储过程。其中 lnid,lsname 为

4、调用参数。方 法 一 注 意 事 项 :1) 由于 PB 中 String 类型的数据长度是动态分配的,因此对 Ref String 类型的参数,每次调用前需要申请足够的空间。例如上例从输入的 id 值检索 name,后台声明的 NAME 数据类型为 VARCHAR2(30),每次调用 SQLCA TEST 前需要用ls_name=SPACE(30)置 ls_name 为足够长度的空串。 2) 类似地当传递的参数为数组(后台称 PL/SQL Table)时,声明参数为相应类型的动态数组,并在每次调用前设置数组上界为足够大的值。例如:DEV 用户的 DEPT 包中声明了 TYPE tblname

5、 IS TABLE OF VARCHAR2(30) INDEX BY BINARYINTEGER;存储过程 EMPOFDEPT(deptid IN NUMBER,name OUT DEPT.tblname)返回部门编写为 deptid 的部门的所有员工,置 name 数组中。假定所有部门的员工数目不超过 100,则可用以下语句声明和调用 DEV EMPOFDEPT:Declare External Functions 对话框中:Subroutine EMPOFDEPT(long deptid,ref string name) RPCFUNC ALIAS FOR DEV.EMP_OF_DEPTP

6、owerScript 脚本中:long ln=deptidstring lsanamelsaname100= /置动态数组 lsaname 上界为 100lndept id=2SQLCA.EMPOFDEPT(ln deptid,lsaname) /检索部门 2 的所有员工的名字二、方法二使用方法:在脚本中加入如下编码(以 DEV TEST 为例) :long lnidstring lsnamelnid=100DECLARE test PROCEDURE FOR DEV.TEST(:lnid); /test 有一个 IN 参数,一个OUT 参数EXECUTE test;FETCH test IN

7、TO:lsname;三、方法三使用方法:根据输入输出参数的不同,PB 中的动态 SQL 语句有四种格式: 1)无输入输出参数;2)只有输入参数,无输出参数;3)有确定数目输入输出参数;4) 输出结果列的数目不定。其中第 1)、第 2)中格式的动态 SQL 语句也可用来调用简单的存储过程。1)没有输入输出参数的存储过程。例如 DEV DEMO1 存储过程没有输入输出参数,可用下列语句调用:sqlstring= EXECUTE DEMO1()EXECUTE IMMEDIATE:sqlstring;2)只有输入参数的存储过程。例如 DEV.DEMO2(name IN VARCHAR2,birthda

8、y IN DATE)PREPARE SQLSA FROM EXECUTE DEMO2(?,?);EXECUTE SQLSA USING:lsname,:ldtbirthday;如果是 7 2 以下版本的 SQL,可用方法四 PBDMBS.PutLine()函数调用建立存储过程。此时需选上 Database Profile 中的 PBDBMS 复选框。四、存储过程作为数据窗口的数据源以一个简单数据窗口(显示服务器的系统时间 )为例说明怎样创建存储过程作为数据源的数据窗口。1)在某个包(如 PACKTYPE)中定义日期类型的 Recorder 自定义数据类型 datarec;2)创建返回系统时间的

9、存储过程:PROCEDURE getsysdata(sysdt IN OUT PACKTYPE.datarec)ISBEGINopen sysdt for select sysdate from dual;END;3)新建数据窗口,数据源选择 Stored Procedure;4)在随后的 Select Stored Procedure 对话框中选择 getsysdate 即可。如果作为数据源的存储过程有 IN 参数,则这些参数就是数据窗口的检索参数 (Retrieve Argument)。五、案例分析 假设有表 USERGROUP,包含字段如下图所示。一、有输入输出的存储过程的使用提取存储过

10、程输出值的 PB 脚本:CREATE PROCEDURE dbo.demo x varchar(30) ,y varchar(10) outputasselect y = groupname from usergroupwhere groupid = xreturn 11GOint nstring xx,yy = s001sqlca.AutoCommit = TRUEdeclare psp_demo procedure for demo x = :yy,y = :xx output using sqlca;EXECUTE psp_demo;/messagebox(sdf,sqlca.sqldb

11、code)fetch psp_demo into :xx;st_1.text = xx + yycb_2.text = xxSQLca.AutoCommit = falseclose psp_demo;存 储 过 程 案 例 , 数据 库 加 载 后 使 用 .rar二、有一个输入,多个输出的存储过程的使用提取存储过程输出值的 PB 脚本:三、RPC(Romote Procedure Call,远程过程调用)调用,使用事务对象调用存储过程,使存储过程的调用如同函数的使用31、在 SQL 里定义存储过程:int nstring xx,yy = s001,zz,mmsqlca.AutoCommit

12、 = TRUEdeclare psp_demo procedure for demo2 x = :yy,y = :xx output ,z = :zz output,m = :mm output;EXECUTE psp_demo;/messagebox(sdf,sqlca.sqldbcode)fetch psp_demo into :xx ,:zz,:mm;st_2.text = xx + + yy + + zz + + mmSQLca.AutoCommit = falseclose psp_demo;CREATE PROCEDURE demo2 x varchar(30) , y varch

13、ar(30) output ,z varchar(40) output,m varchar(20) outputASselect y = groupname , z = loginid,m = loginpwdfrom usergroupwhere groupid = xreturn 11GOCREATE PROCEDURE dbo.demo x varchar(30) ,y varchar(10) outputas-declare y varchar(40)select y = groupname from usergroupwhere groupid = xreturn 11GO32、新建

14、事物对象,同时声明存储过程为外部函数,方法如下:1) new-pb object-standard class,在出来的选择窗口上拉下来选择 transaction2) 翻到 declare local external function, 右键,paste - SQL - remote store procedure.3) 选择存储过程,pb 会生成函数声明,不过参数类型可能会不对,要自己改回来,还有如果是 output 参数要改成 ref 调用4) 保存这个 transaction,比如名称是 uo_tran5) 打开 application,点击属性页上的 additional prop

15、erties,打开附加属性页6) 在附加属性页上翻到 variables 页面,把 sqlca 那一栏中的 Transaction 改成你的Transaction 对象,也就是 uo_tran7) 在 script 中可以调用 sqlca.pr.(arg1)了33 在 PB 脚本输入 PROFILE 数据库配制脚本后,在某个按钮中输入以下代码:34 注释:由于 PB 中 String 类型的数据长度是动态分配的,因此对 Ref String 类型的参数,每次调用前需要申请足够的空间。例如上例从输入的 id 值检索 name,后台声明的 NAME 数据类型为 VARCHAR2(30),每次调用 SQLCA TEST 前需要用 ls_name=SPACE(30)置ls_name 为足够长度的空串string i = space(30) /原因看后面的解释long xxxx = sqlca.demo(s001,i) /调用st_1.text = return of demo procedure : +i + n + name : +string(xx)四、数据窗口显示存储过程的结果41 不带参数的存储过程的调用411 存储过程412 建立数据窗口对象:选择数据源为“Store

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号