【问题标题】:How can we remove SQL error code 1405 in C我们如何删除 C 中的 SQL 错误代码 1405
【发布时间】:2012-09-18 07:23:47
【问题描述】:

我用 C 编写了以下代码:

EXEC SQL begin declare section;
    int     A;
    char    B[5];
    int     C;
    int     D;
    dtime_t E;
    char    F[13];
EXEC SQL END DECLARE SECTION;
char E_dt[16];
D=0;
memset(F, 0, sizeof(F));          

EXEC SQL declare log3 cursor for select A, B, C, D, E, F from tbl WHERE C=123;
if(sqlca.sqlcode) 
{
    return;
}

EXEC SQL fetch log3
    into
     :A, :B, :C, :D, :E, :F, 
if(sqlca.sqlcode) 
{
    if (sqlca.sqlcode != DB_NORECORDS) 
    {
        return;
    }
    break;
}

当我们运行这段代码时,表 tbl 中 F 的值为 Null。它给出了错误代码 1405。我尝试使用 memset 函数将其默认值设置为 0。但它不起作用。还有一件事我可以一次获取超过 90 个字段,当我试图这样做时,它在编译时给了我总线错误。提前谢谢请帮帮我。

【问题讨论】:

标签: sql c oracle error-handling


【解决方案1】:

您有 2 个基本选项:

  1. 使用指示器来记录 NULL 的存在。当您希望在出现 NULL 时采取特定操作时,您可能应该使用此选项。
  2. 使用 NVL 函数将检索到的 NULL 转换为另一个值,例如零或空白。这是最简单的解决方案。

编辑:

log3 游标的 NVL 示例。选择您想要的任何默认值。在示例中,我使用 ' ' 表示字符字段,使用 0 表示数字字段,使用 Jan 1st year 1 表示日期。

EXEC SQL declare log3 cursor for select NVL(A, 0), 
                                        NVL(B, ' '), 
                                        NVL(C, 0), 
                                        NVL(D, 0), 
                                        NVL(E, to_date('0001', 'YYYY')),
                                        NVL(F, ' ')
                                   from tbl 
                                  WHERE C=123;

【讨论】:

  • 谢谢 Klas,我用过 NVL,但也没有用,你能给我举个 NVL 函数的例子吗?我正在获取超过 90 个字段,所以第一个字段对我来说非常长。
  • 使用问题中的 log3 光标添加了带有示例 NVL:s 的编辑。
  • 谢谢 Klas,它对我有用,可能是我之前做错了什么。
  • 谁能给我一个例子,说明如何将 NVL 函数用于 long 和 double 数据类型。
  • NVL 是 SQL,对 SQL 数据类型执行。 c 中的 longdouble 都映射到 SQL NUMBER 数据类型,因此这两种情况下的 NVL 都是 NVL(G, 0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 2017-12-09
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多