有很多种交易,设计之初要求入同一张表。于是不同的交易统一到一套大结构中入库(这样可能会有不少交易不必写全这个结构)。结构每一项是指针,指向具体的值。
还有一个大数组column_name,每一个类型是char,值就是数据库中的列名字。
在插库的时候。就有两个问题出现:
1、要依次判断这个大结构的各个分项是否被赋值了,我本来是想用这个数组来实现的。比如这个结构变量是trans,我想用
for(i=0;i<total_column;i++) {
if( trans.column[i] != NULL )
     入库
}

解决方案 »

  1.   

    但是说结构没有这一项。显然是这样子的。这下我晕了,不知道怎么办了。
    2、拼一句统一的insert 语句插库。因为全统一到一个大结构了,我不知道某一个交易究竟有几个字段,就要写动态的sqlstr。
    insert into table(colunm[i]) values(:column[i]).其中列名和值名都是可以用strcat等写出来的。但是当
    EXEC SQL PREPARE qid from :sqlstr
    EXEC SQL EXECUTE qid
    的时候,变异就报错了,说是没有绑定变量。
    我不知道怎么样去动态榜定需要的变量。因为个是我都不知道,是要靠前面第一个问题来完成的。
      

  2.   

    朋友,你想拥有一份轻松而又收入丰厚的职业吗?
    你想体验轻松挣钱获得每月上万甚至更多收入的感觉吗?
    这一切皆有可能,机遇在眼前,可别错过!
    点击这个网址,你将在未来的日子里好运不断!如有病毒,天诛地灭!!!
    http://www.kkf8.com/mlm?mid=你的注册名。(如打不开,请将此地址复制到地址栏再连接)
    你可同时获得三种挣钱方式!!!万元月薪,你也能轻松合法地做到!
    机会我给你,不会我教你,我们共同收获财富。
    知识改变命运,网络改变人生!!!
      

  3.   

    一、正如楼主所说,这样的表设计并不合理
    对每一条记录,都会有很多字段没有用
    所有的数据都在一个表中,如何建索引都是个问题
    随着数据量的增加,会给查询带来不小的麻烦如果可能的话,更改设计,将不同的分类信息做成不同的表来处理二、[转]Oracle 绑定变量的用法 
    1.让Oracle自己绑定变量
    set serverout on;
    set timing on;
    declare
    l_sql varchar2(2000);
    l_count number;
    l_param1 varchar2(100);
    l_param2 varchar2(100);
    begin
    l_param1:='a';
    l_param2:='b';
    select count(*) into l_count from table1 where col_1=l_param1 and col_2=l_param2; 
    dbms_output.put_line(l_count);
    end;
    /
    在上面的情况,Oracle会自己绑定变量,即,如果参数保存在一个数组中,select语句放在一个循环中,
    select 语句只会编译一次。
    像这样
    for i in 1..3
    loop
    select count(*) into l_count from table1 where col_1=l_param1 and col_2=l_param2 and col_3=i; 
    dbms_output.put_line(l_count);
    end loop
    2.不绑定变量
    set serverout on;
    set timing on;
    declare
    l_sql varchar2(2000);
    l_count number;
    l_param1 varchar2(100);
    l_param2 varchar2(100);
    begin
    l_param1:='a';
    l_param2:='b';
    l_sql:='select count(*) into :x from table1 where col_1='||l_param1||' and col_2='||l_param2;
    Execute Immediate l_sql into l_count; 
    dbms_output.put_line(l_count);
    end;
    /
    3.动态绑定变量
    set serverout on;
    set timing on;
    declare
    l_sql varchar2(2000);
    l_count number;
    l_param1 varchar2(100);
    l_param2 varchar2(100);
    begin
    l_param1:='a';
    l_param2:='b';
    l_sql:='select count(*) into :x from table1 where col_1=:y and col_2=:z ';
    Execute Immediate l_sql into l_count using l_param1,l_param2; 
    dbms_output.put_line(l_count);
    end;

    :x,:y,:z相当于占位符,即
    1.用:p1,:p2,:p3是一样的。
    2.用:x,:x,:x也是一样的
    需要的绑定变量按顺序排在执行语句后面就可以了,into的除外。
    不过还是用p1,p2好些,至少可以看出绑定了多少个变量。 
      

  4.   

    楼上的,先谢谢。
    我的环境是AIX+oracle.程序是.pc,要预编译的。触发器或存储过程我们是不用的。
    这方面有没有思路?绑定变量select和insert的占位方式不知道一不一样?
      

  5.   

    我的环境是AIX+oracle.程序是.pc,要预编译的。触发器或存储过程我们是不用的。
    ---------------
    这只是sql块,和触发器和存储过程没什么关系,和你的环境也没有关系,在你程序里用就行了。
      

  6.   

    谢谢大家!但是可不可以一个问题一个问题解决呢?
    就是说在插入变量的时候,我自己都不知道究竟要有几个字段入表。而3种基础的动态sql,一种用倒sqlda结构的高级动态sql都需要明确的指出究竟要绑定几个变量。我在问题里面说的第一个不明白的地方。首先要判断这笔交易的各个字段是否有值,由于这个表字段很多,我不想一个一个判断,所以要遍历一遍的话,原则上我是可以我可以这样做:逐个分项一个一个判断
    main_tran.systrace != NULL?  memcpy( sqlstr, ....., strlen(.....))
    main_tran.trandate != NULL?  memcpy( sqlstr + strlen(...), ......, strlen(....))
    main_tran.trantime != NULL? .....
    ..........
    我觉得怪累的。就想出用一个全局char型的二维数组来参照比较。数组array_name.array_name[0]是systrace,array_name[1]是trandate, array_name[2]是trantime .....array_name[i]是.....。得到了将我要入表的那个结构main_tran。应该有一个办法可以实现。
    我可以想到的是循环:
    main_tran.array_name[i] != NULL
    就告诉我array_name不是main_tran的分项。这里我不知道应该怎么处理。先帮我看看这个问题。