免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5311 | 回复: 9
打印 上一主题 下一主题

请问如何在动态语句中使用 load、 unload 功能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-01 17:01 |只看该作者 |倒序浏览
现在需要设计一个支持 load、unload 功能的函数,程序将需要处理数据传输到一个 prepare 语句中进行处理,但是程序却连连报错:

  1. int sql_run(str)
  2. char *str;
  3. {
  4.   strcpy(sqlstring,str);
  5.   EXEC SQL PREPARE s_comm FROM :sqlstring;
  6.   if (sqlca.sqlcode) {
  7.     errcall(ERROR, "%d", sqlca.sqlcode);
  8.     return (sqlca.sqlcode);
  9.   }
  10.   // 程序报  201 错误,不知为何该语句无法处理 unload或load 语句
  11.   EXEC SQL EXECUTE s_comm;
  12.   //  程序报  410 错误,提示 prepare 句柄没有准备好。
  13.   return(sqlca.sqlcode);
  14. }


  15.   sprintf(buff,  "unload   to   /tmp/dfmx.txt   select  *  from dfmx");
  16.   sql_run(buff);
  17.   // 程序不能执行该数据下载

  18.   sprintf(buff, "load  from  /tmp/dfmx.txt   insert into   dfmx ");
  19.    sql_run(buff);
  20.    // 程序加载 0 条记录。




  21.    请问包含 load 、unload 语句应该如何传递给一个动态 esql/c 语句呢?


  22.    
复制代码




    谢谢!!!!!

论坛徽章:
0
2 [报告]
发表于 2004-09-03 10:21 |只看该作者

请问如何在动态语句中使用 load、 unload 功能

我在别人的程序中见到了动态语句使用 load 和 unload 的例子,但是我在借鉴这些程序的时候,程序可以编译通过,但是程序就是无法正确执行,请版主关注本问题,谢谢!!!!

论坛徽章:
0
3 [报告]
发表于 2004-09-03 20:09 |只看该作者

请问如何在动态语句中使用 load、 unload 功能

ec中SQL语句不支持unload,load吧,
除非用system()或类似方法调用。

你所见的例子可以贴出来吗?

论坛徽章:
0
4 [报告]
发表于 2004-09-04 10:08 |只看该作者

请问如何在动态语句中使用 load、 unload 功能

