集算器可以方便的调用数据库的存储过程,这里通过例子来看一下具体的程序写法。
调用无返回值的存储过程
用oracle的存储过程为例,存储过程只有一个输入参数,没有输出参数:
create orreplace procedure pro1
(pid IN VARCHAR)
as
begin
insert into emp values(pid,'mike');
update emp set name='rose' where id=pid;
commit;
end;
在集算器中可以使用execute函数或者proc函数来调用这个存储过程:
A1:连接数据库。
A2:调用存储过程,输入参数值为4。
Proc函数主要用来调用有返回值和结果集的存储过程,也可以用来调用无返回参数的存储过程pro1。
A1:连接数据库。
A2:调用存储过程pro1,逗号后边的是参数的描述,4:0:"i":中定义了一个输入参数,4是输入参数的值,0表示输入参数的类型是由集算器自动识别,”i”表示输入类型。如果需要手工指定参数类型可以写为:4:1:"i":,中间的1代表×××int。集算器支持的参数类型详见附录:参数类型定义。
二、调用单返回值的存储过程
下面的存储过程要返回一个参数值,所以不能使用execute函数,需要使用proc函数。
create or replace procedure testb
(para1 in varchar2,para2 out varchar2)
as
begin
select name into para2 from emp where id= para1;
end testb;
集算器调用这个存储过程的代码是:
A1:连接数据库。
A2:使用proc函数调用存储过程testb。这里使用了两个参数:1:0:”i”:表示值为1,类型为自动判断的输入参数;:11:”o”:name中的11代表字符串类型(详见附录:参数类型定义),”o”代表输出类型,name是为这个输出参数定义了一个集算器变量,接收返回值。
A3:将A2中存储过程输出的值从name变量赋值给A3单元格。
三、调用返回单结果集的存储过程
存储过程RQ_TEST_CUR返回单个结果集:
CREATE ORREPLACE PROCEDURE RQ_TEST_CUR
(
V_TEMP OUT TYPE.RQ_REF_CURSOR,
PID IN VARCHAR
)
AS
BEGIN
OPEN V_TEMP FOR SELECT * FROM TESTWHERE ID =PID;
END RQ_TEST_CUR;
存储过程输入一个参数,返回了一个结果集。在集算器中调用这个存储过程的代码如下:
A2单元格使用proc函数调用存储过程:proc("{callRQ_TEST_CUR(?,?)}",:101:"o":table1,1:0:"i":)。下面依次解释一下proc行数的输入参数:
1) sql字符串
"{call RQ_TEST_CUR(?,?)}"中包含调用存储过程的名字,问号表示sql的参数。
2) 输出参数
:101:"o":table1中定义了一个输出参数,101代表其数据类型是游标,”o”代表这个参数是输出参数。Table1是定义了一个变量,可以用这个变量引用返回结果。输入参数
1:0:"i":中定义了一个输入参数,1是输入参数的值,0表示输入参数的类型是由集算器自动识别。
A3单元格通过使用A2中的输出变量来引用存储过程的执行结果,计算结果与A2相同,都是包含id和name两个字段的序表。
四、调用返回多结果集的存储过程
先编写一个oracle存储过程返回两个结果集:
create or replace procedure proAA
(
out_var out sys_refcursor,
out_var2 out sys_refcursor
)
as
begin
open out_var for select * from emp;
open out_var2 for select * from test;
end;
存储过程返回了emp和test两个表的结果集。在集算器中调用这个存储过程,接受两个结果集的程序如下:
A2单元格使用proc函数调用存储过程:orac.proc("{callproAA(?,?)}",:101:"o":a,:101:"o":b),返回了两个结果集(序表),组成了一个序表的集合:序列,赋值给了A2。下面依次解释一下proc函数的输入参数:
1) sql字符串
"{call proAA(?,?)}"中包含调用存储过程的名字,问号表示sql的参数。
2) 输出参数1
:101:"o":a中定义了一个输出参数,101代表其数据类型是游标,”o”代表这个参数是输出参数。a是定义了一个变量,可以用这个变量引用返回结果。
3) 输出参数2
:101:"o":b中定义了一个输出参数,101代表其数据类型是游标,”o”代表这个参数是输出参数。b是定义了一个变量,可以用这个变量引用返回结果。
A3单元格返回了A2单元格的第一个序表(emp表的结果集)。
A4、A5单元格分别使用A2中的输出变量a、b来获取存储过程对应的执行结果,a对应emp表的数据,赋值给A4,b对应test表的数据,赋值给A5。
附录:参数类型定义
type的取值为:
public final static byte DT_DEFAULT =(byte) 0; //默认,自动识别
public final static byte DT_INT =(byte) 1;
public final static byte DT_LONG =(byte) 2;
public final static byte DT_SHORT =(byte) 3;
public final static byte DT_BIGINT =(byte) 4;
public final static byte DT_FLOAT =(byte) 5;
public final static byte DT_DOUBLE =(byte) 6;
public final static byte DT_DECIMAL =(byte) 7;
public final static byte DT_DATE = (byte)8;
public final static byte DT_TIME =(byte) 9;
public final static byte DT_DATETIME =(byte) 10;
public final static byte DT_STRING =(byte) 11;
public final static byte DT_BOOLEAN =(byte) 12;
public final static byte DT_INT_ARR =(byte) 51;
public final static byte DT_LONG_ARR =(byte) 52;
public final static byte DT_SHORT_ARR =(byte) 53;
public final static byte DT_BIGINT_ARR= (byte) 54;
public final static byte DT_FLOAT_ARR =(byte) 55;
public final static byte DT_DOUBLE_ARR= (byte) 56;
public final static byte DT_DECIMAL_ARR= (byte) 57;
public final static byte DT_DATE_ARR =(byte) 58;
public final static byte DT_TIME_ARR =(byte) 59;
public final static byteDT_DATETIME_ARR = (byte) 60;
public final static byte DT_STRING_ARR= (byte) 61;
public final static byte DT_BYTE_ARR =(byte) 62;
public final static byte DT_CURSOR =(byte) 101;
public final static byteDT_AUTOINCREMENT = (byte) 102;