调用存储过程¶
存储过程是指用于执行特定操作的PL/SQL块。在pc源程序中调用已创建的存储过程需要使用EXEC SQL CALL语句。
调用方法如下:EXEC SQL CALL [schema.][package.]stored_proc(arg1,...)其中schema用于指定方案名(即数据库名),package用于指定包名, stored_proc用于指定过程名,arg1用于指定参数。
在编写了pc源程序后,使用esqlpc命令行工具预编译pc源程序,将内嵌SQL代码转换为对esqllib运行库的调用,最终生成C语言程序。因为该pc源程序 包含PL/SQL块,所以在预编译时必须指定-U选项:-U 用户名/密码@数据库名?数据库ip地址:端口号。示例如下:
esqlpc -U sysdba/szoscar55@osrdb?127.0.0.1:2003 PLDeclareSimpleSQL.c PLDeclareSimpleSQL.pc
以下是调用过程的实例:
/****************************************************************************
esql*C 调用存储过程实例 *
****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
void error()
{
/* 对错误情况不予处理,以防止死循环*/
EXEC SQL WHENEVER SQLERROR CONTINUE;
/* 输出错误信息*/
printf("EXPECTION:%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK;
exit(1);
}
int main()
{
int n;
long SQLCODE;
/*声明宿主数组变量*/
EXEC SQL BEGIN DECLARE SECTION;
int nId;
char strName[5];
int nAge;
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER SQLERROR do error();
EXEC SQL CONNECT TO osrdb@localhost USER sysdba USING szoscar55;
EXEC SQL WHENEVER SQLERROR CONTINUE;
/*创建表之前先删除已经存在的表*/
EXEC SQL DROP TABLE Student;
EXEC SQL WHENEVER SQLERROR DO error();
//创建表
printf("正在创建表Student(id INTEGER PRIMARY KEY,name CHAR(20),age INTEGER)");
EXEC SQL CREATE TABLE Student( id INTEGER PRIMARY KEY, name VARCHAR(5), age INTEGER );
if(SQLCODE == 0)
{
printf("创建表Student成功!\n");
}
//在isql中创建以下过程
/*create or replace procedure setStuInfo(id IN NUMBER,name IN VARCHAR2,age IN NUMBER)
IS
BEGIN
insert into Student values(id,name,age);
END;
/
create or replace procedure getStuInfo(id IN OUT NUMBER,name OUT VARCHAR2,age OUT NUMBER)
IS
BEGIN
select * into id,name,age from Student where id=id;
END;
/
*/
//初始化数据
nId = 1234;
nAge = 5678;
sprintf(strName,"abcd");
printf("向表Student插入的数据是:nId = 1234,nAge = 5678,strName = 'abcd' \n");
//调用存储过程插入数据
EXEC SQL CALL setStuInfo(:nId,:strName,:nAge);
nAge = 0;
sprintf(strName,"");
printf("对数据进行重新赋值:nId = 1234, nAge = 0, strName = '' \n");
//重新取出数据
EXEC SQL CALL getStuInfo(:nId,:strName,:nAge);
printf("重新取出来的数据是nId: %d, nAge: %d, strName: %s \n",nId,nAge,strName);
//删除表
EXEC SQL DROP TABLE Student;
EXEC SQL COMMIT WORK;
EXEC SQL DISCONNECT;
return 0;
}