以下就是一个使用 load 功能的程序


  1. /*******************************************************
  2. *        数据备份与恢复(backup_proc,rescovery_proc)
  3. *
  4. * 最后修改:        周国祥 2001/08/18
  5. *******************************************************/
  6. #include <stdio.h>;
  7. #include <curses.h>;
  8. #include <varargs.h>;
  9. #include <sys/types.h>;
  10. #include <sys/timeb.h>;
  11. #include <time.h>;

  12. #include "all.h"
  13. #include "macro_def.h"
  14. #include "tool.h"

  15. $include "db_struct.h";
  16. $include sqlca;

  17. #define WD        getenv ( "WORKDIR" )
  18. #define  COL_LEE        2

  19. void error_handler ();
  20. void warning_handler ();
  21. void notfound_handler ();

  22. /*
  23. extern WINDOW *my_win;
  24. */
  25. WINDOW *my_win;

  26. EXEC SQL WHENEVER SQLERROR CALL error_handler;
  27. EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
  28. EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;

  29. char        backup_table[100][40] = {
  30.                 "cur_tran_ls",
  31.                 "his_tran_ls",
  32.                 "err_tran_ls",
  33.                 "cur_settle_ls",
  34.                 "his_settle_ls",
  35.                 "saf_ls",
  36.                 "cur_hand_ls",
  37.                 "his_hand_ls",
  38.        
  39.                 "",
  40.                 NULL,
  41. };

  42. int backup_ls ()
  43. {
  44.         char buff[1024];
  45.         int ret;
  46.         int i = 0;
  47.        
  48.         while (backup_table[i] != NULL && backup_table[i][0] != '\0') {
  49. #ifdef Wubin_mod_20020509
  50.                 sprintf ( buff ,\
  51.                         "dbaccess - - 2>;/dev/null 1>;/dev/null <<!\ndatabase %s;\nunload to \"%s/backup/%s\" select * from %s;\n!", getenv("DBNAME"), getenv("WORKDIR"), backup_table[i], backup_table[i] );
  52.                 ret = system ( buff );
  53.        
  54.                 if ( ret ) {
  55.                         errcall ( ERROR , "Unable unload %s!", backup_table[i]);
  56.                         return -1;
  57.                 }
  58. #else
  59.                 sprintf ( buff ,\
  60.                         "unload to %s/backup/%s select * from %s ", getenv("WORKDIR"), backup_table[i], backup_table[i] );
  61.                 ret = sql_run(buff);
  62.        
  63.                 if (ret < 0) {
  64.                         errcall ( ERROR , "Unable unload %s! failed![%d]", backup_table[i], ret);
  65.                         return -1;
  66.                 }
  67. #endif       

  68.         }

  69.         return 0;
  70. }

  71. int recovery_ls ()
  72. {
  73.         char buff[1024];
  74.         int ret;
  75.        
  76.         int i = 0;
  77.        
  78.         while (backup_table[i] != NULL && backup_table[i][0] != '\0') {
  79. #ifdef Wubin_mod_20020509
  80.                 sprintf ( buff ,\
  81.                         "dbaccess - - 2>;/dev/null 1>;/dev/null <<!\ndatabase %s;\nload from \"%s/backup/%s\" insert into %s;\n!", getenv("DBNAME"), getenv("WORKDIR"), backup_table[i], backup_table[i]);
  82.                 ret=system ( buff );
  83.        
  84.                 if ( ret ) {
  85.                         errcall ( ERROR , "Unable load %s!", backup_table[i] );
  86.                         return -1;
  87.                 }
  88. #else
  89.                 sprintf ( buff ,\
  90.                         "load from %s/backup/%s insert into %s ", getenv("WORKDIR"), backup_table[i], backup_table[i]);
  91.                 ret = sql_run(buff);
  92.        
  93.                 if (ret < 0) {
  94.                         errcall ( ERROR , "Unable load %s! failed![%d]", backup_table[i], ret );
  95.                         return -1;
  96.                 }
  97. #endif       
  98.         }

  99.         return 0;
  100. }

  101. int backup_proc ()
  102. {
  103.         char        filename[250], tmp[81];
  104.         int                ch, line, ret;
  105.         char        cmd[300], fileout[128], backup_date[9];

  106.         tmp[0] = backup_date[0] = 0;       
  107.         ch = ret = 0;

  108.         sprintf(filename, "/tmp/.backup_proc.%d", getpid());
  109.         scr_dump(filename);
  110.        
  111.         DispBelow("数据备份处理");
  112.         clear_wline(stdscr, LINES-1);
  113.         my_win = newwin(19, 80, 3, 0);
  114.         mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
  115.         wrefresh(my_win);

  116.         line = COL_LEE;

  117.         if ( yorn(my_win, line++, "    是否进行数据备份处理?", "1.是", "0.否", 1, 0)) {
  118.                 goto end;
  119.         }

  120.         strcpy(fileout, " 磁带 ");
  121.         ch = strlen(fileout) + 1;
  122.         strcpy(fileout + ch, " 硬盘 ");
  123.         ch += strlen(fileout + ch) + 1;
  124.         strcpy(fileout + ch, " 取消 ");
  125.         ch = multi_select(my_win, 1, "    请选择备份存储设备:", fileout, 3, 1, 0, 0);

  126.         if (ch == 2) {
  127.                 goto end;
  128.         }

  129.         if (ch == 1) {
  130.                 getdatef(backup_date,"");
  131.                 mvwprintw(my_win, 2, 4, "请输入备份日期(YYYYMMDD): [%s]", backup_date);
  132.                 if (in_item(my_win, "", 2, 31, backup_date, 8, NULL, NULL, 0, 0) != ENTER) {
  133.                         goto end;
  134.                 }
  135.                 mvwprintw(my_win, 2, 4, "                                                               ");

  136.                 strcpy(fileout, " 交易流水 ");
  137.                 ch = strlen(fileout) + 1;
  138.                 strcpy(fileout + ch, " 所有路由 ");
  139.                 ch += strlen(fileout + ch) + 1;
  140.                 strcpy(fileout + ch, " 基本资料 ");
  141.                 ch += strlen(fileout + ch) + 1;
  142.                 strcpy(fileout + ch, " 取消 ");
  143.                 ch = multi_select(my_win, 1, "    请选择需要备份的数据:", fileout, 4, 3, 0, 0);

  144.                 switch (ch) {
  145.                     case 0:
  146.                         strcpy(tmp, "TRAN_LS");
  147.                         break;
  148.                            case 1:
  149.                         strcpy(tmp, "ROUTE");
  150.                         break;
  151.                            case 2:
  152.                         strcpy(tmp, "INFOMATION");
  153.                         break;
  154.                            case 3:
  155.                         goto end;
  156.                         break;

  157.                             default:
  158.                         goto end;
  159.                         break;
  160.                 }

  161. /*                 daylog(DEBUG, "正在生成备份数据, 备份日期: %s, 请稍候 ...", backup_date);                 */
  162.                 mvwprintw(my_win, 4, 4, "正在生成备份数据, 请稍候 ...");
  163.                 wrefresh(my_win);

  164.                 ret = backup_db(tmp, backup_date);
  165.                
  166.                 if (ret == 0) {
  167.                         sprintf ( cmd , "备份数据成功, 按任一键继续... [%s/backup/%s]", getenv("WORKDIR"), backup_date);
  168. /*                         sprintf ( cmd , "备份数据成功, 按任一键继续..."); */
  169.                         mvwaddstr ( my_win , 17 , 4 , cmd );
  170.                         wgetch ( my_win );
  171.                         goto end;
  172.                 } else {
  173.                         errcall ( ERROR , "Unable backup ls !\n" );
  174.                         sprintf ( cmd , "备份数据失败, 按任一键继续... [%s/backup/%s]", getenv("WORKDIR"), backup_date);
  175.                         sprintf ( cmd , "备份数据失败, 按任一键继续...");
  176.                         mvwaddstr ( my_win , 17 , 4 , cmd );
  177.                         wgetch ( my_win );

  178.                         delwin(my_win);
  179.                         scr_restore(filename);
  180.                         unlink(filename);
  181.                         return -1;
  182.                 }
  183.         }

  184.         sprintf ( cmd , "rm -f %s/backup/*" , WD );
  185.         system ( cmd );

  186.         if ( backup_ls () < 0 ) {
  187.                 errcall ( ERROR , "Unable backup ls !\n" );
  188.                 sprintf ( cmd , "备份数据失败, 按任一键继续...");
  189.                 mvwaddstr ( my_win , 17 , 4 , cmd );
  190.                 wgetch ( my_win );

  191.                 delwin(my_win);
  192.                 scr_restore(filename);
  193.                 unlink(filename);
  194.                 return -1;
  195.         }
  196.        
  197.         if ( yorn(my_win, line++,
  198.                 "    是否将数据倒入磁带?", "1.是", "0.否", 1, 0)) {
  199.                 delwin(my_win);
  200.                 scr_restore(filename);
  201.                 unlink(filename);
  202.                 return(0);
  203.         }

  204.         sprintf(cmd,
  205.         "tar cv8 2>;/dev/null 1>;/dev/null %s/etc %s/install %s/backup %s/box",
  206.                 WD , WD , WD , WD );
  207.         if ( system ( cmd ) != 0 ) {
  208.                 wrefresh( my_win );
  209.                 sprintf ( cmd , "备份数据失败, 按任一键继续...");
  210.                 mvwaddstr ( my_win , 17 , 4 , cmd );
  211.                 wgetch ( my_win );
  212.         } else {
  213.                 sprintf ( cmd , "备份数据成功, 按任一键继续...");
  214.                 mvwaddstr ( my_win , 17 , 4 , cmd );
  215.                 wgetch ( my_win );
  216.         }

  217. end:
  218.         delwin(my_win);
  219.         scr_restore(filename);
  220.         unlink(filename);
  221.        
  222.         return 0;
  223. }

  224. int recovery_proc ()
  225. {
  226.         char        filename[250], tmp[81], backup_date[9];
  227.         int                ch, line, ret;
  228.         char        cmd[300], fileout[128];

  229.         ret = 0;        tmp[0] = backup_date[0] = 0;       
  230.         ch = ret = 0;

  231.         sprintf(filename, "/tmp/.recovery_proc.%d", getpid());
  232.         scr_dump(filename);
  233.        
  234.         DispBelow("数据恢复处理");
  235.         clear_wline(stdscr, LINES-1);
  236.         my_win = newwin(19, 80, 3, 0);
  237.         mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
  238.         wrefresh(my_win);
  239.        
  240.         line = COL_LEE;
  241.        
  242.         if (yorn(my_win, line++, " 注意: 如果恢复数据将覆盖当前数据库中的数据, 是否进行数据恢复?", "1.是", "0.否", 1, 0)) {
  243.                 goto end;
  244.         }

  245.         strcpy(fileout, " 磁带 ");
  246.         ch = strlen(fileout) + 1;
  247.         strcpy(fileout + ch, " 硬盘 ");
  248.         ch += strlen(fileout + ch) + 1;
  249.         strcpy(fileout + ch, " 取消 ");
  250.         ch = multi_select(my_win, 1, "    请选择存储恢复数据的设备:", fileout, 3, 2, 0, 0);

  251.         if (ch == 2) {
  252.                 goto end;
  253.         }

  254.         if (ch == 1) {
  255.                 strcpy(backup_date,"        ");
  256.                 mvwprintw(my_win, 2, 4, "请输入恢复数据日期(YYYYMMDD): [%s]", backup_date);
  257.                 if (in_item(my_win, "", 2, 35, backup_date, 8, NULL, NULL, 0, 0) != ENTER) {
  258.                         goto end;
  259.                 }
  260.         sprintf(tmp, "cd %s/backup/%s >;/dev/null 2>;&1", getenv("WORKDIR"), backup_date);
  261.         ret = system(tmp);
  262.         if ( ret ) {
  263.                 errcall ( ERROR , "Not found %s/backup/%s", getenv("WORKDIR"), backup_date);
  264.                         sprintf ( cmd , "需要恢复的数据[%s/backup/%s]不存在", getenv("WORKDIR"), backup_date);
  265.                         mvwaddstr ( my_win , 17 , 4 , cmd );
  266.                         wgetch ( my_win );

  267.                         delwin(my_win);
  268.                         scr_restore(filename);
  269.                         unlink(filename);
  270.                         return -1;
  271.                 }

  272.                 mvwprintw(my_win, 2, 4, "                                                               ");

  273.                 strcpy(fileout, " 交易流水 ");
  274.                 ch = strlen(fileout) + 1;
  275.                 strcpy(fileout + ch, " 所有路由 ");
  276.                 ch += strlen(fileout + ch) + 1;
  277.                 strcpy(fileout + ch, " 基本资料 ");
  278.                 ch += strlen(fileout + ch) + 1;
  279.                 strcpy(fileout + ch, " 取消 ");
  280.                 ch = multi_select(my_win, 1, "    请选择需要恢复的数据:", fileout, 4, 3, 0, 0);

  281.                 if (ch == 3)
  282.                          goto end;
  283.                 if (yorn(my_win, line++, " 注意: 数据恢复将覆盖当前数据库中的数据, 是否进行数据恢复?", "1.是", "0.否", 1, 0)) {
  284.                         goto end;
  285.                 }

  286.                 switch (ch) {
  287.                     case 0:
  288.                         strcpy(tmp, "TRAN_LS");
  289.                         break;
  290.                            case 1:
  291.                         strcpy(tmp, "ROUTE");
  292.                         break;
  293.                            case 2:
  294.                         strcpy(tmp, "INFOMATION");
  295.                         break;
  296.                            case 3:
  297.                         goto end;
  298.                         break;

  299.                             default:
  300.                         goto end;
  301.                         break;
  302.                 }

  303.                 mvwprintw(my_win, 4, 4, "正在向数据库中恢复数据, 请稍候 ...");
  304.                 wrefresh(my_win);

  305.                 ret = recovery_db(tmp, backup_date);
  306.                
  307.                 if (ret == 0) {
  308.                         sprintf ( cmd , "恢复数据成功, 按任一键继续...");
  309.                         mvwaddstr ( my_win , 17 , 4 , cmd );
  310.                         wgetch ( my_win );
  311.                         goto end;
  312.                 } else {
  313.                         errcall ( ERROR , "Unable recovery ls !\n" );
  314.                         sprintf ( cmd , "恢复数据失败, 按任一键继续...");
  315.                         mvwaddstr ( my_win , 17 , 4 , cmd );
  316.                         wgetch ( my_win );

  317.                         delwin(my_win);
  318.                         scr_restore(filename);
  319.                         unlink(filename);
  320.                         return -1;
  321.                 }
  322.         }

  323.         if (yorn(my_win, line++, "    是否从磁带装入数据?", "1.是", "0.否", 1, 0))
  324.                 goto end;
  325.         else {
  326.                 sprintf ( cmd , "rm -f %s/backup/* >;/dev/null 2>;&1" , WD );
  327.                 system ( cmd );

  328.                 sprintf ( cmd , "tar xv8 >;/dev/null 2>;&1" );
  329.                 ret = system ( cmd );
  330.                 if ( ret ) {
  331.                         errcall ( ERROR , "Execute error!(%s) ", cmd);
  332.                         sprintf ( cmd , "读写磁带设备失败, 请确认磁带设备是否正常 按任一键继续...");
  333.                         mvwaddstr ( my_win , 17 , 4 , cmd );
  334.                         wgetch ( my_win );

  335.                         delwin(my_win);
  336.                         scr_restore(filename);
  337.                         unlink(filename);
  338.                         return -1;
  339.                 }
  340.         }

  341.        
  342.         if ( recovery_ls () < 0 ) {
  343.                 errcall ( ERROR , "Unable recovery ls !\n" );
  344.                 sprintf ( cmd , "恢复数据失败, 按任一键继续...");
  345.                 mvwaddstr ( my_win , 17 , 4 , cmd );
  346.                 wgetch ( my_win );

  347.                 delwin(my_win);
  348.                 scr_restore(filename);
  349.                 unlink(filename);
  350.                 return -1;
  351.         }
  352.        
  353.         sprintf ( cmd , "恢复数据成功, 按任一键继续...");
  354.         mvwaddstr ( my_win , 17 , 4 , cmd );
  355.         wgetch ( my_win );

  356. end:
  357.         delwin(my_win);
  358.         scr_restore(filename);
  359.         unlink(filename);
  360.        
  361.         return 0;
  362. }


  363. /*================== WuBin 2001-9-8 15:33 ======Start==============
  364. 根据库表名备份数据到相应日期的目录
  365. ===========================2001-9-8 15:33=======End==============*/

  366. int backup_db (char *table_name, char *backup_date)
  367. {
  368.         $char buff[1024], tmp[150];
  369.         int ret, i;
  370.         struct table_arry_st table_arry[50];        /* 目标数组名 */
  371.        
  372.         memset(table_arry, '\0', sizeof(table_arry));
  373.         i = ret = 0;
  374.        
  375.         sprintf(buff, "mkdir %s/backup/%s >;/dev/null 2>;&1", getenv("WORKDIR"), backup_date);
  376.         system(buff);

  377.         sprintf(tmp, "%s/etc/backup_table", getenv("WORKDIR"));
  378.         ret = readtab2arry(tmp, table_name, table_arry);

  379.         if ( ret ) {
  380.                         errcall ( ERROR , "Read %s Error! ", tmp);
  381.                         return -1;
  382.         }

  383.         while (table_arry[i].table_name[0] != 0 ) {
  384.                 sprintf(buff, "rm -f %s/backup/%s/%s >;/dev/null 2>;&1", getenv("WORKDIR"), backup_date, table_arry[i].table_name);
  385.                 system(buff);
  386.                 i++;
  387.         }
  388.         i = 0;
  389.         while (table_arry[i].table_name[0] != 0) {
  390.                 memset(buff, 0, sizeof(buff));
  391. #ifdef Wubin_mod_20020509
  392.                 sprintf ( buff , "dbaccess - - 2>;/dev/null 1>;/dev/null <<!\ndatabase %s;\nunload to \"%s/backup/%s/%s\" select * from %s;\n!", getenv("DBNAME"), getenv("WORKDIR"), backup_date, table_arry[i].table_name, table_arry[i].table_name );
  393.                 ret = system ( buff );
  394.                 if ( ret ) {
  395.                         errcall ( ERROR , "Unable unload %s! [ret =  %d]", table_arry[i].table_name, ret);
  396.                         return -1;
  397.                 }
  398. #else
  399.                 sprintf ( buff , "unload to %s/backup/%s/%s select * from %s ", getenv("WORKDIR"), backup_date, table_arry[i].table_name, table_arry[i].table_name );

  400.                 ret = sql_run(buff);
  401.        
  402.                 if (ret < 0) {
  403.                         errcall(ERROR, "Unable unload %s! failed![%d]", table_arry[i].table_name, ret);
  404.                         return -1;
  405.                 }
  406. #endif
  407.                 i++;
  408.         }
  409.         return 0;
  410. }



  411. /*================== WuBin 2001-9-8 15:33 ======Start==============
  412. 根据库表名恢复数据从相应日期的目录
  413. ===========================2001-9-8 15:33=======End==============*/
  414. int recovery_db (char *table_name, char *backup_date)
  415. {
  416.         char buff[1024], tmp[150];
  417.         int ret, i;
  418.         struct table_arry_st rc_table_arry[50];        /* 目标数组名 */
  419.        
  420.         memset(rc_table_arry, '\0', sizeof(rc_table_arry));
  421.         i = ret = 0;
  422.        
  423.         sprintf(buff, "cd %s/backup/%s >;/dev/null 2>;&1", getenv("WORKDIR"), backup_date);
  424.         ret = system(buff);
  425.         if ( ret ) {
  426.                         errcall ( ERROR , "Not found %s", buff);
  427.                         return -1;
  428.                 }

  429.         sprintf(tmp, "%s/etc/backup_table", getenv("WORKDIR"));
  430.         ret = readtab2arry(tmp, table_name, rc_table_arry);

  431.         if ( ret ) {
  432.                         errcall ( ERROR , "Read %s Error!", tmp);
  433.                         return -1;
  434.         }
  435.        
  436.         while (rc_table_arry[i].table_name[0] != 0 ) {
  437.                 sprintf(buff, "ls %s/backup/%s/%s >;/dev/null 2>;&1", getenv("WORKDIR"), backup_date, rc_table_arry[i].table_name);
  438.                 ret = system(buff);
  439.                 if ( ret ) {
  440.                         errcall ( ERROR , "Read %s Error!", rc_table_arry[i].table_name);
  441.                         return -1;
  442.                 }
  443.                 i++;
  444.         }
  445.         i = 0;
  446.         while (rc_table_arry[i].table_name[0] != 0) {
  447. #ifdef Wubin_mod_20020509
  448.                 sprintf ( buff , "dbaccess - - 2>;/dev/null 1>;/dev/null <<!\ndatabase %s;\ndelete from %s;\n!", getenv("DBNAME"), rc_table_arry[i].table_name );
  449.                 ret = system ( buff );
  450.                 if ( ret ) {
  451.                         errcall ( ERROR , "Unable delete %s [ret = %d]!", rc_table_arry[i].table_name, ret);
  452.                         return -1;
  453.                 }
  454. #else
  455.                 sprintf ( buff , "delete from %s;\n!", rc_table_arry[i].table_name );
  456.                 ret = sql_run(buff);
  457.        
  458.                 if (ret < 0) {
  459.                         errcall ( ERROR , "Unable delete %s failed![%d]", rc_table_arry[i].table_name, ret);
  460.                         return -1;
  461.                 }
  462. #endif

  463. #ifdef Wubin_mod_20020509
  464.                 sprintf ( buff , "dbaccess - - 2>;/dev/null 1>;/dev/null <<!\ndatabase %s;\nload from \"%s/backup/%s/%s\" insert into %s;\n!", getenv("DBNAME"), getenv("WORKDIR"), backup_date, rc_table_arry[i].table_name, rc_table_arry[i].table_name );
  465.                 ret = system ( buff );
  466.                 if ( ret ) {
  467.                         errcall ( ERROR , "Unable load %s [ret = %d]!", rc_table_arry[i].table_name, ret);
  468.                         return -1;
  469.                 }
  470. #else
  471.                 sprintf ( buff , "dload from %s/backup/%s/%s insert into %s ", getenv("WORKDIR"), backup_date, rc_table_arry[i].table_name, rc_table_arry[i].table_name );
  472.                 ret = sql_run(buff);
  473.        
  474.                 if (ret < 0) {
  475.                         errcall ( ERROR , "Unable load %s failed![%d]", rc_table_arry[i].table_name, ret);
  476.                         return -1;
  477.                 }
  478. #endif
  479.                 i++;
  480.         }

  481.         return 0;
  482. }


