- 浏览: 5029498 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (2844)
- java (1094)
- hadoop (37)
- jvm (39)
- hbase (11)
- sql (25)
- 异常 (83)
- div css (6)
- 数据库 (95)
- 有趣的code (15)
- struts2 (6)
- spring (124)
- js (44)
- 算法 (65)
- linux (36)
- hibernate (7)
- 中间件 (78)
- 设计模式 (2)
- 架构 (275)
- 操作系统 (91)
- maven (35)
- tapestry (1)
- mybatis (9)
- MQ (101)
- zookeeper (18)
- 搜索引擎,爬虫 (208)
- 分布式计算 (45)
- c# (7)
- 抓包 (28)
- 开源框架 (45)
- 虚拟化 (12)
- mongodb (15)
- 计算机网络 (2)
- 缓存 (97)
- memcached (6)
- 分布式存储 (13)
- scala (5)
- 分词器 (24)
- spark (104)
- 工具 (23)
- netty (5)
- Mahout (6)
- neo4j (6)
- dubbo (36)
- canal (3)
- Hive (10)
- Vert.x (3)
- docker (115)
- 分布式追踪 (2)
- spring boot (5)
- 微服务 (56)
- 淘客 (5)
- mesos (67)
- php (3)
- etcd (2)
- jenkins (4)
- nginx (7)
- 区块链 (1)
- Kubernetes (92)
- 驾照 (1)
- 深度学习 (15)
- JGroups (1)
- 安全 (5)
- 测试 (16)
- 股票 (1)
- Android (2)
- 房产 (1)
- 运维 (6)
- 网关 (3)
最新评论
-
明兜3号:
部署落地+业务迁移 玩转k8s进阶与企业级实践技能(又名:Ku ...
Kubernetes系统常见运维技巧 -
q328965539:
牛掰啊 资料收集的很全面
HDFS小文件处理解决方案总结+facebook(HayStack) + 淘宝(TFS) -
guichou:
fluent挂载了/var/lib/kubelet/pods目 ...
kubernetes上部署Fluentd+Elasticsearch+kibana日志收集系统 -
xu982604405:
System.setProperty("java.r ...
jmx rmi 穿越防火墙问题及jmxmp的替代方案 -
大漠小帆:
麻烦问下,“获取每个Item相似性最高的前N个Item”,这个 ...
协同过滤推荐算法在MapReduce与Spark上实现对比
最近项目要做对数据库,大数据量的倒数,打算用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"); } }
发表评论
-
MyBatis 使用 MyCat 实现多租户的一种简单思路
2017-11-20 18:27 2836本文的多租户是基于多数据库进行实现的,数据是通过不同数据库进 ... -
Otter(一)初识----简介和基本架构图
2017-10-11 11:23 1273tter 初识----简介和基本架构图 ... -
Canal+Otter - 前日篇(1)
2017-10-11 11:21 1193数据库同步中间件Canal+Otter - 前日篇(1) ... -
Otter-入门篇1(阿里开源项目Otter介绍)
2017-10-11 11:16 944Otter-入门篇1(阿里开源项目Otter介绍) ... -
Mysql几种索引类型的区别及适用情况
2017-09-30 16:27 581如大家所知道的,Mysql目前主要有以下几种索引类型:FUL ... -
唯一索引与主键索引的比较
2017-09-29 10:21 1469唯一索引唯一索引不 ... -
主键索引和唯一索引的区别
2017-09-29 10:05 651-- 区别 主键是一种约束,唯一索引是一种索引,两者 ... -
Index column size too large. The maximum column size is 767 bytes
2017-09-28 18:01 1881Index column size too large. T ... -
数据库死锁分析与解决
2017-08-17 10:00 859一、死锁的表现 1、 ... -
mysql,oracle,sql server中的默认事务隔离级别查看,更改
2017-08-09 13:44 1372未提交读(隔离事务的最低级别,只能保证不读取物理上损坏的 ... -
Mycat跨分片Join
2017-08-02 11:26 8761 前言 Mycat目前版本支持跨分片的join,主要实现 ... -
Mycat 分布式事务的实现
2017-08-02 11:27 1368引言:Mycat已经成为了一个强大的开源分布式数据库 ... -
MyCat部署运行(Windows环境)与使用步骤详解
2017-08-02 10:20 8871、MyCat概念 1.1 总体架构 MyCAT的架 ... -
mycat 分片中快速数据迁移思考
2017-07-31 17:42 867操作实践背景: travelrecord表定义 ... -
Mycat水平拆分之十种分片规则
2017-07-31 16:43 872水平切分分片实现 配置schema.xml ... -
博客分类: DB-oracle sqlOracle 1、方式一:使用序列和触发器 Sql代码 收藏代码 SQL> CREATE SEQUENCE te
2017-07-22 09:01 507sqlOracle 1、方式一:使用 ... -
PL/SQL Developer连接本地Oracle 11g 64位数据库
2017-05-16 22:29 7071.登录PL/SQL Developer 这里省略Ora ... -
分库分表的几种常见形式以及可能遇到的难
2017-04-11 23:33 806在谈论数据库架构和数据库优化的时候,我们经常会听到“分库分表 ... -
MySQL 日志
2017-01-11 20:58 582概述 MySQL日志记录了MySQL服务器的各种行为,My ... -
undo log与redo log原理分析
2016-12-17 21:57 815数据库通常借助日志来 ...
相关推荐
在Linux环境下,C/C++程序员经常需要与Oracle数据库进行交互,以实现数据的存取、查询和其他操作。Pro*C是Oracle公司提供的一种预编译器,它允许C或C++程序直接调用PL/SQL代码,极大地简化了数据库操作。本篇文章将...
Pro*C是C语言与Oracle数据库的一种融合,它允许开发者将C语言的灵活性与SQL的数据库操作能力相结合,从而实现高效的数据处理。 文章首先介绍了Pro*C的主要特点和优势。其一,Pro*C的源代码由C语言和内嵌的SQL语句...
程序体则包含具体的SQL语句,用于对数据库数据进行操作。典型的程序结构如下: ```c EXEC SQL INCLUDE CONTEXT : (SQL声明定义); EXEC SQL DECLARE SECTION; // 宿主变量声明 EXEC SQL END DECLARE SECTION; ...
Pro*C是Oracle公司开发的一种预编译器,它允许程序员在C语言中嵌入PL/SQL代码,使得C程序可以直接与Oracle数据库交互。通过Pro*C,开发者可以利用C语言的强大功能和效率,同时享受Oracle数据库提供的高级数据库操作...
1. Pro*C简介:Pro*C是一种将SQL语句嵌入C程序中的开发工具,它允许开发者在C语言中直接使用SQL语句访问Oracle数据库。它是一种第三代语言嵌入式SQL工具,可以在Oracle数据库管理系统中使用。Pro*C程序可以执行...
Pro*C增删改查Oracle数据库中数据表的代码
Pro*C,全称为Oracle Precompiling C,是Oracle公司推出的一种混合C语言和SQL的编程工具,它允许开发人员在C程序中直接嵌入SQL语句,以提高数据库应用的性能和效率。这种技术特别适用于需要高效访问Oracle数据库的...
《精通PRO*C编程》这本书是针对Oracle数据库应用开发的一本专业指南,主要讲解如何使用PRO*C,Oracle提供的C语言预处理器,进行高效的数据库应用程序开发。PRO*C是Oracle Corporation为C程序员设计的一种工具,它...
在IT领域,PRO*C是Oracle公司提供的一种预编译器,它允许开发人员使用C语言来编写PL/SQL代码,从而更高效地与Oracle数据库进行交互。这个“PRO*C入门实例”可能是针对初学者的一个教程,通过一个实际的代码示例来...
PRO*C为开发者提供了一种将SQL语句嵌入C语言程序的有效方式,使得开发者可以在保持C语言强大逻辑处理能力的同时,充分利用SQL语言进行高效的数据管理。通过了解PRO*C的基本概念、程序结构以及如何使用SQL语句,...
《精通Oracle 10g Pro*C/C++编程》是一本专为数据库开发人员设计的教程,作者王海亮和张立民通过这本书深入探讨了如何使用C或C++语言与Oracle 10g数据库进行高效交互。源代码与学习笔记的提供,为读者提供了实践操作...
Oracle Pro*C 是一种集成的开发工具,用于在C语言中嵌入SQL语句,以便高效地与Oracle数据库进行交互。这种技术将C语言的强大功能与SQL的数据库操作能力结合在一起,提供了一种灵活且高性能的方式来构建数据库应用...
- **数据类型映射**:Pro*C中,C语言的数据类型需要与Oracle数据库中的数据类型进行映射,例如,`char`对应`VARCHAR2`,`int`对应`NUMBER`等。 - **游标和PL/SQL块**:Pro*C支持在C代码中使用游标来处理查询结果,...
【Oracle数据库中的Pro*C程序详解】 Oracle数据库是全球广泛使用的数据库管理系统,以其高效、稳定和功能强大著称。...通过熟练掌握Pro*C,开发者能够编写出高效、灵活且易于维护的数据库应用程序,满足各种业务需求。
《Pro*C程序设计ORACLE调用接口》是关于在C语言中使用Oracle数据库的一种高效方法。Pro*C,全称为Pre-Compiler for C,是Oracle公司提供的一个预编译器,它允许开发者直接在C程序中嵌入SQL语句,极大地提高了数据库...
PRO*C(也称为预编译C)是一种允许在C程序中嵌入SQL语句的技术,它结合了C语言的强大功能与Oracle数据库的高效数据处理能力。本文主要探讨如何使用PRO*C进行高效的大规模数据导出。 #### 二、问题概述 假设有一个...
Pro*C,是Oracle提供的一种预编译器,用于将C语言与PL/SQL结合,使得在C/C++程序中可以直接操作Oracle数据库。本文将深入探讨如何在Pro*C中实现分页查询,主要关注两种常用的方法。 首先,让我们回顾一下基本的分页...
**Pro*C**是一种由Oracle提供的C语言扩展,它允许开发者在C程序中直接嵌入SQL语句,并通过Oracle预编译器将其转换成标准C代码,从而实现数据库操作与业务逻辑的无缝集成。 #### 二、新特性介绍 - **ORACLE 9i ...
通过Pro*C,开发者可以利用C语言的强大功能和Oracle数据库的高效数据处理能力。以下是对Oracle Pro*C及其相关知识点的详细说明: 1. **预编译过程**:Pro*C程序首先需要通过Oracle的预编译器PCC处理,这个过程将...
【Pro*C 知识点详解】 Pro*C 是 Oracle 公司提供的一种预编译器,它允许开发者在 C 语言程序中嵌入 SQL 语句和 PL/SQL 块,以便于高效地...通过熟练掌握 Pro*C,开发者可以创建出适应复杂业务需求的数据库应用程序。