ssh调用存储过程,console提示错误:该语句没有返回结果集。

本文介绍了解决在存储过程中使用游标导致的问题的方法。通过在存储过程的as后添加SET NOCOUNT ON语句,可以有效避免调用时出现错误。此外还提供了一种替代方案,即在存储过程中不使用游标。

今天在存储过程中添加了一个游标,程序中调用存储过程时提示如图:

解决办法:存储过程as后添加语句 SET NOCOUNT ON 后,问题解决。(另一种方法:存储过程中不使用游标。)

实例:



**代码概述** 该段代码为条件编译的 C 语言片段,用于根据连接类型(是否为串口控制台)决定 `RCC_TASK_Readline_ssh` 的执行方式:在串口控制台场景下循环执行,在非串口或非控制台会话中仅执行一次。 --- **代码解析** 原始代码结构如下: ```c #ifdef __RCC_SERIAL_CONSOLE__ /* if we are serial */ /* if this is console session, run continually */ if (kRCC_CONN_CONSOLE == MCONN_GetConnType(pCliEnv)) { while (!cliDone()) /* Loop until shutdown */ #endif RCC_TASK_Readline_ssh(pCliEnv); #ifdef __RCC_SERIAL_CONSOLE__ } else { RCC_TASK_Readline_ssh(pCliEnv); } #endif ``` ### 存在的问题分析: 1. **条件编译与花括号不匹配(语法风险)** `#ifdef` 将 `if` 和 `while` 的左花括号 `{` 包裹,但右花括号 `}` 在另一个 `#ifdef` 块中闭合。这可能导致: - 若未定义 `__RCC_SERIAL_CONSOLE__`,则生成代码为: ```c RCC_TASK_Readline_ssh(pCliEnv); ``` 这是合法的。 - 若定义了该宏,则展开为完整 `if-else` 结构,语法正确。 ✅ **结论**:从预处理角度看,若宏定义存在且配对使用,语法上可接受,但结构脆弱、易出错。 2. **逻辑冗余与可读性差** 在 `if` 分支中循环调用 `RCC_TASK_Readline_ssh`,而在 `else` 分支仍调用一次,意味着无论哪种情况都要执行至少一次。更清晰写法应为: ```c RCC_TASK_Readline_ssh(pCliEnv); // 共有的一次调用 #ifdef __RCC_SERIAL_CONSOLE__ if (kRCC_CONN_CONSOLE == MCONN_GetConnType(pCliEnv)) { while (!cliDone()) { RCC_TASK_Readline_ssh(pCliEnv); } } #endif ``` 3. **实际行为歧义** 当 `__RCC_SERIAL_CONSOLE__` 被定义且连接类型为 `kRCC_CONN_CONSOLE` 时,进入无限循环;否则只执行一次。但当前写法将“单次执行”也放入 `else` 分支,暗示 `RCC_TASK_Readline_ssh` 不应在 `if` 分支外执行——然而 `while` 内部已包含循环执行,无需额外单次调用。 实际上: - `while` 循环前已经执行了一次 `RCC_TASK_Readline_ssh`(因为它是 `while` 外部独立语句)。 - 所以即使 `cliDone()` 初始为真,也会至少执行两次?❌ ❗ 关键问题: 由于 `RCC_TASK_Readline_ssh(pCliEnv);` 出现在 `#endif` 前且不在 `while` 内部,其位置处于 `while` 上方一层作用域,因此在 `if` 成立时: ```c while (!cliDone()) RCC_TASK_Readline_ssh(pCliEnv); // 只有这一句在循环体内 ``` 即循环体仅为函数调用一句,而它前面并没有执行一次。但注意:这一句并未被包含在 `{}` 中,所以语法上属于 `while` 正文。 然而原代码中这行调用位于 `#endif` 之前、`while` 下方无缩进,容易误解为在循环外执行一次。**真实执行流程是:** - 如果是串口控制台且连接类型为 console → 进入 `while` 循环反复执行。 - 否则(包括串口非console或其他接口)→ 执行一次。 ✅ 实现意图可能是正确的:控制台持续运行,其他会话只读一行。 4. **改进建议(提高可读性和安全性)** 推荐重写为: ```c #ifdef __RCC_SERIAL_CONSOLE__ if (kRCC_CONN_CONSOLE == MCONN_GetConnType(pCliEnv)) { /* Console sessions run in a loop until shutdown */ while (!cliDone()) { RCC_TASK_Readline_ssh(pCliEnv); } } else { /* One-shot for non-console serial sessions */ RCC_TASK_Readline_ssh(pCliEnv); } #else /* For non-serial environments: run once */ RCC_TASK_Readline_ssh(pCliEnv); #endif ``` 这样逻辑清晰,避免跨条件编译块的括号嵌套问题。 --- **知识点**: - **条件编译与作用域管理**:`#ifdef` 影响代码结构完整性,需确保 `{}` 配对,防止因宏开关导致语法错误。 - **循环控制逻辑设计**:应明确循环入口与执行次数,避免因语句位置引发多执行或少执行问题。 - **代码可维护性原则**:将复杂条件逻辑封装清晰,减少嵌套交叉,提升可读性与健壮性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值