调用存储过程

存储过程是指用于执行特定操作的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;
}