ProC动态步骤四

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