为什么主机会走到现在这样游戏专机方舟非专用主机游戏的现状

#include &stdio.h&
#include &string.h&
#include &setjmp.h&
#include &stdlib.h&
#include &sqlda.h&
#include &sqlcpr.h&
#include &sqlca.h&
#define MAX_ITEMS 40
#define MAX_VNAME_LEN 30
#define MAX_INAME_LEN 30
int parse_flag = 0;
jmp_buf jmp_
char * dml_command[] = {&SELECT&, &select&, &UPDATE&, &update&, &DELETE&, &INSERT&, &insert&};
SQLDA * bind_
SQLDA * select_
EXEC SQL BEGIN DECLARE SECTION;
&&& char dyn_statement[1024];
&EXEC SQL VAR dyn_statement IS STRING(1024);
EXEC SQL END DECLARE SECTION;
void sql_error();
int oracle_connect();
int alloc_descriptors(int, int, int);
int get_dyna_statement();
void set_bind_variables();
void process_select_list();
void help();
void main(int argc, char * argv[])
&if (oracle_connect() != 0)
&&exit(1);
&if (alloc_descriptors(MAX_ITEMS, MAX_VNAME_LEN, MAX_INAME_LEN) != 0)
&&exit(1);
&while (1)
&&setjmp(jmp_continue);
&&if (get_dyna_statement() != 0)
&&EXEC SQL WHENEVER SQLERROR DO sql_error();
&&parse_flag = 1;
&&EXEC SQL PREPARE S FROM :dyn_
&&parse_flag = 0;
&&EXEC SQL DECLARE C CURSOR FOR S;
&&set_bind_variables();
&&EXEC SQL OPEN C USING DESCRIPTOR bind_
&&process_select_list();
&&for (i = 0; i & 8; i++)
&&&if (strncmp(dyn_statement, dml_command[i], 6) == 0)
&&&&printf(&\n\n%d row%c processed.\n&, sqlca.sqlerrd[2],
&&&&sqlca.sqlerrd[2] == 1 ? '\0' : 's');
&//释放资源
&//printf(&start free 1...\n&);
&for (i = 0; i & MAX_ITEMS; i++)
&&if (bind_dp-&V[i] != (char *) NULL)
&&&free(bind_dp-&V[i]);
&&free(bind_dp-&I[i]);
&&if (select_dp-&V[i] != (char *) NULL)
&&&free(select_dp-&V[i]);
&&free(select_dp-&I[i]);
&//printf(&free 1 ok!\n&);
&SQLSQLDAFree(NULL, bind_dp);
&SQLSQLDAFree(NULL, select_dp);
&EXEC SQL WHENEVER SQLERROR CONTINUE;
&EXEC SQL CLOSE C;
&EXEC SQL COMMIT WORK RELEASE;
&puts(&\nprogram complete normal!\n&);
&EXEC SQL WHENEVER SQLERROR DO sql_error();
void sql_error()
&printf(&\n\n%.70s&, sqlca.sqlerrm.sqlerrmc);
&if (parse_flag)
&&printf(&parse error at character offset %d in sql statement.\n&, sqlca.sqlerrd[4]);
&EXEC SQL WHENEVER SQLERROR CONTINUE;
&EXEC SQL ROLLBACK WORK;
&longjmp(jmp_continue, 1);
int oracle_connect()
&EXEC SQL BEGIN DECLARE SECTION;
&&varchar username[20];
&&varchar password[40];
&EXEC SQL END DECLARE SECTION;
&printf(&username:&);
&fflush(stdin);
&fgets((char *)username.arr, sizeof(username.arr), stdin);
&cp = strchr(username.arr, '\n');
&&*cp = '\0';
&username.len = strlen((char*) username.arr);
&printf(&password:&);
&fflush(stdin);
&fgets((char*)password.arr, sizeof(password.arr), stdin);
&cp = strchr(password.arr, '\n');
&&*cp = '\0';
&password.len = strlen((char*) password.arr);
&EXEC SQL WHENEVER SQLERROR GOTO connect_
&printf(&start connect database...\n&);
&EXEC SQL CONNECT :username IDENTIFIED BY :
&printf(&connect database successfully!\n&);
&return 0;
connect_error:
&printf(&can not connect database as user: %.*s\n&, username.len, (char*) username.arr);
&return -1;
int alloc_descriptors(int size, int max_vname_len, int max_iname_len)
&bind_dp = SQLSQLDAAlloc(NULL, size, max_vname_len, max_iname_len);
&if (bind_dp == (SQLDA*)NULL)
&&printf(&can not allocate memory for bind descriptor\n&);
&&return -1;
&bind_dp-&N = MAX_ITEMS;
&&& select_dp = SQLSQLDAAlloc(NULL, size, max_vname_len, max_iname_len);
&if (select_dp == (SQLDA *)NULL)
&&printf(&can not allocate memory for select descriptor\n&);
&&return -1;
&select_dp-&N = MAX_ITEMS;
&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);
&return 0;
int get_dyna_statement()
&char * cp, linebuf[256];
&int iter,
&for (plsql = 0, iter = 1; ;)
&&if (iter == 1)
&&&printf(&\nSQL& &);
&&&dyn_statement[0] = '\0';
&&fgets(linebuf, sizeof(linebuf), stdin);
&&cp = strchr(linebuf, '\n');
&&if (cp && cp != linebuf)
&&&*cp = '\0';
&&else if (cp == linebuf)
&&if ((strncmp(linebuf, &EXIT&, 4) == 0) || (strncmp(linebuf, &exit&, 4) == 0))
&&&return -1;
&&else if ((linebuf[0] == '?') || (strncmp(linebuf, &help&, 4) == 0) || (strncmp(linebuf, &HELP&, 4) == 0))
&&&help();
&&&iter = 1;
&&if (strstr(linebuf, &BEGIN&) || strstr(linebuf, &begin&))
&&&plsql = 1;
&&strcat(dyn_statement, linebuf);
&&if ((plsql && (cp = strchr(dyn_statement, '/'))) || (!plsql && (cp = strchr(dyn_statement, ';'))))
&&&*cp = '\0';
&&&iter++;
&&&printf(&%3d &, iter);
&return 0;
void set_bind_variables()
&char bind_var[64];
&EXEC SQL WHENEVER SQLERROR DO sql_error();
&bind_dp-&N = MAX_ITEMS;
&EXEC SQL DESCRIBE BIND VARIABLES FOR S INTO bind_
&if (bind_dp-&F & 0)
&&printf(&\ntoo many bind variables (%d) maximum is %d.\n&, -bind_dp-&F, MAX_ITEMS);
&bind_dp-&N = bind_dp-&F;
&for (i = 0; i & bind_dp-&F; i++)
&&printf(&\nEnter value for bind variables %.*s&, (int) bind_dp-&C[i], bind_dp-&S[i]);
&&fgets(bind_var, sizeof(bind_var), stdin);
&&cp = strchr(bind_var, '\n');
&&&*cp = '\0';
&&n = strlen(bind_var);
&&bind_dp-&L[i] =
&&bind_dp-&V[i] = (char*) realloc(bind_dp-&V[i], bind_dp-&L[i]);
&&strncpy(bind_dp-&V[i], bind_var, n);
&&if ((strncmp(bind_dp-&V[i], &NULL&, 4) == 0) || (strncmp(bind_dp-&V[i], &null&, 4) == 0))
&&&*(bind_dp-&I[i]) = -1;
&&&*(bind_dp-&I[i]) = 0;
&&bind_dp-&T[i] = 1;
void process_select_list()
&int i, null_ok, precision,
&char title[MAX_VNAME_LEN];
&if ((strncmp(dyn_statement, &SELECT&, 6) != 0) && (strncmp(dyn_statement, &select&, 6) != 0))
&&select_dp-&F = 0;
&select_dp-&N = MAX_ITEMS;
&EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_
&if (select_dp-&F & 0)
&&printf(&\nToo many select_list items (%d) maximum is %d\n&, -select_dp-&F, MAX_ITEMS);
&select_dp-&N = select_dp-&F;
&printf(&\n&);
&for (i = 0; i & select_dp-&F; i++)
&&SQLColumnNullCheck(NULL, &(select_dp-&T[i]), &(select_dp-&T[i]), &null_ok);
&&switch (select_dp-&T[i])
&&&case 1:& //VARCHAR2
&&&case 2: //NUMBER
&&&&SQLNumberPrecV6(NULL, &(select_dp-&L[i]), &precision, &scale);
&&&&if (precision == 0)
&&&&&precision = 40;
&&&&if (scale & 0)
&&&&&select_dp-&L[i] = sizeof(float);
&&&&&select_dp-&L[i] = sizeof(int);
&&&case 8: //LONG
&&&&select_dp-&L[i] = 240;
&&&case 11: //ROW ID
&&&&select_dp-&L[i] = 18;
&&&case 12: //DATE
&&&&select_dp-&L[i] = 9;
&&&case 23: //RAW
&&&case 24: //LONG RAW
&&&&select_dp-&L[i] = 240;
&&if (select_dp-&T[i] != 2)
&&&select_dp-&V[i] = (char *) realloc(select_dp-&V[i], select_dp-&L[i] + 1);
&&&select_dp-&V[i] = (char *) realloc(select_dp-&V[i], select_dp-&L[i]);
&&memset(title, '\0', MAX_VNAME_LEN);
&&strncpy(title, select_dp-&S[i], select_dp-&C[i]);
&&if (select_dp-&T[i] == 2)
&&&if (scale & 0)
&&&&printf(&%-*.*s &, select_dp-&L[i] + 3, select_dp-&C[i], title);
&&&&printf(&%-*.*s &, select_dp-&L[i], select_dp-&C[i], title);
&&&printf(&%-*.*s &, select_dp-&L[i], select_dp-&C[i], title);
&&if (select_dp-&T[i] != 24 && select_dp-&T[i] != 2)
&&&select_dp-&T[i] = 1;
&&&& else if (select_dp-&T[i] == 2)
&&&if (scale & 0)
&&&&select_dp-&T[i] = 4;&&&& //float 类型
&&&&select_dp-&T[i] = 3;&&&& //int 类型
&printf(&\n\n&);
&EXEC SQL WHENEVER NOT FOUND GOTO end_select_
&while (1)
&&EXEC SQL FETCH C USING DESCRIPTOR select_
&&for (i = 0; i & select_dp-&F; i++)
&&&if (*(select_dp-&I[i]) & 0)
&&&&if (select_dp-&T[i] == 4)
&&&&&printf(&%-*c&, (int) select_dp-&L[i] + 3, '\0');
&&&&&printf(&%-*c&, (int) select_dp-&L[i], '\0');
&&&&if (select_dp-&T[i] == 3)& //integer
&&&&&printf(&%-*d &, (int) select_dp-&C[i] & (int) select_dp-&L[i] ? (int) select_dp-&C[i] : (int) select_dp-&L[i], *((int*) select_dp-&V[i]));
&&&&else if (select_dp-&T[i] == 4) //float
&&&&&printf(&%-*.2f &, (int) select_dp-&C[i] & (int) select_dp-&L[i] ? (int) select_dp-&C[i] : (int) select_dp-&L[i], *((float*) select_dp-&V[i]));
&&&&else //string
&&&&&printf(&%-*.*s &, (int) select_dp-&L[i], (int) select_dp-&L[i], select_dp-&V[i]);
&&printf(&\n&);
end_select_loop:
void help()
&puts(&\n\nEnter a SQL statement or a PL/SQL block at the SQL& prompt.&);
&puts(&Statements can be continued over several lines, except&);
&puts(&within string literals.&);
&puts(&Terminate a SQL statement with a semicolon.&);
&puts(&Terminate a PL/SQL block (which can contain embedded semicolons)&);
&puts(&with a slash (/).&);
&puts(&Typing \&exit\& (no semicolon needed) exits the program.&);
&puts(&You typed \&?\& or \&help\& to get this message.\n\n&);
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4114次
排名:千里之外17147人阅读
Oracle(24)
C++/C/C#(16)
ProC动态SQL示例(第1,2,3种方法)
下面是ProC前三种动态SQL的完整示例。
(1)动态SQL1: 不能是查询(SELECT)语句,并且没有宿主变量.& 用法:拼一句动态SQL语句,并用EXECUTE IMMEDIATE执行,如: &EXEC SQL EXECUTE IMMEDIATE CREATE TABLE test (test_col VARCHAR2(4)); EXEC SQL EXECUTE IMMEDIATE INSERT INTO TABLE test ('AAAA');EXEC SQL EXECUTE IMMEDIATE DELETE test WHERE test_col='AAAA';
(2)动态SQL2: 不能是查询(SELECT)语句,并且输入的宿主变量数目是知道的, 用法:拼一句动态SQL语句,用PREPARE,EXECUTE语句执行. strcpy(sqlstring, &DELETE FROM test WHERE test_col = :?&);& EXEC SQL PREPARE sqlproc FROM : EXEC SQL EXECUTE sqlproc USING :emp_& &下文示例中大多数是采用动态SQL2.&(3)动态SQL3: 用于创建动态查询, 并且要查询的字段以及输入的宿主变量数目是知道的 用法: 拼一句动态SQL语句,用PREPARE分析该语句,并要定义一个CURSOR进行取值 如:要查询的数据在多张表中,select user_name from,可采用动态SQL3来进行查询 strcpy(sql,&select user_name from &);strcat(sql,&table1&);//table2,table3,table4EXEC SQL PREPARE sqlproc FROM : EXEC SQL DECLARE cur_user_name CURSOR FOR EXEC SQL OPEN cur_user_ while(1) {& EXEC SQL FETCH cur_user_name into :ora_ if (sqlca.sqlcode & 0) {& /*FETCH CURSOR失败*/& printf(&fetch cursor fail,sqlcode=%ld,sqlserr=%s&,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc); } if( sqlca.sqlcode == SQLNOTFOUND) {
} } EXEC SQL CLOSE cur_user_&
下文示例中Case5也是采用这种方法.
//Proc 示例
#include &stdio.h&#include &string.h&#include &math.h&#include &stdio.h&#include &stdlib.h&#include &sqlca.h&#include &ctype.h&
//变量,过程预声明char screen[1];char cmd[1];
//**********************************************************//CASE对应与db_selectop的switchEXEC SQL BEGIN DECLARE SECTION;
VARCHAR oraName[30];&&&&//CASE 1,2,3
VARCHAR oraValue[20];&&&&//CASE 1,2,3,5int oraC&&&&&&&&& //CASE 1,2,3,4,5VARCHAR oraSql[30],oraTable[20];&//CASE 4,5
VARCHAR oraField[10];&&&&//CASE 5VARCHAR oraCountSql[30];&&&//CASE 5
VARCHAR oraCode[10];&&&&//CASE 6VARCHAR oraContent[10];&&&&//CASE 6
EXEC SQL END DECLARE SECTION;//**********************************************************
int db_connect();int db_selectop();
//void dy_tablecount();//void dy_tablefield();void view_tabledata();
void pause();void sql_error(char *);
//主函数void main(){&EXEC SQL INCLUDE&EXEC ORACLE OPTION (RELEASE_CURSOR = YES);&EXEC SQL WHENEVER SQLERROR DO sql_error(& &ERROR& &);
&if(db_connect()==0)&{&&db_selectop();&}}
//打开数据连接int db_connect(){&&
&EXEC SQL BEGIN DECLARE SECTION;&VARCHAR oraCN[30];&EXEC SQL END DECLARE SECTION;
&printf(&----------------------------------&);&printf(&/n [ Examples With Oracle DB& ]/n&);&printf(&----------------------------------&);&printf(&/n&&&&&&&&&&&&&&&&&& Designed by Liwei 2005/n&);&cmd[0]='A';&while(cmd[0]!='0' && cmd[0]!='1')&{
&&printf(&/n Confirm DB Source:&);&&printf(&/n 1:workflow/workflow@if&);&&printf(&/n 0:E&);&&printf(&/n Choose:&);
&&gets(cmd);&&switch(cmd[0])&&{&&&case '1':&&&&strcpy(oraCN.arr,&&);&&&&oraCN.len = strlen(oraCN.arr);&&&&oraCN.arr[oraCN.len]='/0';
&&&&//EXEC SQL WHENEVER SQLERROR GOTO cnE&&&&EXEC SQL CONNECT :oraCN;&&&&&&&&printf(&/n [OK Connected!] &);&&&&return 0;
&&&&&&&&&&case '0':&&&&&&&default:&&&&printf(&/n [Error Input!] /n&);&&&&&&}&&}
&&exit(0);
//cnError://&printf(&/n [Error Oracle Connected!]&);//&return 1;&}
//选择数据操作int db_selectop(){&char order[1];
&cmd[0]='A';&//order[0]='A';
&while(cmd[0]!='0')&{&&printf(&/n &);&&printf(&/n Select DB Method:&);&&printf(&/n -------------------------------------------&);&&printf(&/n 1: GetTableCount&&&&& STATIC [CLASS_FLOW]&);&&printf(&/n 2: GetTableField One& STATIC [CLASS_FLOW]&);&&printf(&/n 3: GetTableField Muti STATIC [USE_POWER]&);&&printf(&/n&);&&printf(&/n 4: GetTableCount&&&&& DYNAMIC&&&&& &);&&printf(&/n 5: GetTableField One& DYNAMIC&&&&& &);&&printf(&/n&);&&printf(&/n 6: EditTable USE_DEPT&);&&printf(&/n -------------------------------------------&);&&printf(&/n 0: Exit&);&&printf(&/n/n Enter:&);
&&gets(cmd);
&&switch(cmd[0])&&{&&&case '1':&&&&&&&&EXEC SQL SELECT NVL(COUNT(*),0) INTO :oraCount FROM CLASS_FLOW;&&&&&&&&printf(&/n &The Table Count& &);&&&&printf(&%d&,oraCount);&&&&pause();&&&&
&&&case '2':&&&&&&&&EXEC SQL DECLARE curOne CURSOR FOR SELECT DISTINCT FLOW_NAME FROM CLASS_FLOW WHERE FLOW_CLASS='请假';&&&&EXEC SQL SELECT COUNT(DISTINCT FLOW_NAME) INTO :oraCount FROM CLASS_FLOW WHERE FLOW_CLASS='请假';&&&&EXEC SQL OPEN curO&&&&&&&&for(i=1;i&=oraCi++)&&&&{&&&&&&&&&EXEC SQL FETCH curOne INTO :oraN&&&&&oraName.arr[oraName.len]='/0';&&&&&printf(&/n &Field List& &);&&&&&printf(&%s&,oraName.arr);&&&&}&&&&EXEC SQL CLOSE curO&&&&pause();&&&&
&&&case '3':
&&&&EXEC SQL DECLARE curMuti CURSOR FOR SELECT POWER_ID,POWER_NAME FROM USE_POWER ORDER BY POWER_ID ASC;&&&&EXEC SQL SELECT COUNT(*) INTO :oraCount FROM USE_POWER;&&&&EXEC SQL OPEN curM&&&&&&&&for(i=1;i&=oraCi++)&&&&{&&&&&&&&&EXEC SQL FETCH curMuti INTO :oraValue,:oraN&&&&&oraValue.arr[oraValue.len]='/0';&&&&&oraName.arr[oraName.len]='/0';&&&&&printf(&/n &Fields List& &);&&&&&printf(&%-8s&,oraValue.arr);&&&&&printf(&%-20s&,oraName.arr);&&&&}
&&&&EXEC SQL CLOSE curM
&&&&pause();&&&&
&&&case '4':
&&&&//EXEC SQL BEGIN DECLARE SECTION;&&&&//VARCHAR oraSql[30],oraTable[20];&&&&//int oraC&&&&//EXEC SQL END DECLARE SECTION;
&&&&printf(&/n Custom Table &);&&&&printf(&/n ----------------------- &);&&&&printf(&/n Input Table Name:&);&&&&gets(oraTable.arr);
&&&&oraTable.len=strlen(oraTable.arr);&&&&oraTable.arr[oraTable.len]='/0';
&&&&strcpy(oraSql.arr,&SELECT COUNT(*) FROM &); &&&&strcat(oraSql.arr,oraTable.arr);&&&&oraSql.len=strlen(oraSql.arr);&&&&oraSql.arr[oraSql.len]='/0';
&&&&printf(&/n &SQL STATE& &);&&&&printf(oraSql.arr);&&&&printf(&/n &);
&&&&EXEC SQL PREPARE sqlDyCount FROM :oraS &&&&EXEC SQL DECLARE curDyCount CURSOR FOR sqlDyC &&&&EXEC SQL OPEN curDyC&&&&EXEC SQL FETCH curDyCount INTO :oraC&&&&EXEC SQL CLOSE curDyC
&&&&printf(&/n &Table Count& &);&&&&printf(&%d&,oraCount);&&&&//dy_tablecount();&&&&pause();&&&&
&&&case '5':
&&&&//EXEC SQL BEGIN DECLARE SECTION;&&&&//VARCHAR oraSql[30],oraTable[10],oraField[10],oraValue[20];&&&&//VARCHAR oraCountSql[30];&&&&//int oraC&&&&//EXEC SQL END DECLARE SECTION;
&&&&//接受屏幕数据&&&&printf(&/n Custom Table And Field &);&&&&printf(&/n ----------------------- &);&&&&printf(&/n Input Table Name:&);&&&&gets(oraTable.arr);&&&&oraTable.len=strlen(oraTable.arr);&&&&oraTable.arr[oraTable.len]='/0';&&&&printf(& Input Field Name:&);&&&&gets(oraField.arr);&&&&oraField.len=strlen(oraField.arr);&&&&oraField.arr[oraField.len]='/0';
&&&&//组合SELECT语句&&&&strcpy(oraSql.arr,&SELECT &);&&&&strcat(oraSql.arr,oraField.arr);&&&&strcat(oraSql.arr,& FROM &);&&&&strcat(oraSql.arr,oraTable.arr);&&&&oraSql.len=strlen(oraSql.arr);&&&&oraSql.arr[oraSql.len]='/0';&&&&printf(&/n &SQL STATE& &);&&&&printf(oraSql.arr);&&&&printf(&/n&);&&&&//读取内容&&&&EXEC SQL PREPARE sqlDy FROM :oraS&&&&EXEC SQL DECLARE curDyField CURSOR FOR sqlDy;&&&&EXEC SQL OPEN curDyF
&&&&//组合SELECT COUNT语句&&&&strcpy(oraCountSql.arr,&SELECT COUNT(*) FROM &);&&&&strcat(oraCountSql.arr,oraTable.arr);&&&&oraCountSql.len=strlen(oraCountSql.arr);&&&&oraCountSql.arr[oraCountSql.len]='/0';&&&&//读取数&&&&EXEC SQL PREPARE sqlDyCount FROM :oraCountS &&&&EXEC SQL DECLARE curDyFieldCount CURSOR FOR sqlDyC &&&&EXEC SQL OPEN curDyFieldC&&&&EXEC SQL FETCH curDyFieldCount INTO :oraC
&&&&for(i=1;i&=oraCi++)&&&&{&&&&EXEC SQL FETCH curDyField INTO :oraV&&&&oraValue.arr[oraValue.len]='/0';&&&&printf(&/n &Field List& &);&&&&printf(&%s&,oraValue.arr);&&&&}&&&&EXEC SQL CLOSE curDyFieldC&&&&EXEC SQL CLOSE curDyF&&&&//dy_tablefield();&&&&pause();&&&&
&&&case '6':
&&&&order[0]='A';&&&&while(order[0]!='0')&&&&{&&&&&printf(&/n &);&&&&&printf(&/n Edit Table &);&&&&&printf(&/n -------------&);&&&&&printf(&/n 1: VIEW&);&&&&&printf(&/n 2: INSERT&);&&&&&printf(&/n 3: DELETE&);&&&&&printf(&/n 4: UPDATE&);&&&&&printf(&/n -------------&);&&&&&printf(&/n 0: EXIT&);&&&&&printf(&/n/n Enter:&);&&&&&gets(order);
&&&&&switch(order[0])&&&&&{&&&&&case '1':&&&&&&view_tabledata();&&&&&&pause();&&&&&&&&&&&case '2':&&&&&&//INSERT&&&&&&printf(&/n INSERT &);&&&&&&printf(&/n ----------------------- &);&&&&&&printf(&/n ENTER CODE:&);&&&&&&gets(oraCode.arr);&&&&&&oraCode.len=strlen(oraCode.arr);&&&&&&oraCode.arr[oraCode.len]='/0';&&&&&&printf(& ENTER CONTENT:&);&&&&&&gets(oraContent.arr);&&&&&&oraContent.len=strlen(oraContent.arr);&&&&&&oraContent.arr[oraContent.len]='/0';
&&&&&&EXEC SQL INSERT INTO USE_DEPT VALUES(:oraCode,:oraContent);&&&&&&EXEC SQL COMMIT;&&&&&&pause();&&&&&&&&&&&case '3':&&&&&&view_tabledata();&&&&&&//DELETE&&&&&&printf(&/n DELETE &);&&&&&&printf(&/n ----------------------- &);&&&&&&printf(&/n ENTER CODE:&);&&&&&&gets(oraCode.arr);&&&&&&oraCode.len=strlen(oraCode.arr);&&&&&&oraCode.arr[oraCode.len]='/0';&&&&&&EXEC SQL DELETE USE_DEPT WHERE DEPT_ID=:oraC&&&&&&EXEC SQL COMMIT;&&&&&&//strcpy(c_sql, &DELETE FROM EMP WHERE EMPNO = :?&);& &&&&&&//EXEC SQL PREPARE sql_stmt FROM :c_ &&&&&&//EXEC SQL EXECUTE sql_stmt USING :emp_& &&&&&&pause();&&&&&&&&&&&case '4':&&&&&&view_tabledata();&&&&&&//UPDATE&&&&&&printf(&/n UPDATE &);&&&&&&printf(&/n ----------------------- &);&&&&&&printf(&/n ENTER CODE:&);&&&&&&gets(oraCode.arr);&&&&&&oraCode.len=strlen(oraCode.arr);&&&&&&oraCode.arr[oraCode.len]='/0';&&&&&&printf(& ENTER CONTENT:&);&&&&&&gets(oraContent.arr);&&&&&&oraContent.len=strlen(oraContent.arr);&&&&&&oraContent.arr[oraContent.len]='/0';
&&&&&&EXEC SQL UPDATE USE_DEPT SET DEPT_NAME=:oraContent WHERE DEPT_ID=:oraC&&&&&&EXEC SQL COMMIT;
&&&&&&pause();&&&&&&&&&&&default:&&&&&&&&&&&}&&&&}&&&&cmd[0]='6';&&&&&
&&&default:&&&&&&}
&&}&return 0;
void view_tabledata(){&//VIEW&EXEC SQL DECLARE curTable CURSOR FOR SELECT DEPT_ID,DEPT_NAME FROM USE_DEPT ORDER BY DEPT_ID ASC;&EXEC SQL SELECT COUNT(*) INTO :oraCount FROM USE_DEPT;&EXEC SQL OPEN curT
&printf(&/n& &);&printf(&%-8s&,&CODE&);&printf(&%-20s&,&CONTENT&);&printf(&/n--------------------&);
&for(i=1;i&=oraCi++)&{&&&&&&EXEC SQL FETCH curTable INTO :oraValue,:oraN&&oraValue.arr[oraValue.len]='/0';&&oraName.arr[oraName.len]='/0';&&printf(&/n &);&&printf(&%-8s&,oraValue.arr);&&printf(&%-20s&,oraName.arr);&}
&printf(&/n--------------------&);
&EXEC SQL CLOSE curT}//暂停屏幕void pause(){&&printf(&/n/n--Press Enter To Continue--&);&gets(screen);
}//显示意外错误void sql_error(char *msg) { &//printf(&/n%s %ld %s/n&, msg,sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc); &printf(&/n%s %s/n&, msg,(char *)sqlca.sqlerrm.sqlerrmc); &//EXEC SQL ROLLBACK RELEASE; &db_selectop(); }
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:678162次
积分:7915
积分:7915
排名:第2289名
原创:98篇
转载:15篇
评论:550条
(1)(4)(1)(1)(2)(2)(3)(8)(7)(5)(5)(1)(1)(8)(6)(4)(5)(6)(8)(6)(8)(4)(7)(10)您还可以使用以下方式登录
当前位置:&>&&>&&>& > Proc*C/C++入门之动态SQL
Proc*C/C++入门之动态SQL
Proc*C/C++入门之动态SQL基本概念在有些情况下, 在编码时 SQL 语句还不能完整地写出来, 而是在程序执行时才能构造出来,这种在程序执行临时生成的 SQL 语句叫动态 SQL 语句. 利用动态 SQL 来编写 Pro*C 程序的方法叫动态 SQL 技术!目的:加强应用程序的功能和灵活 静态SQL &- 在编写应用程序时,使用EXEC SQL关键字直接嵌入的SQL语句;在proc编译应用程序生成c语言的时,都已经确定 动态SQL &- 在运行应用程序时,由用户动态输入的SQL语句。在下列情况之一不知道时, 使用动态 SQL 技术:SQL 语句的文本. 宿主变量的个数。 宿主变量的数据类型 引用的数据库对象, 如列, 索引, 序列, 表, 用户名和视图.Oracle 中动态 SQL 可用以下两种方法实现:一个是 Oracle 自己的方法, 一个是 ANSI 的方法. 一般建议使用 Oracle 的方法,但对于较复杂的应用, 可以使用 ANSI 的方法, 因为这样可以使自己的程序简化。动态SQL1语法:EXEC SQL EXECUTE IMMEDIATE :host_stringhost_string 字符串限制不能执行select语言,仅适用于非select语句 在sqlplus上运行的命令,都可以拿过来来执行 语句中不包含输入宿主变量&一个宿主指针变量指向一块内存空间(存有用户输入的SQL语句) 常用于仅执行一次的动态语句 对重复执行多次的动态SQL语句,降低执行效率nt main01(){
memset(mySql, 0, sizeof(mySql));
pSql = NULL;
EXEC SQL WHENEVER SQLERROR DO sqlerr02();
pSql = myS
//循环处理sql语言
printf(&\nplease enter sql(not select ): &);
gets(mySql);
//scanf(&%s&, mySql); --空格截断
printf(&mysql:%s\n&, mySql);
printf(&任意键继续....\n&);
getchar();
EXEC SQL EXECUTE IMMEDIATE :pS
EXEC SQL COMMIT;
printf(&继续执行吗?\n&);
scanf(&%c&, &choosechar);
fflush(stdin);
if (choosechar=='n' || choosechar=='N')
EXEC SQL COMMIT WORK RELEASE;
printf(&return ok...\n&);}动态SQL2使用PREPARE命令准备SQL语句EXEC SQL PREPARE statement_name FROM :host_statement_name: 标识符,host_string:含SQL语句的字符串使用EXECUTE命令执行SQL语句EXEC SQL EXECUTE statement_name [USING :host_variable]如果SQL语句要通过宿主变量赋值,输入SQL语句时要用占位符仅适用于非select语句 可包含虚拟输入宿主变量和指示器变量,其个数和类型在预编译时已知int main02(){
memset(mySql, 0, sizeof(mySql));
pSql = NULL;
EXEC SQL WHENEVER SQLERROR DO sqlerr02();
pSql = myS
//循环处理sql语言
printf(&\n请输入要更新部门编号 &);
scanf(&%d&, &deptno);
printf(&\n请输入要新loc值 &);
scanf(&%s&, loc);
//准备动态sql
EXEC SQL PREPARE my_pre_sql FROM 'update dept set loc = :a where deptno = :b';
//执行动态sql
EXEC SQL EXECUTE my_pre_sql USING :loc, :
EXEC SQL COMMIT;
printf(&\n 按任意键继续? &);
getchar();
printf(&\n退出键入n, 其他继续? &);
scanf(&%c&, &choosechar);
fflush(stdin);
if (choosechar=='n' || choosechar=='N')
EXEC SQL COMMIT WORK RELEASE;
printf(&return ok...\n&);}动态SQL3使用PREPARE命令准备SQL语句EXEC SQL PREPARE statement_name FROM :host_statement_name: 标识符,host_string:含SQL语句的字符串使用DECLARE命令定义游标,可以结合游标一块使用 EXEC SQL DECLARE cursor_name CURSOR FOR statement_
EXEC SQL OPEN cursor_name [using host_variable_list] EXEC SQL FETCH cursor_name INTO host_variable_list EXEC SQL CLOSE cursor_name 查询部门号大于10的所有部门信息 动态sql3 处理选择列表项(select查询出来的结果列数固定) 和 输入宿主变量个数一定 本质:输入宿主变量个数固定 查询条件固定 输出宿主变量个数固定 返回结果固定//可以结合游标一块使用int main(){
memset(mySql, 0, sizeof(mySql));
pSql = NULL;
EXEC SQL WHENEVER SQLERROR DO sqlerr02();
//EXEC SQL WHENEVER NOT FOUND DO nodata();
//循环处理sql语言
printf(&\n请输入部门编号 &);
scanf(&%d&, &deptno);
//准备动态sql
EXEC SQL PREPARE my_pre_sql3 FROM 'select deptno, dname, loc from dept where deptno & :a';
//定义游标
EXEC SQL DECLARE c1 CURSOR FOR my_pre_sql3;
//打开游标
EXEC SQL OPEN c1 USING :
//提取数据
EXEC SQL WHENEVER NOT FOUND DO
EXEC SQL FETCH c1 INTO :deptno, :dname,:loc:loc_
printf(&%d\t %s\t %s \n&, deptno, dname, loc);
EXEC SQL CLOSE c1;
EXEC SQL COMMIT;
printf(&\n 按任意键继续? &);
getchar();
printf(&\n键入 n 退出, 其他继续? &);
scanf(&%c&, &choosechar);
fflush(stdin);
if (choosechar=='n' || choosechar=='N')
EXEC SQL COMMIT WORK RELEASE;
printf(&return ok...\n&);}
动态SQL4既适用于SELECT语句,也适用于非SELECT语句、 工程中主要使用该模式与前面的方法相比有两个突出的不同点:不但包含选择表项或虚拟输入宿主变量,而且它们的个数或数据类型在编译时还不知道 在其它方法中,ORACLE和C之间的数据类型转换是自动实现的。而在方法4中,由于动态语句中的宿主变量个数和类型在编译时还不知道,因此不能实现自动转换,必须由程序来控制数据类型之间的转换主要信息:选择表项和实输入宿主变量的个数 每一个选择表项和实输入宿主变量的成年高度 每一个选择表项和实输入宿主变量的数据类型 每一个输出宿主变量和实输入宿主变量的内存单元地址ANSI模式/* 包含C头文件 */
/* 包含SQLDA和SQLCA结构 */
/* 定义绑定变量和选择列表项的最大个数 */
#define MAX_ITEMS
/* 定义绑定变量和选择列表项名称的最大长度 */
#define MAX_VNAME_LEN
/* 定义指示变量名称的最大长度 */
#define MAX_INAME_LEN
void connect();
void sql_error();
void alloc_descriptors(int , int , int);
void dealloc_descriptors();
void set_bind_variables();
void process_select_list();
/* 定义绑定描述区和选择描述区 */
SQLDA* bind_
SQLDA* select_
/* 定义输入宿主变量:存放动态SQL语句 */
char sql_stat[100];
char current_date[20];
int main()
/* 安装错误处理句柄 */
exec sql whenever sqlerror do sql_error();
/* 连接到数据库 */
connect2();
/* 分配绑定描述区和选择描述区 */
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))
/* 准备动态SQL语句 */
exec sql prepare s from :sql_
/* 定义游标 */
exec sql de
/* 出错,继续下一循环 */
if(0 != sqlca.sqlcode)
/* 设置绑定变量 */
set_bind_variables();
* 打开游标
* select语句:生成结果集
* 其他SQL语句:执行语句
exec sql open c using descriptor bind_
* select语句
if(0 == strncmp(sql_stat , &select& , 6) || 0 == strncmp(sql_stat , &SELECT& , 6))
process_select_list();
/* 关闭游标 */
/* 释放选择描述区和选择描述区 */
dealloc_descriptors();
/* 提交事务,断开连接 */
puts(&谢谢使用Oracle动态SQL方法四!\n&);
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 :
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)
/* 分配绑定描述区和选择描述区 */
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()
/* 释放指示变量、绑定变量和选择列表项占用的内存 */
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()
char bind_var[64];
/* 设置绑定变量最大个数 */
bind_dp-&N = MAX_ITEMS;
/* 绑定变量名称: 绑定描述区 */
exec sql describe bind variables for s into bind_
/* 设置绑定变量实际个数 */
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;
*bind_dp-&I[i] = 0;
/* 设置数据缓冲区数据类型代码-&char */
bind_dp-&T[i] = 1;
void process_select_list()
int i , null_ok , precision ,
char title[MAX_VNAME_LEN];
/* 设置选择列表项的最大个数 */
select_dp-&N = MAX_ITEMS;
/* 选择列表项: 选择描述区 */
exec sql describe select list for s into select_
/* 设置选择列表项的实际个数 */
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])
/* number类型,取得精度与标度 */
//SQLNumberPrecV6(0 , (unsigned short*)&select_dp-&T[i] , &precision , &scale);
SQLNumberPrecV6(0 , (unsigned long *)&select_dp-&L[i] , &precision , &scale);
//wangbaoming modify 201409
if(scale & 0)
/* 实数: 显示长度:float
select_dp-&L[i] = sizeof(float);
/* 整数: 显示长度 int */
select_dp-&L[i] = sizeof(int);
/* DATA数据类型(DD-MON-YY) */
select_dp-&L[i] = 9;
/* 根据变量长度,重新为选择列表项数据缓冲区分配内存 */
if(2 != select_dp-&T[i])
/* 其他类型 */
select_dp-&V[i] = (char*)realloc(select_dp-&V[i] , select_dp-&L[i] + 1);
/* 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);
printf(&\t%.*s& , select_dp-&L[i] , title);
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;
select_dp-&T[i] = 3;
/* char */
select_dp-&T[i] = 1;
printf(&\n&);
/* 提取数据完毕-&结束循环 */
exec sql wheneve
/* 循环处理选择列表数据 */
for( ; ; )
/* 数据-&选择描述区 */
exec sql fetch c using descriptor select_
/* 显示数据 */
for( i = 0 ; i != select_dp-&F ; ++i)
if(*select_dp-&I[i] & 0){
/* 处理NULL */
printf(&\tNULL&);
if(3 == select_dp-&T[i]){
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]);
/* char */
printf(&\t%.*s& , select_dp-&L[i] , select_dp-&V[i]);
printf(&\n&);
就爱阅读网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。
欢迎转载:
推荐:    

我要回帖

更多关于 方舟 创建非专用主机 的文章

 

随机推荐