动态方法四(第一种):
/*
* function name :login2ASF
* Author :XGT
* Version :1.0.0
* 1.0.0 2011/12/20 XGT Create
* Description
* 登录到正式的ASF表,包括基础信息表和展开表
* Parameters
* void
* return values
* void
*/
void login2ASF(){
//SQL内部使用变量声明
EXEC SQL BEGIN DECLARE SECTION;
char columnName[64];
char selectStr[5120];
char insertStr[3072];
char date_s[8 + 1];
char date_e[8 + 1];
char resultArray[128];
int dataLegth, ANSI_varchar_type, occurs;
char *strSql = "SELECT ut.column_name FROM user_tab_columns ut WHERE ut.table_name = 'TEMP_PL_M_ASF' AND ut.column_name in \
(SELECT uta.column_name FROM user_tab_columns uta WHERE uta.table_name = 'PL_M_ASF') ORDER BY ut.column_name ";
char *strSql_len = "SELECT ut.data_length FROM user_tab_columns ut WHERE ut.table_name = 'TEMP_PL_M_ASF' AND ut.column_name in \
(SELECT uta.column_name FROM user_tab_columns uta WHERE uta.table_name = 'PL_M_ASF') ORDER BY ut.column_name ";
int arrayCount;
short indi;
char *cpySelectStr;
EXEC SQL END DECLARE SECTION;
EXEC SQL ALLOCATE DESCRIPTOR 'in' ;
EXEC SQL ALLOCATE DESCRIPTOR 'out' ;
char *comma = ",";
ANSI_varchar_type = 97;
dataLegth = 128;
/* 初始化字符数组 */
memset(columnName, '\0', sizeof(columnName));
memset(selectStr, '0', sizeof(selectStr));
strcpy_s(selectStr, "SELECT ");
//strcpy_s(date_s, gch_data_s);
//strcpy_s(date_e, gch_data_e);
strcpy_s(date_s, "20111204");
strcpy_s(date_e, "20111206");
/* 获取应该插入的列 */
EXEC SQL PREPARE stat_login FROM :strSql;
EXEC SQL DECLARE cur_login2ASF CURSOR FOR stat_login;
EXEC SQL OPEN cur_login2ASF;
EXEC SQL WHENEVER NOT FOUND DO BREAK;//当循环时,没有数据则break.此语句要写在循环语句上面
for(;;){
EXEC SQL FETCH cur_login2ASF INTO :columnName;
TrimBlank(columnName);
strcat(selectStr, columnName);
strcat(selectStr, comma);
}
EXEC SQL CLOSE cur_seta;
selectStr[strlen(selectStr) - 1] = '\0';
strcat(selectStr, " FROM temp_pl_m_asf WHERE asfinsertflag = '0' AND carinfoflag = '1' AND (TestCarImpFlag = 1 OR TestCarFlag = 0) AND \
bodyonplandate BETWEEN '");
strcat(selectStr, date_s);
strcat(selectStr, "' AND '");
strcat(selectStr, date_e);
strcat(selectStr, "'");
printf("selectStr len:%d", strlen(selectStr));
EXEC SQL PREPARE stat_insert_asf FROM :selectStr;
EXEC SQL DESCRIBE INPUT stat_insert_asf USING DESCRIPTOR 'in';
EXEC SQL DECLARE cur_insert_asf CURSOR FOR stat_insert_asf;
printf("sqlcode:%d\n",sqlca.sqlcode);
printf("sqlerrmc:%s\n",sqlca.sqlerrm.sqlerrmc);
printf("sqlerrd:%d\n",sqlca.sqlerrd[4]);
EXEC SQL OPEN cur_insert_asf USING DESCRIPTOR 'in';
printf("sqlcode:%d\n",sqlca.sqlcode);
printf("sqlerrmc:%s\n",sqlca.sqlerrm.sqlerrmc);
printf("sqlerrd:%d\n",sqlca.sqlerrd[4]);
EXEC SQL DESCRIBE OUTPUT stat_insert_asf USING DESCRIPTOR 'out';
EXEC SQL GET DESCRIPTOR 'out' :arrayCount = COUNT;
printf("arrayCount:%d\n",arrayCount);
for (int i=1; i <= arrayCount; i++){
occurs = i;
EXEC SQL SET DESCRIPTOR 'out' VALUE :occurs TYPE = :ANSI_varchar_type, LENGTH = :dataLegth;
EXEC SQL GET DESCRIPTOR 'out' VALUE :occurs :columnName = NAME;
printf("columnName:%s\n",columnName);
}
EXEC SQL WHENEVER NOT FOUND DO BREAK ;
while (sqlca.sqlcode == 0)
{
EXEC SQL FETCH cur_insert_asf INTO DESCRIPTOR 'out' ;
for(int i=0;i<arrayCount;i++){
occurs = i + 1;
EXEC SQL GET DESCRIPTOR 'out' VALUE :occurs :resultArray = DATA ;
//printf("resultArray = %s\n", resultArray) ;
}
}
system("pause");
EXEC SQL CLOSE cur_insert_asf;
EXEC SQL DEALLOCATE DESCRIPTOR 'in' ;
EXEC SQL DEALLOCATE DESCRIPTOR 'out' ;
EXEC SQL WHENEVER NOT FOUND CONTINUE;//需变更回<NOT FOUND>的处理方式
}
动态方法处理四之二
void dynamicMethod_SQLDA ()
{
EXEC SQL BEGIN DECLARE SECTION;
char* dyn_statement = "SELECT t.typecode, t.mccode FROM pl_m_alc t WHERE t.msglen ='10'";
char dyn_sql[2048];
int deptno_type = 3, deptno_len = 2, deptno_data = 10 ;
int ename_type = 97, ename_len = 16 ;
char ename_data[256] ;
int empno_type = 97, empno_len = 2 ;
char empno_data[2 + 1];
long SQLCODE = 0 ;
int columnIndex;
int arrayCount;
EXEC SQL END DECLARE SECTION;
SQLDA *select_dp;
SQLDA *bind_dp;
int null_ok, index;
char title[40];
bind_dp = SQLSQLDAAlloc(SQL_SINGLE_RCTX_0, MAX_ITEMS, (size_t)MAX_VNAME_LEN, (size_t)MAX_INAME_LEN);
select_dp = SQLSQLDAAlloc(SQL_SINGLE_RCTX_0, MAX_ITEMS, (size_t)MAX_VNAME_LEN, (size_t)MAX_INAME_LEN);
for(int j = 0; j<= 122; j++){
select_dp->V[j] = (char *)malloc(256 * sizeof(char));
select_dp->I[j] = (short *)malloc(256 * sizeof(short));
bind_dp->V[j] = (char *)malloc(256 * sizeof(char));
bind_dp->I[j] = (short *)malloc(256 * sizeof(short));
}
strcpy(dyn_sql,"SELECT AREACODE,ASFNO,ASSEMBLYCODE,ASSEMBLYCOMMENT,ASSEMBLYOFFPLANDATE,ASSEMBLYOFFPLANSEQNO,ASSEMBLYOFFPLANSHIFT,ASSEMBLYONPLANDATE,ASSEMBLYONPLANSEQNO,ASSEMBLYONPLANSHIFT,\
BACKLEFTAIRBAG,BACKRIGHTAIRBAG,BASICENGINETYPE,BODYCHECKFLAG,BODYCOMMENT,BODYIMPORTANTFLAG,BODYNO,BODYOFFPLANDATE,BODYOFFPLANSEQNO,BODYOFFPLANSHIFT,BODYONPLANDATE,BODYONPLANSEQNO,BODYONPLANSHIFT,\
CHECKLISTCODE,CUPDUSER,DEALERCODE,DEALERSIGNFLAG,DES1REACHMONTHDAY,DESIGNCHANGECODE,DESTINATION1,DESTINATION2,DESTINATIONCODE,DESTINATIONMARK,DRIVERAIRBAG,DUMMYA,DUMMYR,DUMMYV,\
ENGINEKEYSNO,ENGINESNO,ENGINETYPE,EXPORTCODE,FINALLINE,FINALTP,FINISHCOMMENT,FINISHSTOPCANCELDATE,FINISHSTOPCANCELUSER,FINISHSTOPCOMMENT,FINISHSTOPFLAG,FINISHSTOPSETDATE,FINISHSTOPSETUSER,FRONTLEFTAIRBAG,\
FRONTRIGHTAIRBAG,GASCHECKFLAG,HARBORCODE,HQASSEMBLYLINE,HQBODYLINE,HQPAINTLINE,HQTESTLINE,INSIDEBASICCOLOR,INSIDEDESIGNCODE,KNEEAIRBAG,LANEMARK,LANENO,LASTLINE,LASTPLANTDATE,LASTTP,LASTTPSEQNO,LEFTCURTAINAIRBAG,\
LOCATIONNO,LOTNO,LOTSEQNO,MCCODE,MRN,OUTSIDECOLORCODE,OUTSIDECOLORMARK,OUTSIDEDESIGNCODE,PAINTCOMMENT,PAINTOFFPLANDATE,PAINTOFFPLANSEQNO,PAINTOFFPLANSHIFT,PAINTONPLANDATE,PAINTONPLANSEQNO,PAINTONPLANSHIFT,PASSEDQTY,PBSGROUPNO,\
PBSSEQNO,PBSSPECIALDESIGN,PBSSTAYCANCELDATE,PBSSTAYCANCELUSER,PBSSTAYCODE,PBSSTAYCOMMENT,PBSSTAYSETDATE,PBSSTAYSETUSER,PRESENTLINE,PRESENTTP,\
TRANSMISSIONSNO, TRANSMISSIONTYPE, TRANSPORTCODE, TYPECODE,\
VEHICLETYPEPROCESSCODE,VICEDRIVERAIRBAG,VINNO FROM temp_pl_m_asf WHERE asfinsertflag = '0' AND carinfoflag = '1' AND \
(TestCarImpFlag = 1 OR TestCarFlag = 0) AND bodyonplandate = '20120116'");
//printf("dyn_sql:%s", dyn_sql) ;
EXEC SQL PREPARE s_sqlda FROM :dyn_sql ;
EXEC SQL DECLARE c_sqlda CURSOR FOR s_sqlda ;
bind_dp->N = MAX_ITEMS;
EXEC SQL DESCRIBE BIND VARIABLES FOR s_sqlda INTO bind_dp;
bind_dp->N = bind_dp->F;
printf("bind_dp->F = %d", bind_dp->F) ;
select_dp->N = MAX_ITEMS;
EXEC SQL DESCRIBE SELECT LIST FOR s_sqlda INTO select_dp;
select_dp->N = select_dp->F;
printf("bind_dp->F = %d", select_dp->F) ;
EXEC SQL OPEN c_sqlda USING DESCRIPTOR bind_dp;
for(int i=0; i< select_dp->F; i++){
SQLColumnNullCheck(0, (unsigned short *)&(select_dp->T[i]), (unsigned short *)&(select_dp->T[i]), &null_ok);
switch(select_dp->T[i]){
case 12 : select_dp->L[i] = 12; break;
}
select_dp->T[i] = 5;//数据类型
select_dp->V[i] = (char *) realloc(select_dp->V[i], select_dp->L[i] + 1);
memset(title, 0, sizeof(title));
strncpy_s(title, select_dp->S[i], select_dp->C[i]);
//printf("\t%-.*s ", select_dp->L[i], title);
printf("title = %s;", title);
printf("len =%d\n", select_dp->L[i]);
}
index = 0;
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while(SQLCODE == 0)
{
index = index + 1;
printf("第%d条数据:\n", index);
EXEC SQL FETCH c_sqlda USING DESCRIPTOR select_dp;
for(int i=0; i< select_dp->F; i++){
if(*select_dp->I[i] >= 0)
printf("\t%.*s", select_dp->L[i], select_dp->V[i]) ;
}
}
EXEC SQL CLOSE c_sqlda ;
}
使用SQLDA来处理。
分享到:
相关推荐
在Linux中,`/proc`是一个虚拟文件系统,它并不占用磁盘空间,而是动态地反映了当前系统的运行情况。下面我们将详细探讨`/proc`文件系统的一些关键知识点: 1. **系统信息获取**: - `/proc/cpuinfo`:显示CPU信息...
4. **Proc的优势** - **性能提升**:由于PL/SQL代码在运行前已转换为C/FORTRAN,减少了网络通信和数据库解析时间。 - **代码复用**:可以在多个程序中重用PL/SQL逻辑。 - **更好的集成**:与C/FORTRAN代码的无缝...
#### 四、`/proc` 文件系统的使用案例 下面通过几个具体的例子来展示 `/proc` 文件系统的使用。 ##### 4.1 查询系统信息 - **查看CPU信息**: ```sh cat /proc/cpuinfo ``` - **查看内存使用情况**: ```sh cat...
- **使用方法**:通常有四种不同的方法来执行动态 SQL。 - **ANSI 方法**:提供了一种跨数据库的标准方法来执行动态 SQL。 - **注意事项**:与 Oracle 方法相比,ANSI 方法可能在某些情况下效率较低。 - **不同之...
混合模型(hybrid model)是几种不同模型组合而成...而混合模型能够适应不同的系统和不同情况的需要而提出一种灵活多样的动态方法。混合模型分为分析、综合、运行和废弃四个阶段,各阶段的重叠为设计员提出了模型选择。
这个文件并不存储在硬盘上,而是由内核动态生成,每次读取时都会反映出当前系统的实时状态。通过读取`/proc/cpuinfo`,我们可以获取到关于处理器的各种属性,这对于系统管理和性能分析至关重要。下面我们将详细探讨...
通过本文对 Oracle ProC 的介绍,我们不仅了解了 ProC 的基本概念和特点,还深入探讨了其编译流程、关键语法结构以及动态 SQL 的使用方法。这些知识点对于想要在 Oracle 平台上进行高效应用程序开发的开发者来说是...
首先,`/proc`文件系统是一个虚拟文件系统,它并不存储在磁盘上,而是由内核动态生成的,用于提供内核状态和系统信息。在/proc下创建文件可以让我们与内核进行交互,实现特定功能。 在描述中提到的"create device ...
4. **输出处理**: 生成预编译后的源代码文件。 5. **编译**: 使用标准C编译器编译生成的目标代码。 6. **链接**: 连接DM提供的库文件,生成可执行程序。 #### 三、预编译系统配置 ##### 3.1 预编译系统包含的程序...
这份指南详细阐述了PROC的使用方法、语法特性以及最佳实践,是学习和掌握PROC编程的重要参考资料。 一、PROC的基础概念 PROC是Oracle数据库应用开发的一种工具,它将SQL语句与C或C++代码混合,使得程序员可以利用...
介绍如何使用SAS的宏功能来动态生成Proc SQL代码,这对于处理大规模数据处理任务非常有用。 #### 8.2 填充宏变量 讨论了如何通过Proc SQL查询来填充宏变量,这可以用于传递数据或参数到其他宏程序中。 #### 8.3 ...
Oracle中的动态SQL方法共有四种,其中前两种较为简单,但灵活性不强,而方法3和方法4提供了更大的灵活性。方法4处理的SQL语句可以是任意类型的查询语句,其包含的选择表项或虚拟宿主变量的个数和类型在预编译时未知...
综上所述,“ProC-C++编程指南”不仅涵盖了基础的使用方法,还深入探讨了Pro*C/C++在实际项目中的应用策略和技术细节,是一份全面而深入的参考资料,适合从初学者到资深开发者的所有人群学习和参考。
通过分析PROC文件系统,提出了一种利用PROC文件系统进行动态更新内核变量的方法。 【标签】:Linux操作系统、系统开发、参考文献、专业指导 【正文】: 在Linux内核开发过程中,特别是进行嵌入式开发时,经常需要...
3. **动态SQL**:在使用OCI时,动态SQL是一种重要的技术,它允许在运行时构建SQL语句。这在处理不确定的查询条件或构建复杂的SQL结构时非常有用。 4. **游标(Cursor)**:游标是数据库操作中的一个关键概念,它...
#### 四、动态SQL实例 在动态SQL中,可以通过具体的实例来更好地理解其应用方法。例如,可以编写一个动态SQL查询语句,根据用户的输入动态构建SQL,并返回查询结果。 #### 五、Date类型无法正确显示的解决办法 在...
与 Oracle 动态方法 4 类似,ANSI 动态方法 4 也提供了动态执行 SQL 语句的能力。不同之处在于语法和函数名称略有差异。示例代码展示了如何使用 ANSI 标准的函数来进行动态 SQL 的准备、绑定和执行。 **2.7 执行 PL...