免费注册 查看新帖 |

Chinaunix

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

[C] linux下oracle的pro*c的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-24 10:37 |只看该作者 |倒序浏览
20可用积分
环境:linux+oracle
pro*c
----------------------------
我的pc文件:
#include<stdio>
#include<stdlib>
#include "sqlca.h"

EXEC SQL BEGIN DECLARE SECTION;
          char *uid="scott/scott@wilson";
EXEC SQL END DECLARE SECTION;

int main()
{
      EXEC SQL CONNECT :uid;
      if(sqlca.sqlcode==0)
         printf("success!\n");
      else
         printf("fail!\n");
}
-------------------------------------
生成的c文件
/* Result Sets Interface */
#ifndef SQL_CRSR
#  define SQL_CRSR
  struct sql_cursor
  {
    unsigned int curocn;
    void *ptr1;
    void *ptr2;
    unsigned int magic;
  };
  typedef struct sql_cursor sql_cursor;
  typedef struct sql_cursor SQL_CURSOR;
#endif /* SQL_CRSR */

/* Thread Safety */
typedef void * sql_context;
typedef void * SQL_CONTEXT;

/* Object support */
struct sqltvn
{
  unsigned char *tvnvsn;
  unsigned short tvnvsnl;
  unsigned char *tvnnm;
  unsigned short tvnnml;
  unsigned char *tvnsnm;
  unsigned short tvnsnml;
};
typedef struct sqltvn sqltvn;

struct sqladts
{
  unsigned int adtvsn;
  unsigned short adtmode;
  unsigned short adtnum;  
  sqltvn adttvn[1];      
};
typedef struct sqladts sqladts;

static struct sqladts sqladt = {
  1,1,0,
};

/* Binding to PL/SQL Records */
struct sqltdss
{
  unsigned int tdsvsn;
  unsigned short tdsnum;
  unsigned char *tdsval[1];
};
typedef struct sqltdss sqltdss;
static struct sqltdss sqltds =
{
  1,
  0,
};

/* File name & Package Name */
struct sqlcxp
{
  unsigned short fillen;
           char  filnam[6];
};
static const struct sqlcxp sqlfpn =
{
    5,
    "tt.pc"
};


static unsigned int sqlctx = 2427;


static struct sqlexd {
   unsigned int   sqlvsn;
   unsigned int   arrsiz;
   unsigned int   iters;
   unsigned int   offset;
   unsigned short selerr;
   unsigned short sqlety;
   unsigned int   occurs;
      const short *cud;
   unsigned char  *sqlest;
      const char  *stmt;
   sqladts *sqladtp;
   sqltdss *sqltdsp;
            void  **sqphsv;
   unsigned int   *sqphsl;
            int   *sqphss;
            void  **sqpind;
            int   *sqpins;
   unsigned int   *sqparm;
   unsigned int   **sqparc;
   unsigned short  *sqpadto;
   unsigned short  *sqptdso;
   unsigned int   sqlcmax;
   unsigned int   sqlcmin;
   unsigned int   sqlcincr;
   unsigned int   sqlctimeout;
   unsigned int   sqlcnowait;
              int   sqfoff;
   unsigned int   sqcmod;
   unsigned int   sqfmod;
            void  *sqhstv[4];
   unsigned int   sqhstl[4];
            int   sqhsts[4];
            void  *sqindv[4];
            int   sqinds[4];
   unsigned int   sqharm[4];
   unsigned int   *sqharc[4];
   unsigned short  sqadto[4];
   unsigned short  sqtdso[4];
} sqlstm = {12,4};

// Prototypes
extern "C" {
  void sqlcxt (void **, unsigned int *,
               struct sqlexd *, const struct sqlcxp *);
  void sqlcx2t(void **, unsigned int *,
               struct sqlexd *, const struct sqlcxp *);
  void sqlbuft(void **, char *);
  void sqlgs2t(void **, char *);
  void sqlorat(void **, unsigned int *, void *);
}

// Forms Interface
static const int IAPSUCC = 0;
static const int IAPFAIL = 1403;
static const int IAPFTL  = 535;
extern "C" { void sqliem(unsigned char *, signed int *); }

typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR;
typedef struct { unsigned short len; unsigned char arr[1]; } varchar;

/* cud (compilation unit data) array */
static const short sqlcud0[] =
{12,4130,1,0,0,
5,0,0,0,0,0,27,11,0,0,4,4,0,1,0,1,97,0,0,1,10,0,0,1,10,0,0,1,10,0,0,
};


#include<stdio>
#include<stdlib>
#include "sqlca.h"

/* EXEC SQL BEGIN DECLARE SECTION; */

          char *uid="scott/scott@wilson";
/* EXEC SQL END DECLARE SECTION; */


int main()
{
      /* EXEC SQL CONNECT :uid; */

{
      struct sqlexd sqlstm;
      sqlstm.sqlvsn = 12;
      sqlstm.arrsiz = 4;
      sqlstm.sqladtp = &sqladt;
      sqlstm.sqltdsp = &sqltds;
      sqlstm.iters = (unsigned int  )10;
      sqlstm.offset = (unsigned int  )5;
      sqlstm.cud = sqlcud0;
      sqlstm.sqlest = (unsigned char  *)&sqlca;
      sqlstm.sqlety = (unsigned short)4352;
      sqlstm.occurs = (unsigned int  )0;
      sqlstm.sqhstv[0] = (         void  *)uid;
      sqlstm.sqhstl[0] = (unsigned int  )0;
      sqlstm.sqhsts[0] = (         int  )0;
      sqlstm.sqindv[0] = (         void  *)0;
      sqlstm.sqinds[0] = (         int  )0;
      sqlstm.sqharm[0] = (unsigned int  )0;
      sqlstm.sqadto[0] = (unsigned short )0;
      sqlstm.sqtdso[0] = (unsigned short )0;
      sqlstm.sqphsv = sqlstm.sqhstv;
      sqlstm.sqphsl = sqlstm.sqhstl;
      sqlstm.sqphss = sqlstm.sqhsts;
      sqlstm.sqpind = sqlstm.sqindv;
      sqlstm.sqpins = sqlstm.sqinds;
      sqlstm.sqparm = sqlstm.sqharm;
      sqlstm.sqparc = sqlstm.sqharc;
      sqlstm.sqpadto = sqlstm.sqadto;
      sqlstm.sqptdso = sqlstm.sqtdso;
      sqlstm.sqlcmax = (unsigned int )100;
      sqlstm.sqlcmin = (unsigned int )2;
      sqlstm.sqlcincr = (unsigned int )1;
      sqlstm.sqlctimeout = (unsigned int )0;
      sqlstm.sqlcnowait = (unsigned int )0;
      sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}


      if(sqlca.sqlcode==0)
         printf("success!\n");
      else
         printf("fail!\n");
      printf("%s\n", sqlca.sqlerrm.sqlerrmc);
      return 0;
}
--------------------------------
用gcc时报的错误:
[oracle@oracle11gTux1 lesson1]$ gcc tt.c

tt.c:117: error: syntax error before string constant
tt.c:125: error: syntax error before '}' token
tt.c:131: error: syntax error before string constant
tt.c:143:16: stdio: No such file or directory
tt.c:144:17: stdlib: No such file or directory
tt.c:145:19: sqlca.h: No such file or directory
tt.c: In function `main':
tt.c:166: error: `sqlca' undeclared (first use in this function)
tt.c:166: error: (Each undeclared identifier is reported only once
tt.c:166: error: for each function it appears in.)

[oracle@oracle11gTux1 lesson1]$
----------------------------------
请问这个错误该怎么办?

[ 本帖最后由 simhare 于 2009-6-24 12:00 编辑 ]

最佳答案

查看完整内容

不好意思,手一抖少打了几个字,把后面的.h弄丢了 #include#include#include#include

论坛徽章:
0
2 [报告]
发表于 2009-06-24 10:37 |只看该作者
原帖由 simhare 于 2009-6-24 11:58 发表
从来没碰到这两个文件找不到的情况,hello.c文件加个空格试试:
#include
#include




我太"荣幸"了吧?
刚才测试的时候试过了,加了空格也是这样的。
------
先让我喘口气,早晨两点多到现在了, ...


不好意思,手一抖少打了几个字,把后面的.h弄丢了
#include<stdio>
#include<stdlib>

#include<stdio.h>
#include<stdlib.h>

论坛徽章:
0
3 [报告]
发表于 2009-06-24 10:41 |只看该作者

回复 #1 simhare 的帖子

哦,还有,我的pcscfg.cfg文件:
--------
[oracle@oracle11gTux1 lesson1]$ vi /u01/oracle/precomp/admin/pcscfg.cfg

sys_include=(/u01/oracle/precomp/public,/usr/include,/usr/lib/gcc/i386-redhat-linux/4.1.1/include,/usr/lib/gcc/i386-redhat-linux/3.4.5/include,/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/include,/usr/lib/gcc/i586-suse-linux/4.1.0/include)
ltype=short
code=c
parse=none
SQLCHECK=SEMANTICS
[oracle@oracle11gTux1 lesson1]$
-----------------
标红色的是手工添加的。

[ 本帖最后由 simhare 于 2009-6-24 10:43 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-06-24 10:52 |只看该作者

回复 #1 simhare 的帖子

1.首先有语法错误.
2.其次找不到INCLUDE的东东.

论坛徽章:
0
5 [报告]
发表于 2009-06-24 10:55 |只看该作者
#include <stdio.h>
#include <stdlib.h>
#include "sqlca.h"
不是吧,这三个头文件你一个都没找到………………
tt.c:143:16: stdio: No such file or directory
tt.c:144:17: stdlib: No such file or directory
tt.c:145:19: sqlca.h: No such file or directory

论坛徽章:
0
6 [报告]
发表于 2009-06-24 10:59 |只看该作者
编译命令 gcc tt.c   
头文件sqlca.h的路径都没包含,肯定要出问题,假设你的sqlca.h头文件放在/home/oracle/include目录下,编译命令如下:
gcc -o tt tt.c -I/home/oracle/include

但你怎么连,下面这两个系统默认的头文件都找不到??????
#include<stdio>
#include<stdlib>

[ 本帖最后由 mgqw 于 2009-6-24 11:01 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-06-24 10:59 |只看该作者

回复 #4 mgqw 的帖子

是啊,我用的是CentOS4.7,装了Oracle11g,其他都没怎么动了,怎么会找不到这三个文件呢?

论坛徽章:
0
8 [报告]
发表于 2009-06-24 11:02 |只看该作者
原帖由 simhare 于 2009-6-24 10:59 发表
是啊,我用的是CentOS4.7,装了Oracle11g,其他都没怎么动了,怎么会找不到这三个文件呢?


#include<stdio>
#include<stdlib>
这两个文件找不到最不应该。
自己写个hello.c试试能不能找到。

论坛徽章:
0
9 [报告]
发表于 2009-06-24 11:02 |只看该作者

回复 #5 mgqw 的帖子

#include<stdio>
#include<stdlib>
-----------------------
我的pc文件就是这么写的,中间没有空格,这应该不影响吧?

论坛徽章:
0
10 [报告]
发表于 2009-06-24 11:04 |只看该作者

回复 #5 mgqw 的帖子

假设你的sqlca.h头文件放在/home/oracle/include目录下,编译命令如下:
gcc -o tt tt.c -I/home/oracle/include
-----------------
写个hello.c试试能不能找到
-------------------
我去试试看,在另外一台机器上呢,稍等。呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP