我熟悉Oracle PL / SQL和C / C ++语言,我可以编写从数据库中提取数据并将结果输出到控制台/命令/输出流/等的代码。
但是,我不熟悉openVMS开发。但是我能够在编译/链接并运行以下代码后验证CXX
编译器(内置于操作系统)是否有效:
#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
起初,我认为我可能在标题处缺少一个库,所以我尝试了以下内容:
#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>
但上述库中没有一个导致编译器停止抱怨exec sql
语句。
我访问了关于在openVMS上编写C程序的Oracle技术文档,并找到了一些示例代码,其中包含<sqlca.h>
和其他类似<sql_sqlda.h>
的代码,但没有一个代码解决了我的问题。
我猜,可能是之前编写的其他c文件以某种方式使用特殊命令编译,该命令负责处理EXEC SQL语句(通过在编译时动态附加依赖库???)
所以我的问题是:如何编译我的代码并获取某个表中的记录数?
答案 0 :(得分:1)
你的C代码中有嵌入式SQL。在Oracle的说法中,这是Pro * C代码,首先需要通过预编译器运行,以将嵌入式SQL和/或PL / SQL转换为常规C代码。
有关详细信息,请参阅Oracle Pro*C/C++ documentation。
答案 1 :(得分:1)
经过这么多试验和错误,我找到了解决问题的有效方法。 @Sentinel发布的答案很有用,但文档很难贯彻执行。
我决定发布我为成功编译包含PL / SQL语句的C代码所采取的步骤。我故意写下这些步骤,从头开始引导您完成整个过程,因为我对Oracle文档缺乏这种级别的解释感到非常沮丧。在研究了Oracle文档之后,我必须将所有这些步骤放在一起,以及StackOverflow上的其他一些答案,更不用说一些越南语的YouTube视频(我不知道如何翻译)。
确保您的C代码包含正确的包含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);
}
}
假设上面的C代码示例保存在名为MYTEST.C
的文件中。我们需要使用Oracle的预编译器将任何SQL块转换为regualr C。
PROC INAME=MYTEST CODE=CPP MYTEST.C NEW_TEST.PC
现在,您将拥有一个名为NEW_TEST.PC
的新文件,其中包含预编译的SQL c以及原始C代码。是时候使用本机C编译器
CXX /DEBUG=TRACE /OPTIMIZE /PREFIX=ALL /GRAN=LONG /NAME=AS_IS /FLOAT=IEEE NEW_TEST.PC
现在,您将准备好使用Oracle Linker
链接目标文件LNPROC NEW_TEST NEW_TEST CPP
您现在可以运行可执行文件
RUN NEW_TEST.EXE