达梦数据库在Linux下oci程序编译与运行

oci/dci程序模板代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
#include <malloc.h>
#include "DCI.h"


OCIEnv  *envhp;/* 环境句柄  */
OCISvcCtx *svchp;/* 服务环境句柄 */
OCIServer  *srvhp;/* 服务器句柄 */
OCISession *authp;/* 会话句柄  */
OCIStmt   *stmthp;/* 语句句柄  */
OCIDescribe *dschp;/* 描述句柄  */
OCIError  *errhp;/* 错误句柄  */
OCIDefine  *defhp[3];/* 定义句柄  */
OCIBind  *bidhp[4];/* 绑定句柄  */
sb2   ind[3];/* 指示符变量 */

			 /* 绑定select结果集的参数 */
text   szid[11];  /* 存储A列 */
text   szname[51];   /* 存储B列 */
text   szpdate[51];
char   sql[256];   /* 存储执行的sql语句*/
int innum;
int main(int argc, char *argv[])
{
	char strServerName[50] = "127.0.0.1:5236";
	char strUserName[50] = "SYSDBA";
	char strPassword[50] = "SYSDBA";
	int ret;
	text errbuf[100];
	/* 设置服务器,用户名和密码 */

	/* 初始化OCI应用环境*/
	OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL);
	/* 初始化环境句柄 */
	OCIEnvInit(&envhp, OCI_DEFAULT, 0, 0);
	/* 分配句柄  */
	OCIHandleAlloc(envhp, (dvoid**)&svchp, OCI_HTYPE_SVCCTX, 0, 0); /* 服务器环境句 柄  */
	OCIHandleAlloc(envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, 0, 0);/* 服务器句柄  */
	OCIHandleAlloc(envhp, (dvoid**)&authp, OCI_HTYPE_SESSION, 0, 0); /* 会话句柄  */
	OCIHandleAlloc(envhp, (dvoid**)&errhp, OCI_HTYPE_ERROR, 0, 0);  /* 错误句柄  */
	OCIHandleAlloc(envhp, (dvoid**)&dschp, OCI_HTYPE_DESCRIBE, 0, 0);  /* 描述符句 柄  */
																	   /* 连接服务器  */
	OCIServerAttach(srvhp, errhp, (text *)strServerName, (sb4)strlen(strServerName), OCI_DEFAULT);
	/* 设置用户名和密码 */
	OCIAttrSet(authp, OCI_HTYPE_SESSION, (text *)strUserName, (ub4)strlen(strUserName), OCI_ATTR_USERNAME, errhp);
	OCIAttrSet(authp, OCI_HTYPE_SESSION, (text *)strPassword, (ub4)strlen(strPassword), OCI_ATTR_PASSWORD, errhp);
	/* 设置服务器环境句柄属性 */
	OCIAttrSet((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid*)srvhp, (ub4)0, OCI_ATTR_SERVER, errhp);
	OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid*)authp, 0, OCI_ATTR_SESSION, errhp);
	/* 创建并开始一个用户会话 */
	OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);
	OCIHandleAlloc(envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, 0, 0);
	/* 语句句柄  */

	printf("%s\n", "请选择操作(输入对应的序号):");
	printf("%s\n", "1.创建表  2.创建存储过程  3. 插入数据 4.更新数据 5.删除数据 6.查询数据 ");
	scanf("%d", &innum);
	switch (innum)
	{
	case 1:
		/************************************************************************/
		/* 创建表             */
		/************************************************************************/
		memset(sql, 0, sizeof(sql));
		strcpy(sql, "create table person (id int,name varchar(20),pdate datetime);");
		OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
		ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot*) 0, (OCISnapshot*)0, (ub4)OCI_DEFAULT);
		if (ret != 0) {
			OCIErrorGet(errhp, 1, NULL, &ret, (OraText *)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
			printf("%s\n", errbuf);
		}
		/* 提交到数据库 */
		OCITransCommit(svchp, errhp, OCI_DEFAULT);
		printf("%s\n", "创建表");
		break;
	case 2:
		/************************************************************************/
		/* 创建存储过程             */
		/************************************************************************/
		memset(sql, 0, sizeof(sql));
		strcpy(sql, "create or replace procedure test_proc1(idt in int,output out int) as begin select * from person where id=idt;output=10;end;");
		/* 准备SQL语句  */
		OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
		/* 执行SQL语句  */
		ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot*) 0, (OCISnapshot*)0, (ub4)OCI_DEFAULT);
		memset(sql, 0, sizeof(sql));
		strcpy(sql, "CREATE OR REPLACE PROCEDURE test_proc2(id in int,v_cur out CURSOR,output  out varchar(20))AS declare sql varchar;BEGIN sql='SELECT * FROM person where id=? ';open v_cur for sql using id;output='success';END;");
		/* 准备SQL语句  */
		OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
		/* 执行SQL语句  */
		ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot*) 0, (OCISnapshot*)0, (ub4)OCI_DEFAULT);
		if (ret != 0) {
			OCIErrorGet(errhp, 1, NULL, &ret, (OraText *)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
			printf("%s\n", errbuf);
		}
		/* 提交到数据库 */
		OCITransCommit(svchp, errhp, OCI_DEFAULT);
		printf("%s\n", "创建存储过程");
		break;

	case 3:
		/************************************************************************/
		/* 插入表                                                        */
		/************************************************************************/
		memset(sql, 0, sizeof(sql));
		strcpy(sql, "insert into person values(:A,:B,:C);");
		/* 准备SQL语句  */
		OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
		/* 设置输入参数 */
		//memset(szid, 0, sizeof(szid));  strcpy(szid, "1");  
		memset(szname, 0, sizeof(szname));  strcpy(szname, "tom");
		memset(szpdate, 0, sizeof(szpdate));  strcpy(szpdate, "2020-02-02 20:20:00");
		int  a = 1;
		/* 绑定输入列  */
		OCIBindByName(stmthp, &bidhp[0], errhp, ":A", 2, &a, sizeof(int), SQLT_INT, NULL, NULL, NULL, 0, NULL, 0);
		OCIBindByName(stmthp, &bidhp[1], errhp, ":B", 2, szname, strlen((char*)szname), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);
		OCIBindByName(stmthp, &bidhp[2], errhp, ":C", 2, szpdate, strlen((char*)szpdate), SQLT_AFC, NULL, NULL, NULL, 0, NULL, 0);

		/* 执行SQL语句  */
		ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot*) 0, (OCISnapshot*)0, (ub4)OCI_DEFAULT);
		if (ret != 0) {
			OCIErrorGet(errhp, 1, NULL, &ret, (OraText *)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
			printf("%s\n", errbuf);
		}
		/* 提交到数据库 */
		OCITransCommit(svchp, errhp, OCI_DEFAULT);
		printf("%s\n", "插入数据成功");
		break;
	case 4:
		/************************************************************************/
		/* 更新表             */
		/************************************************************************/
		memset(sql, 0, sizeof(sql));
		strcpy(sql, "update person set name='lily' WHERE id=1");
		/* 准备SQL语句  */
		OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
		/* 执行SQL语句  */
		ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot*) 0, (OCISnapshot*)0, (ub4)OCI_DEFAULT);
		if (ret != 0) {
			OCIErrorGet(errhp, 1, NULL, &ret, (OraText *)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
			printf("%s\n", errbuf);
		}
		/* 提交到数据库 */
		OCITransCommit(svchp, errhp, OCI_DEFAULT);
		printf("%s\n", "更新数据成功");
		break;
	case 5:
		/************************************************************************/
		/* 删除表             */
		/************************************************************************/
		memset(sql, 0, sizeof(sql));
		strcpy(sql, "delete from person where id=1");
		/* 准备SQL语句  */
		OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
		/* 执行SQL语句  */
		ret = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (CONST OCISnapshot*) 0, (OCISnapshot*)0, (ub4)OCI_DEFAULT);
		if (ret != 0) {
			OCIErrorGet(errhp, 1, NULL, &ret, (OraText *)errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
			printf("%s\n", errbuf);
		}
		/* 提交到数据库 */
		OCITransCommit(svchp, errhp, OCI_DEFAULT);
		printf("%s\n", "删除数据成功");
		break;
	case 6:
		/************************************************************************/
		/* 查询表                                                        */
		/************************************************************************/
		memset(sql, 0, sizeof(sql));
		strcpy(sql, "select * from person;");
		/* 准备SQL语句  */
		OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
		/* 绑定输出列  */
		OCIDefineByPos(stmthp, &defhp[0], errhp, 1, (ub1*)szid, sizeof(szid), SQLT_STR, &ind[0], 0, 0, OCI_DEFAULT);
		OCIDefineByPos(stmthp, &defhp[1], errhp, 2, (ub1*)szname, sizeof(szname), SQLT_STR, &ind[1], 0, 0, OCI_DEFAULT);
		OCIDefineByPos(stmthp, &defhp[2], errhp, 3, (ub1*)szpdate, sizeof(szpdate), SQLT_STR, &ind[2], 0, 0, OCI_DEFAULT);
		/* 执行SQL语句  */
		OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, 0, NULL, NULL, OCI_DEFAULT);
		printf("%-10s%-10s%-10s\n", "id", "name", "pdate");
		while ((OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) != OCI_NO_DATA)
		{
			printf("%-10s", szid);
			printf("%-10s", szname);
			printf("%-10s\n", szpdate);
		}
		break;
	default:break;
	}

	//结束会话  
	OCISessionEnd(svchp, errhp, authp, (ub4)0);
	//断开与数据库的连接  
	OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
	//释放OCI句柄  
	OCIHandleFree((dvoid*)dschp, OCI_HTYPE_DESCRIBE);
	OCIHandleFree((dvoid*)stmthp, OCI_HTYPE_STMT);
	OCIHandleFree((dvoid*)errhp, OCI_HTYPE_ERROR);
	OCIHandleFree((dvoid*)authp, OCI_HTYPE_SESSION);
	OCIHandleFree((dvoid*)svchp, OCI_HTYPE_SVCCTX);
	OCIHandleFree((dvoid*)srvhp, OCI_HTYPE_SERVER);
	return 0;
}


编译c文件:
221193415302.png)
gcc -o dmdci dmdci.c -I /opt/dmdbms/include -L /opt/dmdbms/bin -ldmoci

编译成功后运行:
在这里插入图片描述

发布了56 篇原创文章 · 获赞 5 · 访问量 9321

猜你喜欢

转载自blog.csdn.net/fengxiaozhenjay/article/details/104433394