`
m635674608
  • 浏览: 5029498 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

pro*c 倒出数据库数据

 
阅读更多

最近项目要做对数据库,大数据量的倒数,打算用pro*c倒出。然后再用sqlload倒入别的库中

    ANSI动态sql

 

   

/* sqlcheck=full */
/* userid=scott/password@exam */
/* mode=ansi */

/* 包含C头文件 */
#include <stdio.h>
#include <string.h>

/* 包含SQLCA头文件 */
#include <sqlca.h>

/* 定义选择列表项名的最大长度 */
#define MAX_NAME_LEN	31

/* 定义绑定变量值和选择列表项值的最大长度 */
#define MAX_VAR_LEN		200

/* 定义宿主变量 */
exec sql begin declare section;
	char sql_stat[100];
	char current_date[20];
exec sql end declare section;

void connect();
void sql_error();
void process_input();
void process_output();

int main()
{
	/* 安装错误处理句柄 */
	exec sql whenever sqlerror do sql_error();

	/* 连接到数据库 */
	connect();

	/* 分配输入描述区和输出描述区 */
	exec sql allocate descriptor 'input_descriptor';
	exec sql allocate descriptor 'output_descriptor';

	for( ; ; )
	{
		printf("\n请输入动态SQL语句(EXIT:退出):\n");
		gets(sql_stat);

		/* EXIT(exit)->退出 */
		if(0 == strncmp(sql_stat , "EXIT" , 4) || 0 == strncmp(sql_stat , "exit" , 4))
			break;

		/* 准备动态SQL语句 */
		exec sql prepare s from :sql_stat;

		/* 定义游标 */
		exec sql declare c cursor for s;

		/* 处理绑定变量 */
		process_input();

		/* 打开游标
		 * select语句:处理查询结果
		 * 其他SQL语句:执行
		*/
		exec sql open c using descriptor 'input_descriptor';
		if(0 == strncmp(sql_stat , "SELECT" , 6) , 0 == strncmp(sql_stat , "select" , 6))
		{
		exec sql SELECT to_char(sysdate,'YYYYMMDD HH24:MI:SS') INTO :current_date FROM dual;
        	printf("当前时间为%s\n",current_date);
			process_output();
        exec sql SELECT to_char(sysdate,'YYYYMMDD HH24:MI:SS') INTO :current_date FROM dual;
		   printf("当前时间为%s\n",current_date);
        }
		/* 关闭游标 */
		exec sql close c;
	}

	/* 释放输入描述区和输出描述区 */
	exec sql deallocate descriptor 'input_descriptor';
	exec sql deallocate descriptor 'output_descriptor';

	/* 提交事务,断开连接 */
	exec sql commit work release;
	puts("谢谢使用ANSI动态SQL!\n");

	return 0;
}

void connect()/*数据库连接-本地数据库,不添加server*/
{
  EXEC SQL BEGIN DECLARE SECTION;
  VARCHAR oraCN[30];
  EXEC SQL END DECLARE SECTION;
  strcpy(oraCN.arr,"scott/tiger@TEST_dist");
  EXEC SQL CONNECT :oraCN;
}

void sql_error()
{
	/* 显示SQL错误 */
	printf("%.*s\n" , sqlca.sqlerrm.sqlerrml , sqlca.sqlerrm.sqlerrmc);
}

void process_input()
{
	int i;

	/* 定义宿主变量 */
	exec sql begin declare section;
		int input_count;
		int input_type ;
		int input_len;
		char input_buffer[MAX_VAR_LEN];
		char name[MAX_NAME_LEN];
		int occurs;
	exec sql end declare section;

	/* 绑定变量->输入描述区 */
	exec sql describe input s using descriptor 'input_descriptor';

	/* 取得绑定变量个数 */
	exec sql get descriptor 'input_descriptor' :input_count = count;

	/* 循环处理绑定变量名 */
	for(i = 0 ; i != input_count ; ++i)
	{
		occurs = i + 1;

		/* 取得绑定变量名 */
		exec sql get descriptor 'input_descriptor' value :occurs :name = name;
		printf("请输入%s的值:" , name);
		gets(input_buffer);

		/* 以NULL结尾 */
		input_len = strlen(input_buffer);
		input_buffer[input_len] = '\0';

		/* 设置绑定变量类型、长度和值 */
		input_type = 12;
		exec sql set descriptor 'input_descriptor' value :occurs 
			type = :input_type , length = :input_len , data = :input_buffer;
	}
}

void process_output()
{
	int i;

	/* 定义宿主变量 */
	exec sql begin declare section;
		int output_count;
		int output_type;
		int output_len;
		char output_buffer[MAX_VAR_LEN];
		short output_indicator;
		char name[MAX_NAME_LEN];
		int occurs;
	exec sql end declare section;

	FILE *fp;
  
    if((fp=fopen("c:\\test.txt","wt+"))==NULL)//读写打开或建立一个文本文件,允许读写   
    {   
       printf("Cannot open file strike any key exit!");   
  
    } 

	/* 选择列表项->输出描述区 */
	exec sql describe output s using descriptor 'output_descriptor';

	/* 取得选择列表项个数 */
	exec sql get descriptor 'output_descriptor' :output_count = count;

	/* 循环处理选择列表项 */
	for(i = 0 ; i != output_count ; ++i)
	{
		occurs = i + 1;
		output_type = 12;
		output_len = MAX_VAR_LEN;
	
		/* 设置选择列表项的类型和长度 */
		exec sql set descriptor 'output_descriptor' value :occurs 
			type = :output_type , length = :output_len;

		/* 取得选择列表项的名称并输出 */
		exec sql get descriptor 'output_descriptor' value :occurs :name = name;
		printf("\t%s" , name);
	}
	printf("\n");

	/* 提取数据完毕->退出循环 */
	exec sql whenever not found do break;

	/* 循环处理选择列表项数据 */
	for( ; ; )
	{
		/* 行数据->输出描述区 */
		exec sql fetch c into descriptor 'output_descriptor';
       
		/* 循环处理每列数据 */
		for(i = 0 ; i != output_count ; ++i)
		{
			occurs = i +1;

			/* 取得列数据和指示变量值 */
			exec sql get descriptor 'output_descriptor' value :occurs
				:output_buffer = data , :output_indicator = indicator;

			/* 输出列数据 */
			if(-1 == output_indicator)
			    if(i!=0){
				   //printf(" || NULL");
				   fprintf(fp," || %s","null");   
				}else{
			    //	printf("NULL");
				   fprintf(fp,"%s","null");  
				}			
			else
			   if(i!=0){
			    // printf(" || %s" , output_buffer);
                   fprintf(fp," || %s",output_buffer);   
			   }else{
			  // printf("%s" , output_buffer);
			      fprintf(fp,"%s",output_buffer); 
			   }
				
		}
		 // printf("\n");
          fprintf(fp,"%s","\n"); 
	}
	fclose(fp);
}

 

  

  

   oracle 动态sql4 

/* 包含C头文件 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <setjmp.h>
#include <sqlcpr.h>

/* 包含SQLDA和SQLCA结构 */
#include <sqlda.h>
#include <sqlca.h>

/* 定义绑定变量和选择列表项的最大个数 */
#define MAX_ITEMS		40

/* 定义绑定变量和选择列表项名称的最大长度 */
#define MAX_VNAME_LEN	30

/* 定义指示变量名称的最大长度 */
#define MAX_INAME_LEN	30

void connect();
void sql_error();
void alloc_descriptors(int , int , int);
void dealloc_descriptors();
void set_bind_variables();
void process_select_list();

/* 定义绑定描述区和选择描述区 */
SQLDA* bind_dp;
SQLDA* select_dp;

/* 定义输入宿主变量:存放动态SQL语句 */
char sql_stat[100]; 
char current_date[20];   

int main()
{
	/* 安装错误处理句柄 */
	exec sql whenever sqlerror do sql_error();

	/* 连接到数据库 */
	connect();

	/* 分配绑定描述区和选择描述区 */
	alloc_descriptors(MAX_ITEMS , MAX_VNAME_LEN , MAX_INAME_LEN);

	for( ; ; )
	{
		printf("请输入动态SQL语句(exit:退出):");
		gets(sql_stat);

		/* EXIT(exit):退出 */
		if(0 == strncmp(sql_stat , "exit" , 4) || 0 == strncmp(sql_stat , "EXIT" , 4))
			break;

		/* 准备动态SQL语句 */
		exec sql prepare s from :sql_stat;

		/* 定义游标 */
		exec sql declare c cursor for s;

		/* 出错,继续下一循环 */
		if(0 != sqlca.sqlcode)
			continue;

		/* 设置绑定变量 */
		set_bind_variables();

		/*
		 * 打开游标
		 * select语句:生成结果集
		 * 其他SQL语句:执行语句
		 */
		exec sql open c using descriptor bind_dp;

		/*
		 * select语句
		 */
		if(0 == strncmp(sql_stat , "select" , 6) || 0 == strncmp(sql_stat , "SELECT" , 6)){
			/* 处理select语句输出结果 */
			exec sql SELECT to_char(sysdate,'YYYYMMDD HH24:MI:SS') INTO :current_date FROM dual; 
			printf("当前时间为%s\n",current_date);     
			process_select_list();
			exec sql SELECT to_char(sysdate,'YYYYMMDD HH24:MI:SS') INTO :current_date FROM dual;   
            printf("当前时间为%s\n",current_date);   
        }
		/* 关闭游标 */
		exec sql close c;
	}

	/* 释放选择描述区和选择描述区 */
	dealloc_descriptors();

	/* 提交事务,断开连接 */
	exec sql commit work release;
	puts("谢谢使用Oracle动态SQL方法四!\n");

	return 0;
}
void connect()/*数据库连接-本地数据库,不添加server*/  
{   
  EXEC SQL BEGIN DECLARE SECTION;   
  VARCHAR oraCN[30];   
  EXEC SQL END DECLARE SECTION;   
  strcpy(oraCN.arr,"scott/tiger@TEST_dist");   
  EXEC SQL CONNECT :oraCN;   
}   
  
void connect2()
{
	/* 定义宿主变量 */
	char username[20] , password[20] , server[20];

	/* 输入用户名、口令和网络服务名 */
	printf("输入用户名:");
	gets(username);

	printf("输入口令:");
	gets(password);

	printf("输入网络服务名:");
	gets(server);

	/* 连接到数据库 */
	exec sql connect :username identified by :password using :server;
}

void sql_error()
{
	/* 显示SQL错误信息 */
	printf("%.*s\n" , sqlca.sqlerrm.sqlerrml , sqlca.sqlerrm.sqlerrmc);
}

void alloc_descriptors(int size , int max_vname_len , int max_iname_len)
{
	
	int i;

	/* 分配绑定描述区和选择描述区 */
	bind_dp = SQLSQLDAAlloc(0 , size , MAX_VNAME_LEN , MAX_INAME_LEN);
	select_dp = SQLSQLDAAlloc(0 , size , MAX_VNAME_LEN , MAX_INAME_LEN);


	/* 为指示变量、绑定变量和选择列表项分配内存 */
	for(i = 0 ; i != MAX_ITEMS ; ++i)
	{
		bind_dp->I[i] = (short*)malloc(sizeof(short));
		select_dp->I[i] = (short*)malloc(sizeof(short));

		bind_dp->V[i] = (char*)malloc(1);
		select_dp->V[i] = (char*)malloc(1);
	}
}

void dealloc_descriptors()
{
	int i;

	/* 释放指示变量、绑定变量和选择列表项占用的内存 */
	for(i = 0 ; i != MAX_ITEMS ; ++i)
	{
		if(bind_dp->V[i] != (char*)0)
			free(bind_dp->V[i]);
		free(bind_dp->I[i]);

		if(select_dp->V[i] != (char*)0)
			free(select_dp->V[i]);
		free(select_dp->I[i]);
	}

	/* 释放绑定描述区和选择描述区 */
	SQLSQLDAFree(0 , bind_dp);
	SQLSQLDAFree(0 , select_dp);
}

void set_bind_variables()
{
	int i;
	char bind_var[64];

	/* 设置绑定变量最大个数 */
	bind_dp->N = MAX_ITEMS;

	/* 绑定变量名称->绑定描述区 */
	exec sql describe bind variables for s into bind_dp;

	/* 设置绑定变量实际个数 */
	bind_dp->N = bind_dp->F;

	/* 循环处理绑定变量 */
	for(i = 0 ; i != bind_dp->F ; ++i)
	{
		/* 显示绑定变量名 */
		printf("请输入绑定变量%.*s的值:" , (int)bind_dp->C[i] , bind_dp->S[i]);

		/* 输入绑定变量的值 */
		gets(bind_var);

		/* 设置绑定变量的长度成员 */
		bind_dp->L[i] = strlen(bind_var);

		/* 为绑定变量数据缓冲区重新分配内存(多一位,留给'\0') */
		bind_dp->V[i] = (char*)realloc(bind_dp->V[i] , bind_dp->L[i] + 1);

		/* 绑定变量数据->数据缓冲区 */
		strcpy(bind_dp->V[i] , bind_var);

		/* 设置指示变量,处理NULL */
		if(0 == strncmp(bind_var , "NULL" , 4) || 0 == strncmp(bind_var , "null" , 4))
			*bind_dp->I[i] = -1;
		else
			*bind_dp->I[i] = 0;

		/* 设置数据缓冲区数据类型代码->char */
		bind_dp->T[i] = 1;
	}
}

void process_select_list()
{
	int i , null_ok , precision , scale;
	char title[MAX_VNAME_LEN];

	/* 设置选择列表项的最大个数 */
	select_dp->N = MAX_ITEMS;

	/* 选择列表项->选择描述区 */
	exec sql describe select list for s into select_dp;

	/* 设置选择列表项的实际个数 */
	select_dp->N = select_dp->F;

	/* 循环处理选择列表项 */
	for(i = 0 ; i != select_dp->F ; ++i)
	{
		/* 清除select_dp->T[i]的高位->null */
		SQLColumnNullCheck(0 , (unsigned short*)&select_dp->T[i]
			, (unsigned short*)&select_dp->T[i] , &null_ok);

		/* 根据内部数据类型确定外部类型数据长度(显示长度) */
		switch(select_dp->T[i])
		{
		case 2:
			/* number类型,取得精度与标度 */
			SQLNumberPrecV6(0 , (unsigned short*)&select_dp->T[i] , &precision , &scale);
			if(scale > 0)
				/* float */
				select_dp->L[i] = sizeof(float);
			else
				/* int */
				select_dp->L[i] = sizeof(int);
			break;
		case 12:
			/* DATA数据类型(DD-MON-YY) */
			select_dp->L[i] = 9;
			break;
		}

		/* 根据变量长度,重新为选择列表项数据缓冲区分配内存 */
		if(2 != select_dp->T[i])
			/* 其他类型 */
			select_dp->V[i] = (char*)realloc(select_dp->V[i] , select_dp->L[i] + 1);
		else
			/* number类型 */
			select_dp->V[i] = (char*)realloc(select_dp->V[i] , select_dp->L[i]);

		/* 初始化title */
		memset(title , ' ' , MAX_VNAME_LEN);

		/* 选择列表项名称->title */
		strncpy(title , select_dp->S[i] , select_dp->C[i]);

		/* 显示列名 */
		if(2 == select_dp->T[i])
			if(scale > 0)
				printf("\t%.*s" , select_dp->L[i] + 3, title);
			else
				printf("\t%.*s" , select_dp->L[i] , title);
		else
			printf("\t%-.*s" , select_dp->L[i] , title);

		/* 根据Oracle内部类型确定外部数据类型(显示类型) */
		if( 2 == select_dp->T[i])
		{
			/* number 类型*/
			if(scale > 0)
				/* float */
				select_dp->T[i] = 4;
			else
				/* int */
				select_dp->T[i] = 3;
		}
		else
			/* char */
			select_dp->T[i] = 1;
	}

	printf("\n");

	/* 提取数据完毕->结束循环 */
	exec sql whenever not found do break;

	/* 循环处理选择列表数据 */
	for( ; ; )
	{
		/* 数据->选择描述区 */
		exec sql fetch c using descriptor select_dp;

		/* 显示数据 */
		for( i = 0 ; i != select_dp->F ; ++i)
		{
			if(*select_dp->I[i] < 0){
				/* 处理NULL */
				printf("\tNULL");
			}else{
				if(3 == select_dp->T[i]){
					/* int */
					printf("\t%d" , *(int*)select_dp->V[i]);
				}else if(4 == select_dp->T[i]){
					/* float */
					printf("\t%8.2f" , *(float*)select_dp->V[i]);
				}else{
					/* char */
					printf("\t%.*s" , select_dp->L[i] , select_dp->V[i]);
				}
				}
		}
		printf("\n");
	}
}

 

 

 

分享到:
评论

相关推荐

    linux下c/c++连oracle数据库技术pro*c

    在Linux环境下,C/C++程序员经常需要与Oracle数据库进行交互,以实现数据的存取、查询和其他操作。Pro*C是Oracle公司提供的一种预编译器,它允许C或C++程序直接调用PL/SQL代码,极大地简化了数据库操作。本篇文章将...

    Pro* C访问Oracle数据库技术研究.pdf

    Pro*C是C语言与Oracle数据库的一种融合,它允许开发者将C语言的灵活性与SQL的数据库操作能力相结合,从而实现高效的数据处理。 文章首先介绍了Pro*C的主要特点和优势。其一,Pro*C的源代码由C语言和内嵌的SQL语句...

    浅析PRO*C在ORACLE数据库的访问技术.pdf

    程序体则包含具体的SQL语句,用于对数据库数据进行操作。典型的程序结构如下: ```c EXEC SQL INCLUDE CONTEXT : (SQL声明定义); EXEC SQL DECLARE SECTION; // 宿主变量声明 EXEC SQL END DECLARE SECTION; ...

    pro*c sample

    Pro*C是Oracle公司开发的一种预编译器,它允许程序员在C语言中嵌入PL/SQL代码,使得C程序可以直接与Oracle数据库交互。通过Pro*C,开发者可以利用C语言的强大功能和效率,同时享受Oracle数据库提供的高级数据库操作...

    Oracle Pro*C 编程入门.pdf

    1. Pro*C简介:Pro*C是一种将SQL语句嵌入C程序中的开发工具,它允许开发者在C语言中直接使用SQL语句访问Oracle数据库。它是一种第三代语言嵌入式SQL工具,可以在Oracle数据库管理系统中使用。Pro*C程序可以执行...

    Pro*C增删改查Oracle数据库的代码

    Pro*C增删改查Oracle数据库中数据表的代码

    Pro*c编程电子图书

    Pro*C,全称为Oracle Precompiling C,是Oracle公司推出的一种混合C语言和SQL的编程工具,它允许开发人员在C程序中直接嵌入SQL语句,以提高数据库应用的性能和效率。这种技术特别适用于需要高效访问Oracle数据库的...

    精通PRO*c编程

    《精通PRO*C编程》这本书是针对Oracle数据库应用开发的一本专业指南,主要讲解如何使用PRO*C,Oracle提供的C语言预处理器,进行高效的数据库应用程序开发。PRO*C是Oracle Corporation为C程序员设计的一种工具,它...

    PRO*C入门实例

    在IT领域,PRO*C是Oracle公司提供的一种预编译器,它允许开发人员使用C语言来编写PL/SQL代码,从而更高效地与Oracle数据库进行交互。这个“PRO*C入门实例”可能是针对初学者的一个教程,通过一个实际的代码示例来...

    pro*c学习资料

    PRO*C为开发者提供了一种将SQL语句嵌入C语言程序的有效方式,使得开发者可以在保持C语言强大逻辑处理能力的同时,充分利用SQL语言进行高效的数据管理。通过了解PRO*C的基本概念、程序结构以及如何使用SQL语句,...

    《精通Oracle 10g Pro*C/C++编程》源代码与学习笔记

    《精通Oracle 10g Pro*C/C++编程》是一本专为数据库开发人员设计的教程,作者王海亮和张立民通过这本书深入探讨了如何使用C或C++语言与Oracle 10g数据库进行高效交互。源代码与学习笔记的提供,为读者提供了实践操作...

    oracle培训pro*c

    Oracle Pro*C 是一种集成的开发工具,用于在C语言中嵌入SQL语句,以便高效地与Oracle数据库进行交互。这种技术将C语言的强大功能与SQL的数据库操作能力结合在一起,提供了一种灵活且高性能的方式来构建数据库应用...

    pro*c程序设计详解

    - **数据类型映射**:Pro*C中,C语言的数据类型需要与Oracle数据库中的数据类型进行映射,例如,`char`对应`VARCHAR2`,`int`对应`NUMBER`等。 - **游标和PL/SQL块**:Pro*C支持在C代码中使用游标来处理查询结果,...

    浅析Oracle数据库中Pro*C程序.pdf

    【Oracle数据库中的Pro*C程序详解】 Oracle数据库是全球广泛使用的数据库管理系统,以其高效、稳定和功能强大著称。...通过熟练掌握Pro*C,开发者能够编写出高效、灵活且易于维护的数据库应用程序,满足各种业务需求。

    Pro*C程序设计ORACLE调用接口

    《Pro*C程序设计ORACLE调用接口》是关于在C语言中使用Oracle数据库的一种高效方法。Pro*C,全称为Pre-Compiler for C,是Oracle公司提供的一个预编译器,它允许开发者直接在C程序中嵌入SQL语句,极大地提高了数据库...

    PRO*C的批量读取

    PRO*C(也称为预编译C)是一种允许在C程序中嵌入SQL语句的技术,它结合了C语言的强大功能与Oracle数据库的高效数据处理能力。本文主要探讨如何使用PRO*C进行高效的大规模数据导出。 #### 二、问题概述 假设有一个...

    pro*c 实现分页总结

    Pro*C,是Oracle提供的一种预编译器,用于将C语言与PL/SQL结合,使得在C/C++程序中可以直接操作Oracle数据库。本文将深入探讨如何在Pro*C中实现分页查询,主要关注两种常用的方法。 首先,让我们回顾一下基本的分页...

    Pro*C

    **Pro*C**是一种由Oracle提供的C语言扩展,它允许开发者在C程序中直接嵌入SQL语句,并通过Oracle预编译器将其转换成标准C代码,从而实现数据库操作与业务逻辑的无缝集成。 #### 二、新特性介绍 - **ORACLE 9i ...

    oracle pro*c入门

    通过Pro*C,开发者可以利用C语言的强大功能和Oracle数据库的高效数据处理能力。以下是对Oracle Pro*C及其相关知识点的详细说明: 1. **预编译过程**:Pro*C程序首先需要通过Oracle的预编译器PCC处理,这个过程将...

    pro*c 的 资料

    【Pro*C 知识点详解】 Pro*C 是 Oracle 公司提供的一种预编译器,它允许开发者在 C 语言程序中嵌入 SQL 语句和 PL/SQL 块,以便于高效地...通过熟练掌握 Pro*C,开发者可以创建出适应复杂业务需求的数据库应用程序。

Global site tag (gtag.js) - Google Analytics