集算器可以方便的调用数据库的存储过程,这里通过例子来看一下具体的程序写法。

 

  • 调用无返回值的存储过程

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函数来调用这个存储过程:

wKiom1QOnCCxY8qMAAAz_WmumlA981.jpg

    A1:连接数据库。

    A2:调用存储过程,输入参数值为4。

wKioL1QOnCzjI_AkAAA0twRyP38447.jpg

    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;

    集算器调用这个存储过程的代码是:

wKioL1QOnCyDp_fPAABWfKm1lCA204.jpg

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;

存储过程输入一个参数,返回了一个结果集。在集算器中调用这个存储过程的代码如下:

wKiom1QOnCHjwF3NAABYmxDUoqM110.jpg

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相同,都是包含idname两个字段的序表。

 

四、调用返回多结果集的存储过程

    先编写一个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;

存储过程返回了emptest两个表的结果集。在集算器中调用这个存储过程,接受两个结果集的程序如下:

wKioL1QOnC2gyYtpAABlphW5iBc588.jpg

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表的结果集)。

         A4A5单元格分别使用A2中的输出变量ab来获取存储过程对应的执行结果,a对应emp表的数据,赋值给A4b对应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;