免费注册 查看新帖 |

Chinaunix

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

[C] pro*c 连接oacle数据库的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-25 17:48 |只看该作者 |倒序浏览
20可用积分
报的错误:
=================================
[oracle@oracle11gTux1 lessons]$ proc ./gg.pc

Pro*C/C++: Release 11.1.0.6.0 - Production on Thu Jun 25 12:11:13 2009

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

System default option values taken from: /u01/oracle/precomp/admin/pcscfg.cfg

Error at line 39, column 37 in file ./gg.pc
        EXEC SQL DECLARE emp_cursor CURSOR FOR
....................................1
PLS-S-00201, identifier 'EMP' must be declared
Error at line 39, column 37 in file ./gg.pc
        EXEC SQL DECLARE emp_cursor CURSOR FOR
....................................1
PLS-S-00000, SQL Statement ignored
Semantic error at line 39, column 37, file ./gg.pc:
        EXEC SQL DECLARE emp_cursor CURSOR FOR
....................................1
PCC-S-02346, PL/SQL found semantic errors

[oracle@oracle11gTux1 lessons]$
==================================
我的源文件:
=============
[oracle@oracle11gTux1 lessons]$ cat ./gg.pc

#define USERNAME "pw"
#define PASSWORD "pw"
#define SERVICE "wilson"
#include <stdio.h>
#include <stdlib.h>
#include "sqlca.h"

EXEC SQL INCLUDE SQLCA;



//typedef enum exx exx;


EXEC SQL BEGIN DECLARE SECTION;
        char *username=USERNAME;
        char *passwd=PASSWORD;
        char *service=SERVICE;

        char name[20];
        int age;
        float salary;
EXEC SQL END DECLARE SECTION;

void sqlerr()
{
        EXEC SQL WHENEVER SQLERROR CONTINUE;
        printf("\n%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
        EXEC SQL ROLLBACK WORK RELEASE;
        exit(1);
}
int main()
{
        EXEC SQL WHENEVER SQLERROR DO sqlerr();

        EXEC SQL CONNECT :username IDENTIFIED BY :passwd USING :service;

       EXEC SQL DECLARE emp_cursor CURSOR FOR
                SELECT NAME,AGE,SALARY FROM EMP;

        EXEC SQL OPEN emp_cursor;

        while(true)
        {
                EXEC SQL WHENEVER NOT FOUND DO break;
                EXEC SQL FETCH emp_cursor
                        INTO :name, :age, :salary;
                printf("\n%s",sqlca.sqlerrd[2]);
                printf("\n%.*s\n",name,age,salary);
        }
        EXEC SQL CLOSE emp_cursor;
        EXEC SQL COMMIT WORK RELEASE;

        //if (sqlca.sqlcode == 0)
        //      printf("\n Connected!\n");
        //else
        //      printf("\n%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);

        return 0;
}
[oracle@oracle11gTux1 lessons]$
===================
我用PW用户在sql*plus中数据库很正常,而且PW用户有一张表"EMP".

[ 本帖最后由 simhare 于 2009-6-25 17:58 编辑 ]

最佳答案

查看完整内容

我的是windows上的oracle

论坛徽章:
0
2 [报告]
发表于 2009-06-25 17:48 |只看该作者
原帖由 simhare 于 2009-6-25 20:28 发表
是吗?你的机器上能proc过去?
-----------------
告诉我你的/etc/profile是怎么样的?
告诉我你的/u01/oracle/precomp/admin/pcscfg.cfg 文件是什么样的?
-----------------
你的oracle是什么版本?是li ...

我的是windows上的oracle

论坛徽章:
0
3 [报告]
发表于 2009-06-25 17:53 |只看该作者

回复 #1 simhare 的帖子

各位谁知道原因的,告诉我一下。
--------------------------------
今天晚上等到答案,就结贴!
=====================
各位高手朋友们,帮忙啊!

论坛徽章:
0
4 [报告]
发表于 2009-06-25 17:54 |只看该作者
identifier 'EMP' must be declared
要你先声明EMP

下面这个游标你声明了也没有使用,被忽略了
PLS-S-00000, SQL Statement ignored
Semantic error at line 39, column 37, file ./gg.pc:
        EXEC SQL DECLARE emp_cursor CURSOR FOR

论坛徽章:
0
5 [报告]
发表于 2009-06-25 17:55 |只看该作者

回复 #1 simhare 的帖子

我的 /u01/oracle/precomp/admin/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]$
---------------
蓝色部分是手工添加的!

论坛徽章:
0
6 [报告]
发表于 2009-06-25 17:56 |只看该作者
具体的声明格式我不清楚,没用过proc
估计是你声明错了。

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

回复 #1 simhare 的帖子

EXEC SQL DECLARE emp_cursor CURSOR FOR
                SELECT NAME,AGE,SALARY FROM EMP;
==============
这个有错误吗?

论坛徽章:
0
8 [报告]
发表于 2009-06-25 18:01 |只看该作者
我这边执行是正常的,能proc过去

论坛徽章:
0
9 [报告]
发表于 2009-06-25 18:02 |只看该作者
EXEC SQL DECLARE emp_cursor CURSOR FOR
                SELECT NAME,AGE,SALARY FROM EMP;
你这个select语句不需要游标吧,估计下面警告就是这么来的:
PLS-S-00000, SQL Statement ignored
Semantic error at line 39, column 37, file ./gg.pc:
        EXEC SQL DECLARE emp_cursor CURSOR FOR

而另外一个错误都告诉你要先声明EMP了,具体怎么声明语法自己去看看:
identifier 'EMP' must be declared

论坛徽章:
0
10 [报告]
发表于 2009-06-25 20:28 |只看该作者

回复 #7 gawk 的帖子

是吗?你的机器上能proc过去?
-----------------
告诉我你的/etc/profile是怎么样的?
告诉我你的/u01/oracle/precomp/admin/pcscfg.cfg 文件是什么样的?
-----------------
你的oracle是什么版本?是linux环境吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP