来自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