CXX-E-UNDECLARED,标识符" exec"未定义

时间:2016-11-29 07:58:35

标签: oracle openvms

我熟悉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语句(通过在编译时动态附加依赖库???)

所以我的问题是:如何编译我的代码并获取某个表中的记录数?

2 个答案:

答案 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视频(我不知道如何翻译)。

第1步

确保您的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);
    }
 }

第2步

假设上面的C代码示例保存在名为MYTEST.C的文件中。我们需要使用Oracle的预编译器将任何SQL块转换为regualr 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 Linker

链接目标文件
LNPROC NEW_TEST NEW_TEST CPP

第5步

您现在可以运行可执行文件

RUN NEW_TEST.EXE