首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

ProC动态步骤四

2012-09-11 
ProC动态方法四动态方法四(第一种):/* * function name:login2ASF * Author:XGT * Version:1.0.0 *1.0.020

ProC动态方法四

动态方法四(第一种):

/* * 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来处理。

热点排行