复制代码



以下是 sql_run 功能的实现


  1. /**************************************************************
  2. * 功能:                 数据库处理公共函数 public.ec
  3. * 最后修改日期:       
  4. *
  5. * 周国祥        2002/04/09 从dbprg/public.ec中分离过来
  6. **************************************************************/

  7. #include <stdio.h>;
  8. #include <curses.h>;
  9. #include "mytools.h"

  10. EXEC SQL INCLUDE sqlca;
  11. EXEC SQL WHENEVER SQLERROR CALL error_handler;
  12. EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
  13. EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;

  14. $char sqlstring[2000];

  15. $include "db_struct.h";

  16. int sql_run(str)
  17. char *str;
  18. {
  19.         strcpy(sqlstring,str);
  20.         EXEC SQL PREPARE s_comm FROM :sqlstring;
  21.         if (sqlca.sqlcode) {
  22.                 errcall(ERROR, "%d", sqlca.sqlcode);
  23.                 return (sqlca.sqlcode);
  24.         }
  25.         EXEC SQL EXECUTE s_comm;
  26.         return(sqlca.sqlcode);
  27. }

  28. int query_count(str)
  29. char *str;
  30. {
  31.         $int counts;
  32.         $short indi;

  33.         strcpy(sqlstring,str);
  34.         EXEC SQL PREPARE q_comm_1 FROM :sqlstring;
  35.         if (sqlca.sqlcode) {
  36.                 errcall(ERROR, "PREPARE [%s] failed (%d)",
  37.                         sqlstring, sqlca.sqlcode);
  38.                 return -1;
  39.         }

  40.         EXEC SQL DECLARE query_cur CURSOR FOR q_comm_1;
  41.         if (sqlca.sqlcode) {
  42.                 errcall(ERROR, "DECLARE [%s] failed (%d)",
  43.                         sqlstring, sqlca.sqlcode);
  44.                 return -1;
  45.         }
  46.         EXEC SQL OPEN query_cur;
  47.         if (sqlca.sqlcode) {
  48.                 errcall(ERROR, "OPEN [%s] failed (%d)",
  49.                         sqlstring, sqlca.sqlcode);
  50.                 return -1;
  51.         }
  52.         EXEC SQL FETCH query_cur INTO :counts:indi;
  53.         if (sqlca.sqlcode && sqlca.sqlcode == 100) {
  54.                 errcall(ERROR, "FETCH failed (%d)",
  55.                         sqlca.sqlcode);
  56.                 return -1;
  57.         }
  58.         if ((indi == -1) || sqlca.sqlcode) counts = 0;
  59.         EXEC SQL CLOSE query_cur;

  60.         return(counts);
  61. }

  62. long calc_long(str)
  63. char *str;
  64. {
  65.         $long total;
  66.         $short indi;

  67.         strcpy(sqlstring,str);
  68.         EXEC SQL PREPARE q_comm_2 FROM :sqlstring;
  69.         EXEC SQL DECLARE calcl_cur CURSOR FOR q_comm_2;
  70.         EXEC SQL OPEN calcl_cur;
  71.         EXEC SQL FETCH calcl_cur INTO :total:indi;
  72.         if ((indi == -1) || sqlca.sqlcode) total = 0;
  73.         EXEC SQL CLOSE calcl_cur;
  74.         return(total);
  75. }

  76. double calc_double(str)
  77. char *str;
  78. {
  79.         $double total;
  80.         $short indi;

  81.         strcpy(sqlstring,str);
  82.         EXEC SQL PREPARE q_comm_3 FROM :sqlstring;
  83.         EXEC SQL DECLARE calcd_cur CURSOR FOR q_comm_3;
  84.         EXEC SQL OPEN calcd_cur;
  85.         EXEC SQL FETCH calcd_cur INTO :total:indi;
  86.         if ((indi == -1) || sqlca.sqlcode) total = 0;
  87.         EXEC SQL CLOSE calcd_cur;
  88.         return(total);
  89. }

  90. int get_title(char *title_name)
  91. {
  92.         $char center_name[41];
  93.         $short indi;
  94.         $char        bankid[12], hostid[3];

  95.         title_name[0] = 0;
  96.         EXEC SQL SELECT bank_id, host_id
  97.                 INTO :bankid, :hostid
  98.                 FROM sys_param;
  99.         if (sqlca.sqlcode)
  100.                 return(sqlca.sqlcode);
  101.         DelSpace(bankid);
  102.         DelSpace(hostid);

  103.         EXEC SQL SELECT bank_name
  104.                 INTO :center_name
  105.                 FROM bank_info
  106.                 WHERE bank_id = :bankid and host_id = :hostid;
  107.         if (!sqlca.sqlcode)
  108.                 strcpy(title_name, center_name);
  109.         return(sqlca.sqlcode);
  110. }

  111. /*
  112. * 获取bankid之IP地址
  113. */
  114. int        get_ipaddr( id_in, hid_in, ip_in )
  115. char        id_in[12], hid_in[3], ip_in[21];
  116. {
  117.         $char id[12], ip[21];
  118.         int        len;

  119.         memcpy(id, id_in, 12);
  120.         memcpy(ip, ip_in, 21);

  121.         EXEC SQL DECLARE addr_cur CURSOR FOR
  122.         SELECT tran_ip_addr1
  123.         FROM        bank_base
  124.         WHERE        bank_id = :id;

  125.         EXEC SQL OPEN addr_cur;
  126.         EXEC SQL FETCH addr_cur INTO :ip;
  127.         if (sqlca.sqlcode)
  128.                 return(sqlca.sqlcode);

  129.         DelSpace(ip);
  130.         strcpy(ip_in, ip);
  131.        
  132.         return (0);
  133. }

  134. int get_master(card, t)
  135. char *card;
  136. $parameter S_card_acct *t;
  137. {
  138.         $char m_card_no[19];
  139.        
  140.         sprintf(m_card_no,"%12.12s?00?",card);
  141. /*================== WuBin 2001-4-9 21:02 ======Start==============
  142.         EXEC SQL SELECT T41_card_no, T41_c_amt, T41_auth_cnt, T41_auth_amt,
  143.                         T41_auth_total, T41_balance, T41_deposit_cnt,
  144.                         T41_deposit_amt
  145.                  INTO :t->;T41_master_card_no, :t->;T41_c_amt, :t->;T41_auth_cnt,
  146.                       :t->;T41_auth_amt, :t->;T41_auth_total, :t->;T41_balance,
  147.                       :t->;T41_deposit_cnt, :t->;T41_deposit_amt
  148.                  FROM card_acct
  149.                  WHERE T41_card_no MATCHES :m_card_no;
  150. ===========================2001-4-9 21:02=======End==============*/
  151.         EXEC SQL SELECT card_no, card_amt, auth_cnt, auth_amt,
  152.                         auth_total, balance, deposit_cnt,
  153.                         deposit_amt
  154.                  INTO :t->;card_no, :t->;card_amt, :t->;auth_cnt,
  155.                       :t->;auth_amt, :t->;auth_total, :t->;balance,
  156.                       :t->;deposit_cnt, :t->;deposit_amt
  157.                  FROM card_acct
  158.                  WHERE card_no MATCHES :m_card_no;


  159.         return(sqlca.sqlcode);
  160. }


  161. int get_master_cardno(char *card, char *master)
  162. {
  163.         $char card_no[19],master_cardno[19],acc[13];
  164.        
  165.         strcpy(card_no,card);
  166.         memcpy(acc,card_no,12);
  167.         acc[12]='\0';

  168. /*================== WuBin 2001-4-9 21:14 ======Start==============
  169.         EXEC SQL SELECT MAX(T41_card_no) INTO :master_cardno
  170.                  FROM card_t
  171.                  WHERE T41_card_no[1,12] =:acc AND  
  172.                        T41_card_no[14,15]="00";
  173. ===========================2001-4-9 21:14=======End==============*/
  174.         EXEC SQL SELECT MAX(card_no) INTO :master_cardno
  175.                  FROM card_acct
  176.                  WHERE card_no[1,12] =:acc AND  
  177.                        card_no[14,15]="00";

  178.         memcpy(master,master_cardno,19);

  179.         if(SQLCODE)  errcall(ERROR,"get_master_cardno error! [%d]",SQLCODE);

  180.         return(sqlca.sqlcode);
  181. }

  182. /* 获取主卡帐户状态 */
  183. int get_master_accstat(char *card, char *stat)
  184. {
  185.         $char a_stat[2],master[19];
  186.         char card_no[19];
  187.         int ret;
  188.        
  189.         strcpy(card_no,card);

  190.         ret=get_master_cardno(card_no,master);
  191.         if(ret) return(ret);

  192. /*================== WuBin 2001-4-9 21:16 ======Start==============
  193.         EXEC SQL SELECT T41_a_stat INTO :a_stat
  194.                  FROM card_acct
  195.                  WHERE T41_card_no = :master;
  196. ===========================2001-4-9 21:16=======End==============*/
  197.         EXEC SQL SELECT master_stat INTO :a_stat
  198.                  FROM card_acct
  199.                  WHERE card_no = :master;

  200.         memcpy(stat,a_stat,1);

  201.         if(SQLCODE<0)  errcall(ERROR,"get_master_accstat error! [%d]",SQLCODE);
  202.         return(sqlca.sqlcode);
  203. }


  204. int get_master_accno(char *card, char *no)
  205. {
  206.         $char acc_no[22],master[19];
  207.         char card_no[19];
  208.         int ret;
  209.        
  210.         strcpy(card_no,card);

  211.         ret=get_master_cardno(card_no,master);
  212.         if(ret) return(ret);

  213. /*================== WuBin 2001-4-9 21:17 ======Start==============
  214.         EXEC SQL SELECT T41_acc_no INTO :acc_no
  215.                  FROM card_acct
  216.                  WHERE T41_card_no = :master;
  217. ===========================2001-4-9 21:17=======End==============*/
  218.         EXEC SQL SELECT acct_no INTO :acc_no
  219.                  FROM card_acct
  220.                  WHERE card_no = :master;

  221.         memcpy(no,acc_no,12); /* 帐户号现只用12位 */

  222.         if(SQLCODE)  errcall(ERROR,"get_master_accno error! [%d]",SQLCODE);
  223.         return(sqlca.sqlcode);
  224. }

  225. /*
  226. * 根据商户号获取签约行行号及主机号
  227. */
  228. int get_sign_bank(merchantid, bankid, hostid)
  229. char        *merchantid, *bankid, *hostid;
  230. {
  231.         $char        merchant_id[16], bank_id[12], host_id[3];

  232.         strcpy(merchant_id, merchantid);
  233.         DelSpace(merchant_id);
  234.         $select sign_bank_id, sign_host_id
  235.         into $bank_id, $host_id
  236.         from merchant_base
  237.         where merchant_id = $merchant_id;

  238.         if (SQLCODE) {
  239.                 errcall(ERROR, "get_sign_bank(%s) select eerror(%d)!", merchant_id, SQLCODE);
  240.                 bankid[0] = '\0';
  241.                 hostid[0] = '\0';
  242.                 return(-1);
  243.         }
  244.         DelSpace(bank_id);
  245.         DelSpace(host_id);
  246.         strcpy(bankid, bank_id);
  247.         strcpy(hostid, host_id);
  248.         return(0);
  249. }

  250. /*
  251. *        根据货币代码获取货币的中文名称 ADD Wubin
  252. */

  253. int get_ccy_name(char *id, char *name)
  254. {
  255.         $char ccy_id[16], cn_name[31];

  256.         cn_name[0] = 0;

  257.         strcpy(ccy_id, id);

  258.         EXEC SQL SELECT ccy_name INTO :cn_name FROM ccy_type WHERE ccy_type = :ccy_id;

  259.         if (sqlca.sqlcode == 0) {
  260.                 rm_tail_space(cn_name);
  261.                 strcpy(name, cn_name);
  262.         }

  263.         return(sqlca.sqlcode);
  264. }

  265. $ifdef wyz020509_mod;
  266. $else;
  267. /*
  268. int creat_prt_dir(bankid)
  269. char        bankid[12];
  270. {
  271.         $char        sqlstr[512];
  272.         $char        tmp_bankid[12];
  273.         char        filename[128];

  274.         sprintf(sqlstr, "SELECT bank_id from bank_info        \
  275.                 where adm_bank_id = \'%s\'                \
  276.                 or bank_id = \'%s\'",
  277.                 bankid, bankid);

  278.         EXEC SQL PREPARE sel_bank_id FROM :sqlstr;
  279.         if( SQLCODE<0 ) {
  280.                 errcall(ERROR, "PREPARE FAILED[%ld][%s]", SQLCODE, sqlstr);
  281.                 return -1;
  282.         }

  283.         EXEC SQL DECLARE cur_sel_bank CURSOR WITH HOLD FOR sel_bank_id;
  284.         if( SQLCODE<0 ) {
  285.                 errcall(ERROR, "DECLARE FAILED[%ld][%s]", SQLCODE, sqlstr);
  286.                 return -1;
  287.         }

  288.         EXEC SQL OPEN cur_sel_bank;
  289.         if( SQLCODE<0 ) {
  290.                 errcall(ERROR, "OPEN FAILED[%ld]", SQLCODE);
  291.                 return -1;
  292.         }

  293.         while(1) {
  294.                 EXEC SQL FETCH cur_sel_bank INTO :tmp_bankid;
  295.                 if (SQLCODE < 0) {
  296.                         errcall(ERROR, "FETCH FAILED(%d)", SQLCODE);
  297.                         return -1;
  298.                 }
  299.                 else if (SQLCODE == 100)
  300.                         break;

  301.                 DelSpace(tmp_bankid);
  302.                 sprintf(filename, "prt/%s", tmp_bankid);
  303.                 if (create_tmp_file(filename) < 0) {
  304.                         errcall(ERROR, "create_tmp_file(%s) failed", filename);
  305.                 }
  306.         }

  307.         return 0;
  308. }
  309. */
  310. $endif;

