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