c& sql - 表不接受insert语句

时间:2014-11-26 22:41:51

标签: sql c db2

所以我现在已经对这段代码感到头疼了一段时间,我无法弄清楚为什么我的代码不会让我这么做。

这是在我的创建声明中:

create table account (  number int  not null generated always as identity (start with 1000, increment by 1, no cache), 
        id int      not null, 
        balance int     not null check (balance >=0), 
        type char (1)   not null check (type in ('C', 'S')), 
        status char (1) not null check (status in ('A', 'I')),
        primary key (number));    

这就是我的sqc文件中的内容。

printf ("Please enter your ID: ");
  scanf("%d", &vid);
  printf ("Please enter your Account type (C for checking or S for Saving): ");
  scanf("%s", &vtype);
  printf ("Please enter your initial balance: ");
  scanf("%d", &vbalance);

  exec sql insert into account (id, balance, type, status)
  values (:vid, :vbalance, :vtype, 'A');

  exec sql declare accountid cursor for
  select number
  from account
  group by number order by number desc fetch first 1 rows only;

  exec sql open accountid;

  exec sql fetch accountid into :vnumber;

  exec sql close accountid;

  printf("Your new account ID: %d", vnumber);

由于某种原因,它总是返回0,而不是1000:

Please enter your ID: 100
Please enter your Account type (C for checking or S for Saving): C
Please enter your initial balance: 100
Your new account ID: 0

之后我还检查了该表,看它是否为空,就好像命令从未经过或拒绝插入命令一样。

编辑:所以我认为我的主要问题是试图插入我的'状态','A'。我试图将它放入变量并将该变量发送到表中,但它将该变量返回为null。由于我的表不需要空值,因此它拒绝了它,因此没有创建事务。

我手动插入带有测试值的P2.Account并且它工作正常,输出正确的值。所以任何人都可以指导我一个可以帮助我在插入中输入'A'而不改为null的源代码吗?这可能是我唯一的问题。

1 个答案:

答案 0 :(得分:0)

在数据库中启动事务时,可以选择回滚(撤消)更改或提交(保存)更改。此功能有多种原因。第一种是在插入多条记录时遇到错误;回滚将撤消所有内容,以便您可以修复错误并重新启动插入。

在插入后,您似乎错过了语句:

EXEC SQL COMMIT;

我对Oracle和Pro-C更熟悉,但IBM在DB2站点上有一个很好的小教程:

http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.apdv.sample.doc/doc/c/s-tbsel-sqc.html