Chinaunix

标题: pro*c 连接oacle数据库的问题 [打印本页]

作者: simhare    时间: 2009-06-25 17:48
标题: pro*c 连接oacle数据库的问题
报的错误:
=================================
[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 编辑 ]
作者: gawk    时间: 2009-06-25 17:48
原帖由 simhare 于 2009-6-25 20:28 发表
是吗?你的机器上能proc过去?
-----------------
告诉我你的/etc/profile是怎么样的?
告诉我你的/u01/oracle/precomp/admin/pcscfg.cfg 文件是什么样的?
-----------------
你的oracle是什么版本?是li ...

我的是windows上的oracle
作者: simhare    时间: 2009-06-25 17:53
标题: 回复 #1 simhare 的帖子
各位谁知道原因的,告诉我一下。
--------------------------------
今天晚上等到答案,就结贴!
=====================
各位高手朋友们,帮忙啊!
作者: mgqw    时间: 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
作者: simhare    时间: 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]$
---------------
蓝色部分是手工添加的!
作者: mgqw    时间: 2009-06-25 17:56
具体的声明格式我不清楚,没用过proc
估计是你声明错了。
作者: simhare    时间: 2009-06-25 17:59
标题: 回复 #1 simhare 的帖子
EXEC SQL DECLARE emp_cursor CURSOR FOR
                SELECT NAME,AGE,SALARY FROM EMP;
==============
这个有错误吗?
作者: gawk    时间: 2009-06-25 18:01
我这边执行是正常的,能proc过去
作者: mgqw    时间: 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
作者: simhare    时间: 2009-06-25 20:28
标题: 回复 #7 gawk 的帖子
是吗?你的机器上能proc过去?
-----------------
告诉我你的/etc/profile是怎么样的?
告诉我你的/u01/oracle/precomp/admin/pcscfg.cfg 文件是什么样的?
-----------------
你的oracle是什么版本?是linux环境吗?
作者: simhare    时间: 2009-06-25 20:42
标题: 回复 #8 mgqw 的帖子
EXEC SQL DECLARE emp_cursor CURSOR FOR
                SELECT NAME,AGE,SALARY FROM EMP;
你这个select语句不需要游标吧,估计下面警告就是这么来的:
======================================
我这是在声明一个游标.
作者: simhare    时间: 2009-06-25 21:59
标题: 回复 #1 simhare 的帖子
============
今天结不了了,我把程序缩减到只有一句核心代码,还是不行:
我之行前面的连接就没问题,之行查询就不可以:
============
#define USERNAME "pw"
#define PASSWORD "pw"
#define SERVICE "wilson"
#include <stdio.h>
#include <stdlib.h>
#include "sqlca.h"

EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
        char *username=USERNAME;
        char *passwd=PASSWORD;
        char *service=SERVICE;
EXEC SQL END DECLARE SECTION;
int main()
{
        EXEC SQL WHENEVER SQLERROR DO sqlerr();

        EXEC SQL CONNECT :username IDENTIFIED BY :passwd USING :service;
        if (sqlca.sqlcode == 0)
              printf("\n Connected!\n");
        else
              printf("\n%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
        return 0;
}
==============
这个程序完全正常啊,证明能联上数据库啊。
作者: simhare    时间: 2009-06-25 22:01
标题: 回复 #11 simhare 的帖子
但是再加上这句就不行了,完全找不到"表":
EXEC SQL SELECT ENAME FROM EMP;
===========================
#define USERNAME "pw"
#define PASSWORD "pw"
#define SERVICE "wilson"
#include <stdio.h>
#include <stdlib.h>
#include "sqlca.h"

EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
        char *username=USERNAME;
        char *passwd=PASSWORD;
        char *service=SERVICE;
EXEC SQL END DECLARE SECTION;
int main()
{
        EXEC SQL WHENEVER SQLERROR DO sqlerr();

        EXEC SQL CONNECT :username IDENTIFIED BY :passwd USING :service;
        EXEC SQL SELECT ENAME FROM EMP;
        if (sqlca.sqlcode == 0)
              printf("\n Connected!\n");
        else
              printf("\n%.*s\n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
        return 0;
}
作者: simhare    时间: 2009-06-25 22:04
标题: 回复 #12 simhare 的帖子
这样就会报错:
==========
identifier 'EMP' must be declared
作者: simhare    时间: 2009-06-25 22:08
标题: 回复 #13 simhare 的帖子
我专门用pw用户登录后建了一个测试表:
create table ttx(a varchar(10), b number(20));
==============
然后再用
EXEC SQL SELECT B FROM ttx;
==============
结果报错:
identifier 'TTX' must be declared
作者: simhare    时间: 2009-06-25 22:09
标题: 回复 #14 simhare 的帖子
我要疯掉了。。。。。。
作者: AsahiC    时间: 2009-06-26 00:40
1、如果EMP表已经建好了,请查看下编译时链接的数据库对不对.在Makefile中应该有连接数据库的用户和密码的.
2、如果没有请建好EMP表.用户要弄对.
3、或者是修改Makefile不要让他链接数据库进行数据库对象的检查
作者: tempname_cn    时间: 2009-06-27 01:33
检查看看你makefile中的user_id
作者: tempname_cn    时间: 2009-06-27 01:35
使用 pw/pw@wilson 登入数据库,看看能成功执行SELECT ENAME FROM EMP 吗




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2