复制代码



上面的程序原理我也清楚,这些程序就是在我的 informix online 5.0 环境下没法执行。

论坛徽章:
0
5 [报告]
发表于 2004-09-05 17:34 |只看该作者

请问如何在动态语句中使用 load、 unload 功能

这和你说的是两码事。
这是用shell实现load/unload,你是EC中是不可能用prepare实现的。

论坛徽章:
0
6 [报告]
发表于 2004-09-06 09:31 |只看该作者

请问如何在动态语句中使用 load、 unload 功能


  1. #ifdef Wubin_mod_20020509
  2.       sprintf ( buff ,\
  3.          "dbaccess - - 2>;/dev/null 1>;/dev/null <<!\ndatabase %s;\nload from \"%s/backup/%s\" insert into %s;\n!", getenv("DBNAME"), getenv("WORKDIR"), backup_table[i], backup_table[i]);
  4.       ret=system ( buff );
  5.    
  6.       if ( ret ) {
  7.          errcall ( ERROR , "Unable load %s!", backup_table[i] );
  8.          return -1;
  9.       }
  10. #else
  11.       sprintf ( buff ,\
  12.          "load from %s/backup/%s insert into %s ", getenv("WORKDIR"), backup_table[i], backup_table[i]);
  13.       ret = sql_run(buff);
  14.    
  15.       if (ret < 0) {
  16.          errcall ( ERROR , "Unable load %s! failed![%d]", backup_table[i], ret );
  17.          return -1;
  18.            }
  19. #endif   
复制代码


实际上我说的是上面的第二种条件编译的情况,你看在源程序中使用的 load from ..... 程序,然后它调用了 sql_run 进行装配执行,为何这样的程序在我的运行环境中就无法执行了??

论坛徽章:
0
7 [报告]
发表于 2004-09-06 09:51 |只看该作者

请问如何在动态语句中使用 load、 unload 功能

哥们,你看看程序里明明在使用unload或者是unload的时候用的是system(buff) 呀?  只用在用insert或delete的时候才用sql_run(buff) 的  所以在ec里是不支持load和unload的:(

论坛徽章:
0
8 [报告]
发表于 2004-09-06 17:41 |只看该作者

请问如何在动态语句中使用 load、 unload 功能

sprintf ( buff ,\
         "load from %s/backup/%s insert into %s ", getenv("WORKDIR", backup_table, backup_table);
      ret = sql_run(buff);

    你看清楚,我说的是以上语句的执行,这是一个 load 语句,程序就是在调用 sql_run 在执行吗!!!

论坛徽章:
0
9 [报告]
发表于 2004-09-07 18:02 |只看该作者

请问如何在动态语句中使用 load、 unload 功能

TO: ljmmail.

我只能对你说三个字:


I  服了  U.

论坛徽章:
0
10 [报告]
发表于 2010-04-01 09:47 |只看该作者
TO: ljmmail.{:3_205:}

咱能不.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP