li-heng 2024-05-09 08:30 采纳率: 81.5%
浏览 17
已结题

pro*C预编译“闪回查询”报错SCN不能识别

在使用proC预编译c代码的时候,使用proC语法创建了一个游标,

(1)当sql中没有使用闪回查询时,此时可以正常编译

img

(2)但是当游标中的sql出现闪回查询,带有SCN字符的时候,就报错

img

错误截图:

img


有没有哪个朋友知道这个情况的,是不是少了什么头文件

  • 写回答

13条回答 默认 最新

  • 专家-司宇[在线] 2024-05-09 08:31
    关注

    引自免费微信小程序:皆我百晓生

    遇到这个问题,通常是因为Pro*C/C++预编译器并不直接支持Oracle的"AS OF SCN"这样的闪回查询语法。为了解决这个问题,你需要采用动态SQL的方式来执行包含闪回查询的SQL语句。下面是如何修改你的代码以适应这种情况的一个示例:

    首先,确保你的环境中已经正确设置了OCI库路径,并且你的Pro*C环境是配置好的。

    修改代码示例

    原静态SQL部分

    // 静态SQL方式不适用闪回查询
    EXEC SQL DECLARE emp_cursor CURSOR FOR
    SELECT empno, job
    FROM emp;
    

    修改为动态SQL方式

    #include <stdio.h>
    #include <stdlib.h>
    #include <sqlca.h> // 确保包含了必要的Pro*C头文件
    
    // 动态SQL部分
    EXEC SQL BEGIN DECLARE SECTION;
    int P_scn; // 假设P_scn已经赋值
    char query_str[256]; // 用于构造SQL查询字符串
    EXEC SQL END DECLARE SECTION;
    
    // 构造闪回查询的SQL语句
    sprintf(query_str, "SELECT empno, job FROM emp AS OF SCN %d", P_scn);
    
    // 准备并执行动态SQL
    EXEC SQL PREPARE dyn_stmt FROM :query_str;
    EXEC SQL DECLARE emp_cursor CURSOR FOR :dyn_stmt;
    EXEC SQL OPEN emp_cursor;
    
    // ...处理结果集的逻辑...
    
    EXEC SQL CLOSE emp_cursor;
    

    注意事项

    1. 动态SQL: 使用EXEC SQL PREPARE来准备一个包含用户输入或变量的SQL语句,然后通过:query_str这样的占位符引用它。
    2. 安全性: 动态SQL需要注意SQL注入的风险,虽然在这个特定场景下可能不是问题,但通常应该使用参数绑定来进一步确保安全。
    3. 错误处理: 在执行动态SQL后,检查sqlca.sqlcode来确定是否有错误发生,并做相应处理。
    4. 资源管理: 确保在操作完成后关闭游标,释放相关的资源。

    环境配置

    确保你的编译命令行中包含了正确的Instant Client路径和库文件,以及正确的预编译选项。如果你的环境中缺少必要的头文件或库文件,这也会导致编译错误,但根据你的描述,问题主要在于语法不被直接支持而非缺失头文件。

    通过上述修改,你应该能够绕过预编译器对特定闪回查询语法的限制,并成功执行含有闪回查询的SQL语句。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

问题事件

  • 系统已结题 5月17日
  • 已采纳回答 5月9日
  • 修改了问题 5月9日
  • 修改了问题 5月9日
  • 展开全部

悬赏问题

  • ¥15 怎么改成循环输入删除(语言-c语言)
  • ¥15 安卓C读取/dev/fastpipe屏幕像素数据
  • ¥15 pyqt5tools安装失败
  • ¥15 mmdetection
  • ¥15 nginx代理报502的错误
  • ¥100 当AWR1843发送完设置的固定帧后,如何使其再发送第一次的帧
  • ¥15 图示五个参数的模型校正是用什么方法做出来的。如何建立其他模型
  • ¥100 描述一下元器件的基本功能,pcba板的基本原理
  • ¥15 STM32无法向设备写入固件
  • ¥15 使用ESP8266连接阿里云出现问题