免费注册 查看新帖 |

Chinaunix

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

帮忙看看这个OCI程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-23 16:21 |只看该作者 |倒序浏览
写了个OCI程序,简单的对数据库执行SELECT查询,程序执行时出错信息如下:
sql_init_socket ok
select nasname from nas
Fail ORA-00942: table or view does not exist

sql_select_query fail

程序代码如下:


  1. #include <stdio.h>;
  2. #include <sys/stat.h>;
  3. #include <sys/time.h>;
  4. #include <stdlib.h>;
  5. #include <string.h>;
  6. #include <oci.h>;

  7. #define        MAX_DATASTR_LEN        64

  8. typedef struct oracle_sock_t {
  9.         OCIEnv                *env;
  10.         OCIError        *errHandle;
  11.         OCISvcCtx        *conn;
  12.         OCIStmt                *queryHandle;
  13.         sb2                *indicators;
  14.         char                **results;
  15. } oracle_sock_t;

  16. typedef struct ora_config {
  17.         char   *sql_server;
  18.         char   *sql_login;
  19.         char   *sql_password;
  20.         char   *sql_db;
  21.         int     sqltrace;
  22. } ORA_CONFIG;

  23. char *sql_error(oracle_sock_t *oracle_sock, ORA_CONFIG *config) {
  24.         static char        msgbuf[512];
  25.         sb4                errcode = 0;

  26.         if (!oracle_sock) return "ocilib: no connection to db";

  27.         memset((void *)msgbuf, (int)'\0', sizeof(msgbuf));

  28.         OCIErrorGet((dvoid *)oracle_sock->;errHandle, (ub4)1, (text *)NULL,
  29.                 &errcode, msgbuf, (ub4)sizeof(msgbuf), (ub4)OCI_HTYPE_ERROR);
  30.         if (errcode) {
  31.                 return msgbuf;
  32.         }
  33.         else {
  34.                 return NULL;
  35.         }
  36. }

  37. oracle_sock_t* sql_init_socket(ORA_CONFIG *config) {
  38.         oracle_sock_t *oracle_sock = NULL;

  39.         oracle_sock = (oracle_sock_t *)malloc(sizeof(oracle_sock_t));
  40.         if (oracle_sock == NULL)
  41.                 return NULL;

  42.         if ( OCIEnvCreate(&oracle_sock->;env, OCI_DEFAULT|OCI_THREADED, (dvoid *)0,
  43.                 (dvoid* (*)(dvoid*, size_t))0,
  44.                 (dvoid* (*)(dvoid*, dvoid*, size_t))0,
  45.                 (void (*)(dvoid*, dvoid *))0,
  46.                 0, (dvoid **)0) ) {
  47.                 fprintf(stderr,"ocilib: Couldn't init Oracle OCI environment (OCIEnvCreate())");
  48.                 return NULL;
  49.         }

  50.         if (OCIHandleAlloc((dvoid *)oracle_sock->;env, (dvoid **)&oracle_sock->;errHandle,
  51.                 (ub4)OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0))
  52.         {
  53.                 fprintf(stderr, "ocilib: Couldn't init Oracle ERROR handle (OCIHandleAlloc())");
  54.                 return NULL;
  55.         }

  56.         /* Allocate handles for select and update queries */
  57.         if (OCIHandleAlloc((dvoid *)oracle_sock->;env, (dvoid **)&oracle_sock->;queryHandle,
  58.                                 (ub4)OCI_HTYPE_STMT, (CONST size_t)0, (dvoid **)0))
  59.         {
  60.                 fprintf(stderr,"ocilib: Couldn't init Oracle query handles: %s", sql_error(oracle_sock, config));
  61.                 return NULL;
  62.         }

  63.         if (OCILogon(oracle_sock->;env, oracle_sock->;errHandle, &oracle_sock->;conn,
  64.                         config->;sql_login, strlen(config->;sql_login),
  65.                         config->;sql_password,  strlen(config->;sql_password),
  66.                         config->;sql_db, strlen(config->;sql_db)))
  67.         {
  68.                 fprintf(stderr, "ocilib: Oracle logon failed: '%s'", sql_error(oracle_sock, config));
  69.                 sql_close(oracle_sock, config);
  70.                 return NULL;
  71.         }

  72.         return oracle_sock;
  73. }

  74. int sql_num_fields(oracle_sock_t *oracle_sock, ORA_CONFIG *config) {
  75.         ub4                count;

  76.         if (OCIAttrGet((dvoid *)oracle_sock->;queryHandle,
  77.                         (ub4)OCI_HTYPE_STMT,
  78.                         (dvoid *)&count,
  79.                         (ub4 *)0,
  80.                         (ub4)OCI_ATTR_PARAM_COUNT,
  81.                         oracle_sock->;errHandle)) {
  82.                 fprintf(stderr, "ocilib: Error retrieving column count in sql_num_fields: %s", sql_error(oracle_sock, config));
  83.                 return -1;
  84.         }

  85.         return count;
  86. }

  87. int sql_select_query(oracle_sock_t *oracle_sock, ORA_CONFIG *config, char *querystr) {
  88.         int                x;
  89.         int                y;
  90.         int                colcount;
  91.         OCIParam        *param;
  92.         OCIDefine        *define;
  93.         ub2                dtype;
  94.         ub2                dsize;
  95.         char                **rowdata=NULL;
  96.         sb2                *indicators;

  97.         if (config->;sqltrace)
  98.                 fprintf(stderr, "%s\n", querystr);

  99.         if (oracle_sock->;conn == NULL) {
  100.                 fprintf(stderr, "ocilib: not logoned");
  101.                 return -1;
  102.         }

  103.         if (OCIStmtPrepare(oracle_sock->;queryHandle, oracle_sock->;errHandle,
  104.                                 querystr, strlen(querystr),
  105.                                 OCI_NTV_SYNTAX, OCI_DEFAULT))  {
  106.                 fprintf(stderr,"ocilib: prepare failed in sql_select_query: %s",sql_error(oracle_sock, config));
  107.                 return -1;
  108.         }

  109.         /* Query only one row by default (for now) */
  110.         x = OCIStmtExecute(oracle_sock->;conn,
  111.                                 oracle_sock->;queryHandle,
  112.                                 oracle_sock->;errHandle,
  113.                                 (ub4)0,               
  114.                                 (ub4)0,
  115.                                 (OCISnapshot *)NULL,
  116.                                 (OCISnapshot *)NULL,
  117.                                 (ub4)OCI_DEFAULT);

  118.         if (x == OCI_NO_DATA) {
  119.                 fprintf(stderr, "NO DATA\n");
  120.                 return 0;        // Nothing to fetch
  121.         }
  122.         else if (x != OCI_SUCCESS) {
  123.                 fprintf(stderr, "Fail %s\n", sql_error(oracle_sock, config));
  124.                 return -1;        // query failed
  125.         }

  126.         /*
  127.          * Define where the output from fetch calls will go
  128.          *
  129.          * This is a gross hack, but it works - we convert
  130.          * all data to strings for ease of use.  Fortunately, most
  131.          * of the data we deal with is already in string format.
  132.          */
  133.         colcount = sql_num_fields(oracle_sock, config);

  134.         /*
  135.          *        FIXME: These malloc's can probably go, as the schema
  136.          *        is fixed...
  137.          */
  138.         rowdata=(char **)malloc(sizeof(char *) * (colcount+1));
  139.         memset(rowdata, 0, (sizeof(char *) * (colcount+1)) );
  140.         indicators = (sb2 *) malloc(sizeof(sb2) * (colcount+1));
  141.         memset(indicators, 0, sizeof(sb2) * (colcount+1));

  142.         for (y=1; y <= colcount; y++) {
  143.                 x=OCIParamGet(oracle_sock->;queryHandle, OCI_HTYPE_STMT,
  144.                                 oracle_sock->;errHandle,
  145.                                 (dvoid **)&param,
  146.                                 (ub4)y);
  147.                 if (x != OCI_SUCCESS) {
  148.                         fprintf(stderr, "ocilib: OCIParamGet() failed in sql_select_query: %s", sql_error(oracle_sock, config));
  149.                         return -1;
  150.                 }

  151.                 x=OCIAttrGet((dvoid*)param, OCI_DTYPE_PARAM,
  152.                            (dvoid*)&dtype, (ub4*)0, OCI_ATTR_DATA_TYPE,
  153.                            oracle_sock->;errHandle);
  154.                 if (x != OCI_SUCCESS) {
  155.                         fprintf(stderr, "ocilib: OCIAttrGet() failed in sql_select_query: %s", sql_error(oracle_sock, config));
  156.                         return -1;
  157.                 }

  158.                 dsize=MAX_DATASTR_LEN;

  159.                 /*
  160.                  * Use the retrieved length of dname to allocate an output
  161.                  * buffer, and then define the output variable (but only
  162.                  * for char/string type columns).
  163.                  */
  164.                 switch(dtype) {
  165. #ifdef SQLT_AFC
  166.                 case SQLT_AFC:        /* ansii fixed char */
  167. #endif
  168. #ifdef SQLT_AFV
  169.                 case SQLT_AFV:        /* ansii var char */
  170. #endif
  171.                 case SQLT_VCS:        /* var char */
  172.                 case SQLT_CHR:        /* char */
  173.                 case SQLT_STR:        /* string */
  174.                         x=OCIAttrGet((dvoid*)param, (ub4)OCI_DTYPE_PARAM,
  175.                                    (dvoid*)&dsize, (ub4 *)0, (ub4)OCI_ATTR_DATA_SIZE,
  176.                                    oracle_sock->;errHandle);
  177.                         if (x != OCI_SUCCESS) {
  178.                                 fprintf(stderr, "ocilib: OCIAttrGet() failed in sql_select_query: %s", sql_error(oracle_sock, config));
  179.                                 return -1;
  180.                         }
  181.                         rowdata[y-1]=malloc(dsize+1);
  182.                         break;
  183.                 case SQLT_DAT:
  184.                 case SQLT_INT:
  185.                 case SQLT_UIN:
  186.                 case SQLT_FLT:
  187.                 case SQLT_PDN:
  188.                 case SQLT_BIN:
  189.                 case SQLT_NUM:
  190.                         rowdata[y-1]=malloc(dsize+1);
  191.                         break;
  192.                 default:
  193.                         dsize=0;
  194.                         rowdata[y-1]=NULL;
  195.                         break;
  196.                 }

  197.                 indicators[y-1] = 0;

  198.                 x=OCIDefineByPos(oracle_sock->;queryHandle,
  199.                                 &define,
  200.                                 oracle_sock->;errHandle,
  201.                                 y,
  202.                                 (ub1 *)rowdata[y-1],
  203.                                 dsize+1,
  204.                                 SQLT_STR,
  205.                                 &indicators[y-1],
  206.                                 (dvoid *)0,
  207.                                 (dvoid *)0,
  208.                                 OCI_DEFAULT);

  209.                 /*
  210.                  *        FIXME: memory leaks of indicators & rowdata?
  211.                  */
  212.                 if (x != OCI_SUCCESS) {
  213.                         fprintf(stderr, "ocilib: OCIDefineByPos() failed in sql_select_query: %s", sql_error(oracle_sock, config));
  214.                         return -1;
  215.                 }
  216.         }

  217.         oracle_sock->;results=rowdata;
  218.         oracle_sock->;indicators=indicators;

  219.         return 0;
  220. }


  221. int sql_close(oracle_sock_t *oracle_sock, ORA_CONFIG *config) {
  222.         if (oracle_sock->;conn) {
  223.                 OCILogoff(oracle_sock->;conn, oracle_sock->;errHandle);
  224.         }

  225.         if (oracle_sock->;queryHandle) {
  226.                 OCIHandleFree((dvoid *)oracle_sock->;queryHandle, (ub4) OCI_HTYPE_STMT);
  227.         }
  228.         if (oracle_sock->;errHandle) {
  229.                 OCIHandleFree((dvoid *)oracle_sock->;errHandle, (ub4) OCI_HTYPE_ERROR);
  230.         }
  231.         if (oracle_sock->;env) {
  232.                 OCIHandleFree((dvoid *)oracle_sock->;env, (ub4) OCI_HTYPE_ENV);
  233.         }

  234.         oracle_sock->;conn = NULL;
  235.         free(oracle_sock);

  236.         return 0;
  237. }


  238. int main()
  239. {
  240.         oracle_sock_t        *oracle_sock = NULL;
  241.         ORA_CONFIG        *config = NULL;
  242.         char        *querystr = "select nasname from nas where id=1";

  243.         config = malloc(sizeof(ORA_CONFIG));
  244.         if ( !config ) {
  245.                 fprintf(stderr, "malloc out of memory\n");       
  246.                 exit(-1);
  247.         }
  248.         config->;sql_server = "ylei";
  249.         config->;sql_login  = "system";
  250.         config->;sql_password = "manager";
  251.         config->;sql_db = "nsinit";
  252.         config->;sqltrace = 1;

  253.         oracle_sock = sql_init_socket(config);
  254.         if ( oracle_sock != NULL ) {
  255.                 fprintf(stderr, "sql_init_socket ok\n");
  256.         }
  257.         else {
  258.                 fprintf(stderr, "sql_init_socket failure\n");
  259.                 exit(-1);
  260.         }

  261.         if (sql_select_query(oracle_sock, config, "select nasname from nas") != 0) {
  262.                 fprintf(stderr, "sql_select_query fail\n");
  263.                 exit(-1);
  264.         }
  265.        
  266.         fprintf("nasname: %s", oracle_sock->;results[0]);
  267.         exit(0);
  268. }
复制代码



我在sqlplus中执行如上SQL语句则没有任何问题,但是如果在执行sqlplus system/manager命令后不执行connect internal命令则出错消息和程序
的出错消息一样,还请哪位指教,多谢!

论坛徽章:
0
2 [报告]
发表于 2004-06-23 16:43 |只看该作者

帮忙看看这个OCI程序

搞定,程序本身没问题,原因见标题为connect internal帖子。

ORACLE NEWBIE, 继续熟悉OCI中。。。 汗。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP