T100——存储过程的调用

来自Genero Studio Help

带有输出参数的存储过程

必须使用EXECUTE、OPEN或FOREACH指令的USING子句中的输入和输出参数规范调用Oracle存储过程或存储函数。在正常的动态SQL中,参数必须按位置对应,in /OUT/INOUT选项必须与存储过程的参数定义匹配。

 

要执行存储过程,必须将过程包含在一个匿名PL/SQL块中,并带有开始和结束关键字:

从“begin proc1(?,?,?)”准备stmt;结束;“

注:Oracle存储过程不指定数字大小和字符参数。输出值(特别是字符串)的大小由调用上下文(即调用过程时使用的变量的数据类型)定义。当您向过程传递一个CHAR(10)时,返回的值将被填入空格,以达到10个字节的大小。

 

注意,由于技术原因,Oracle驱动程序使用了与OCIBindDynamic()的动态绑定。在使用动态绑定时,Oracle Call接口不支持CHAR数据类型的存储过程参数。必须使用VARCHAR2而不是CHAR来定义存储过程的字符串参数。

 

下面是一个创建和调用带有输出参数的存储过程的完整示例(Oracle):

MAIN
   DEFINE n INTEGER
   DEFINE d DECIMAL(6,2)
   DEFINE c VARCHAR(200)
   DATABASE test1
   EXECUTE IMMEDIATE
                   "create procedure proc1("
                || "         p1 in int,"
                || "         p2 in out number,"
                || "         p3 in out varchar2"
                || "      )"
                || " is begin"
                || "  p2:= p1 + 0.23;"
                || "  p3:= 'Value = ' || to_char(p1);"
                || "end;"
   PREPARE stmt FROM "begin proc1(?,?,?); end;"
   LET n = 111
   EXECUTE stmt USING n IN, d INOUT, c INOUT
   DISPLAY d
   DISPLAY c
END MAIN

 

 

MS SQL:

PREPARE stmt FROM "{ call proc1(?,?,?) }"
MAIN
   DEFINE n INTEGER
   DEFINE d DECIMAL(6,2)
   DEFINE c VARCHAR(200)
   DATABASE test1
   EXECUTE IMMEDIATE
                   "create procedure proc1"
                || "             @v1 integer,"
                || "             @v2 decimal(6,2) output,"
                || "             @v3 varchar(20) output"
                || " as begin"
                || "  set @v2 = @v1 + 0.23"
                || "  set @v3 = 'Value = ' || cast(@v1 as varchar)"
                || "end"
   PREPARE stmt FROM "{ call proc1(?,?,?) }"
   LET n = 111
   EXECUTE stmt USING n IN, d OUT, c OUT
   DISPLAY d
   DISPLAY c
END MAIN



 

 

 

 

posted @ 2020-08-17 15:34  AaronLi  阅读(301)  评论(0编辑  收藏  举报