问题:我在C中嵌入的SQL语句编译和运行都很好。
但嵌入PL/SQL块在windows平台可以通过,在Linux下就不行预编译过不去。
我检查了$ORACLE_HOME/precomp/admin/pcscfg.cfg
缺省设置不行,改动了几个选项也不行。
哪位有经验请不吝赐教!以下是我的源码(在windows下用VC++和Pro*C/C++编译通过,可执行。)#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <sqlca.h>
EXEC SQL INCLUDE sqlca;void sql_error(msg)
char *msg;
{
printf("\n%s,%ld,%s\n", msg, sqlca.sqlcode, (char *)sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
exit(1);
}int main()
{EXEC SQL BEGIN DECLARE SECTION;
int i_EMPNO;
char c_ENAME[10+1];
char c_JOB[9+1];
int i_MGR;
char c_HIREDATE[10+1];
int i_SAL;
int i_COMM;
int i_DEPTNO;
VARCHAR username[10];
VARCHAR password[10];
VARCHAR dbstring[4];
VARCHAR sqlstmt[80];EXEC SQL END DECLARE SECTION; memset(c_ENAME, '\0', sizeof(c_ENAME));
memset(c_JOB, '\0', sizeof(c_JOB));
memset(c_HIREDATE, '\0', sizeof(c_HIREDATE));
i_EMPNO = 0;
i_MGR = 0;
i_SAL = 0;
i_COMM = 0;
i_DEPTNO = 0;
strcpy(username.arr,"scott");
strcpy(password.arr,"tiger");
strcpy(dbstring.arr,"orcl");
username.len=strlen(username.arr);
password.len=strlen(password.arr);
dbstring.len=strlen(dbstring.arr);
EXEC SQL WHENEVER SQLERROR DO sql_error("Connect Failed __"); EXEC SQL CONNECT :username IDENTIFIED BY :password USING:dbstring;
EXEC SQL EXECUTE
BEGIN
SELECT EMPNO,
NVL(ENAME,''),
NVL(JOB,''),
NVL(MGR,0),
NVL(TO_CHAR(HIREDATE,'yyyy/mm/dd'),''),
NVL(SAL,0),
NVL(COMM,0),
NVL(DEPTNO,0)
INTO :i_EMPNO,
:c_ENAME,
:c_JOB,
:i_MGR,
:c_HIREDATE,
:i_SAL,
:i_COMM,
:i_DEPTNO
FROM EMP
WHERE EMPNO=7839;
END;
END-EXEC;
EXEC SQL COMMIT WORK RELEASE; printf("EMPNO = %d\n",i_EMPNO);
printf("ENAME = %s\n",c_ENAME);
printf("JOB = %s\n",c_JOB);
printf("MGR = %d\n",i_MGR);
printf("HIREDATE = %s\n",c_HIREDATE);
printf("SAL = %d\n",i_SAL);
printf("COMM = %d\n",i_COMM);
printf("DEPTNO = %d\n",i_DEPTNO); return(0);
}
配置文件
$ORACLE_HOME/precomp/admin/pcscfg.cfgTYPE_CODE=oracle
PARSE=none
MODE=oracle
CODE=ANSI_C
DYNAMIC=oracle
COMP_CHARSET=multi_byte
CHAR_MAP=charz
SQLCHECK=semantics
DBMS=native
DURATION=transaction
VERSION=recent
PREFETCH=1
MAXOPENCURSORS=10
SYS_INCLUDE=(/usr/include,/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include)
INCLUDE=/opt/oracle/product/9.2.0/precomp/public
但嵌入PL/SQL块在windows平台可以通过,在Linux下就不行预编译过不去。
我检查了$ORACLE_HOME/precomp/admin/pcscfg.cfg
缺省设置不行,改动了几个选项也不行。
哪位有经验请不吝赐教!以下是我的源码(在windows下用VC++和Pro*C/C++编译通过,可执行。)#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <sqlca.h>
EXEC SQL INCLUDE sqlca;void sql_error(msg)
char *msg;
{
printf("\n%s,%ld,%s\n", msg, sqlca.sqlcode, (char *)sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
exit(1);
}int main()
{EXEC SQL BEGIN DECLARE SECTION;
int i_EMPNO;
char c_ENAME[10+1];
char c_JOB[9+1];
int i_MGR;
char c_HIREDATE[10+1];
int i_SAL;
int i_COMM;
int i_DEPTNO;
VARCHAR username[10];
VARCHAR password[10];
VARCHAR dbstring[4];
VARCHAR sqlstmt[80];EXEC SQL END DECLARE SECTION; memset(c_ENAME, '\0', sizeof(c_ENAME));
memset(c_JOB, '\0', sizeof(c_JOB));
memset(c_HIREDATE, '\0', sizeof(c_HIREDATE));
i_EMPNO = 0;
i_MGR = 0;
i_SAL = 0;
i_COMM = 0;
i_DEPTNO = 0;
strcpy(username.arr,"scott");
strcpy(password.arr,"tiger");
strcpy(dbstring.arr,"orcl");
username.len=strlen(username.arr);
password.len=strlen(password.arr);
dbstring.len=strlen(dbstring.arr);
EXEC SQL WHENEVER SQLERROR DO sql_error("Connect Failed __"); EXEC SQL CONNECT :username IDENTIFIED BY :password USING:dbstring;
EXEC SQL EXECUTE
BEGIN
SELECT EMPNO,
NVL(ENAME,''),
NVL(JOB,''),
NVL(MGR,0),
NVL(TO_CHAR(HIREDATE,'yyyy/mm/dd'),''),
NVL(SAL,0),
NVL(COMM,0),
NVL(DEPTNO,0)
INTO :i_EMPNO,
:c_ENAME,
:c_JOB,
:i_MGR,
:c_HIREDATE,
:i_SAL,
:i_COMM,
:i_DEPTNO
FROM EMP
WHERE EMPNO=7839;
END;
END-EXEC;
EXEC SQL COMMIT WORK RELEASE; printf("EMPNO = %d\n",i_EMPNO);
printf("ENAME = %s\n",c_ENAME);
printf("JOB = %s\n",c_JOB);
printf("MGR = %d\n",i_MGR);
printf("HIREDATE = %s\n",c_HIREDATE);
printf("SAL = %d\n",i_SAL);
printf("COMM = %d\n",i_COMM);
printf("DEPTNO = %d\n",i_DEPTNO); return(0);
}
配置文件
$ORACLE_HOME/precomp/admin/pcscfg.cfgTYPE_CODE=oracle
PARSE=none
MODE=oracle
CODE=ANSI_C
DYNAMIC=oracle
COMP_CHARSET=multi_byte
CHAR_MAP=charz
SQLCHECK=semantics
DBMS=native
DURATION=transaction
VERSION=recent
PREFETCH=1
MAXOPENCURSORS=10
SYS_INCLUDE=(/usr/include,/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include)
INCLUDE=/opt/oracle/product/9.2.0/precomp/public
解决方案 »
- 关于function测试 传参问题
- oracle 10g 连接 Sql 2005 错误提示NCR-000002 官方解释 调用函数错误
- 用VC6.0开发OCCI驱动的问题,ORACLE高手进,在线等。。。。
- 如何在Oracle数据库下建立作业!!急
- 关于SQL developer 的数据库联接问题
- select distinct 语句需要加index吗
- 得到相同NO對應Q的最後一次變更的DATE ,謝謝
- (急)developer2000报表中某些字段出现乱码,怎么会事?
- win2000 professional 下可以装oracle 吗?
- orcle导入dmp数据报错!重新把自己的本地数据库改为zhs16gbk字符集重新导入依然会报错!
- 如何使用oracle的普通连接
- ORA-23375错误
EXEC SQL EXECUTE
.............1
PCC-S-02345, SQLCHECK=SEMANTICS must be given when embedded PL/SQL blocks are us
ed$ proc iname=dbTest.pc sqlcheck=semanticsError at line 100, column 7 in file dbConnect.pc
WHERE EMPNO=7839;
......1
PLS-S-00201, identifier 'EMP' must be declared
Error at line 83, column 7 in file dbConnect.pc
SELECT EMPNO,
......1
PLS-S-00000, SQL Statement ignored
Semantic error at line 82, column 14, file dbConnect.pc:
BEGIN
.............1
PCC-S-02346, PL/SQL found semantic errors
/pcscfg.cfgPCC-F-02041, CMD-LINE: Option does not exist: usrid
在执行的时候我更正了,我执行的语句是:
$ proc iname=dbTest.pc sqlcheck=semantics usrid=scott/tiger@orcl结果如下:Pro*C/C++: Release 9.2.0.1.0 - Production on Thu Jan 17 13:14:07 2002Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.System default option values taken from: /opt/oracle/product/9.2.0/precomp/admin
/pcscfg.cfgPCC-F-02041, CMD-LINE: Option does not exist: usrid
你可以执行:
$proc
看看,有些什么参数,或许usrid在linux proc下叫另外一个名字
真脸红,就是 drabit(square) 说的问题.结分!!1