CXX-E-UNDECLARED,标识符 "exec" 未定义
CXX-E-UNDECLARED, identifier "exec" is undefined
我熟悉 Oracle PL/SQL 和 C/C++ 语言,我可以编写从数据库中提取数据并将结果输出到 console/command/output stream/etc 的代码.
不过我对openVMS开发不熟悉。但我能够验证 CXX
编译器(内置于操作系统)在 compiling/linking 和 运行 之后工作,以下代码:
#include <stdio.h>
void main(void) {
printif("Hello World!\n");
}
现在,我尽力连接到 oracle 数据库(安装在同一台服务器上,还有许多其他 C/CP 文件写入以从数据库中提取数据,它们工作正常),但我无法编译任何试图从数据库中读取的代码。为简单起见,这里是尝试访问数据库的代码:
#include<stdio.h>
void main(void) {
int cnt = -1;
exec sql SELECT count(*) INTO :cnt FROM EMPLOYEES;
printif("Number of employees: %d", cnt);
}
当我编译它时,我得到:
%CXX-E-UNDECLARED, identifier "exec" is undefined
起初,我认为我可能在 header 处缺少一个图书馆,所以我尝试了以下方法:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#ifdef PC
#include <fcntl.h>
#else
#include <unixio.h>
#include <file.h>
#endif
#include <ctype.h>
但是上述库的 none 导致编译器停止抱怨 exec sql
语句。
我查阅了有关在 openVMS 上编写 C 程序的 Oracle 技术文档,发现了一些示例代码,其中包括 <sqlca.h>
和其他类似 <sql_sqlda.h>
的示例代码,但其中 none 解决了我的问题。
我猜,可能是之前编写的其他 c 文件以某种方式用处理 EXEC SQL 语句的特殊命令编译(通过在编译时动态附加依赖库??? )
所以我的问题是:我该怎么做才能编译我的代码并获取某个 table 中的记录数?
您的 C 代码中嵌入了 SQL。用 Oracle 的说法,这是 Pro*C 代码,首先需要 运行 通过预编译器将嵌入的 SQL and/or PL/SQL 转换为常规 C 代码。
有关详细信息,请参阅 Oracle Pro*C/C++ documentation。
经过反复试验,我找到了解决问题的有效方法。 @Sentinel post 的回答很有用,但文档很难跟进。
我决定 post 我为成功编译包含 PL/SQL 语句的 C 代码所做的步骤。我特意编写了这些步骤来引导您从头开始完成整个过程,因为我对 Oracle 文档缺乏这种级别的解释感到非常沮丧。在研究了 Oracle 文档以及 Whosebug 上的其他一些答案之后,我不得不将所有这些步骤放在一起,更不用说一些越南语的 YouTube 视频(我不知道如何翻译)。
步骤 1
确保您的 C 代码包含正确的 include oracle 库。
#include<stdio.h>
#include<stdlib.h>
exec sql include sqlca;
exec sql begin declare section;
int cnt; //variable to be accessed by PL/SQL block
exec sql end declare section;
main() {
exec sql connect SCOTT identified by TIGER;
if(sqlca.sqlcode==0) {
// assuming no errors from the last sql statement
exec sql select count(*) into :cnt from TEST_TABLE;
// this is an example only. Replace the statement with a useful one
printf("\nNumber of rows: %d", cnt);
} else {
printf("\nError Code: %d, Message: %s", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
}
}
第 2 步
假设上述 C 代码示例保存在名为 MYTEST.C
的文件中。我们需要使用 Oracle 的预编译器将任何 SQL 块转换为常规 C.
PROC INAME=MYTEST CODE=CPP MYTEST.C NEW_TEST.PC
步骤 3
现在您将拥有一个名为 NEW_TEST.PC
的新文件,其中包含预编译的 SQL c 以及您的原始 C 代码。是时候使用本机 C 编译器编译此文件了
CXX /DEBUG=TRACE /OPTIMIZE /PREFIX=ALL /GRAN=LONG /NAME=AS_IS /FLOAT=IEEE NEW_TEST.PC
第 4 步
现在您将准备好使用 Oracle 链接器链接的目标文件
LNPROC NEW_TEST NEW_TEST CPP
第 5 步
您现在可以运行 可执行文件
RUN NEW_TEST.EXE
我熟悉 Oracle PL/SQL 和 C/C++ 语言,我可以编写从数据库中提取数据并将结果输出到 console/command/output stream/etc 的代码.
不过我对openVMS开发不熟悉。但我能够验证 CXX
编译器(内置于操作系统)在 compiling/linking 和 运行 之后工作,以下代码:
#include <stdio.h>
void main(void) {
printif("Hello World!\n");
}
现在,我尽力连接到 oracle 数据库(安装在同一台服务器上,还有许多其他 C/CP 文件写入以从数据库中提取数据,它们工作正常),但我无法编译任何试图从数据库中读取的代码。为简单起见,这里是尝试访问数据库的代码:
#include<stdio.h>
void main(void) {
int cnt = -1;
exec sql SELECT count(*) INTO :cnt FROM EMPLOYEES;
printif("Number of employees: %d", cnt);
}
当我编译它时,我得到:
%CXX-E-UNDECLARED, identifier "exec" is undefined
起初,我认为我可能在 header 处缺少一个图书馆,所以我尝试了以下方法:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#ifdef PC
#include <fcntl.h>
#else
#include <unixio.h>
#include <file.h>
#endif
#include <ctype.h>
但是上述库的 none 导致编译器停止抱怨 exec sql
语句。
我查阅了有关在 openVMS 上编写 C 程序的 Oracle 技术文档,发现了一些示例代码,其中包括 <sqlca.h>
和其他类似 <sql_sqlda.h>
的示例代码,但其中 none 解决了我的问题。
我猜,可能是之前编写的其他 c 文件以某种方式用处理 EXEC SQL 语句的特殊命令编译(通过在编译时动态附加依赖库??? )
所以我的问题是:我该怎么做才能编译我的代码并获取某个 table 中的记录数?
您的 C 代码中嵌入了 SQL。用 Oracle 的说法,这是 Pro*C 代码,首先需要 运行 通过预编译器将嵌入的 SQL and/or PL/SQL 转换为常规 C 代码。
有关详细信息,请参阅 Oracle Pro*C/C++ documentation。
经过反复试验,我找到了解决问题的有效方法。 @Sentinel post 的回答很有用,但文档很难跟进。
我决定 post 我为成功编译包含 PL/SQL 语句的 C 代码所做的步骤。我特意编写了这些步骤来引导您从头开始完成整个过程,因为我对 Oracle 文档缺乏这种级别的解释感到非常沮丧。在研究了 Oracle 文档以及 Whosebug 上的其他一些答案之后,我不得不将所有这些步骤放在一起,更不用说一些越南语的 YouTube 视频(我不知道如何翻译)。
步骤 1
确保您的 C 代码包含正确的 include oracle 库。
#include<stdio.h>
#include<stdlib.h>
exec sql include sqlca;
exec sql begin declare section;
int cnt; //variable to be accessed by PL/SQL block
exec sql end declare section;
main() {
exec sql connect SCOTT identified by TIGER;
if(sqlca.sqlcode==0) {
// assuming no errors from the last sql statement
exec sql select count(*) into :cnt from TEST_TABLE;
// this is an example only. Replace the statement with a useful one
printf("\nNumber of rows: %d", cnt);
} else {
printf("\nError Code: %d, Message: %s", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);
}
}
第 2 步
假设上述 C 代码示例保存在名为 MYTEST.C
的文件中。我们需要使用 Oracle 的预编译器将任何 SQL 块转换为常规 C.
PROC INAME=MYTEST CODE=CPP MYTEST.C NEW_TEST.PC
步骤 3
现在您将拥有一个名为 NEW_TEST.PC
的新文件,其中包含预编译的 SQL c 以及您的原始 C 代码。是时候使用本机 C 编译器编译此文件了
CXX /DEBUG=TRACE /OPTIMIZE /PREFIX=ALL /GRAN=LONG /NAME=AS_IS /FLOAT=IEEE NEW_TEST.PC
第 4 步
现在您将准备好使用 Oracle 链接器链接的目标文件
LNPROC NEW_TEST NEW_TEST CPP
第 5 步
您现在可以运行 可执行文件
RUN NEW_TEST.EXE