有很多种交易,设计之初要求入同一张表。于是不同的交易统一到一套大结构中入库(这样可能会有不少交易不必写全这个结构)。结构每一项是指针,指向具体的值。
还有一个大数组column_name,每一个类型是char,值就是数据库中的列名字。
在插库的时候。就有两个问题出现:
1、要依次判断这个大结构的各个分项是否被赋值了,我本来是想用这个数组来实现的。比如这个结构变量是trans,我想用
for(i=0;i<total_column;i++) {
if( trans.column[i] != NULL )
入库
}
还有一个大数组column_name,每一个类型是char,值就是数据库中的列名字。
在插库的时候。就有两个问题出现:
1、要依次判断这个大结构的各个分项是否被赋值了,我本来是想用这个数组来实现的。比如这个结构变量是trans,我想用
for(i=0;i<total_column;i++) {
if( trans.column[i] != NULL )
入库
}
2、拼一句统一的insert 语句插库。因为全统一到一个大结构了,我不知道某一个交易究竟有几个字段,就要写动态的sqlstr。
insert into table(colunm[i]) values(:column[i]).其中列名和值名都是可以用strcat等写出来的。但是当
EXEC SQL PREPARE qid from :sqlstr
EXEC SQL EXECUTE qid
的时候,变异就报错了,说是没有绑定变量。
我不知道怎么样去动态榜定需要的变量。因为个是我都不知道,是要靠前面第一个问题来完成的。
你想体验轻松挣钱获得每月上万甚至更多收入的感觉吗?
这一切皆有可能,机遇在眼前,可别错过!
点击这个网址,你将在未来的日子里好运不断!如有病毒,天诛地灭!!!
http://www.kkf8.com/mlm?mid=你的注册名。(如打不开,请将此地址复制到地址栏再连接)
你可同时获得三种挣钱方式!!!万元月薪,你也能轻松合法地做到!
机会我给你,不会我教你,我们共同收获财富。
知识改变命运,网络改变人生!!!
对每一条记录,都会有很多字段没有用
所有的数据都在一个表中,如何建索引都是个问题
随着数据量的增加,会给查询带来不小的麻烦如果可能的话,更改设计,将不同的分类信息做成不同的表来处理二、[转]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好些,至少可以看出绑定了多少个变量。
我的环境是AIX+oracle.程序是.pc,要预编译的。触发器或存储过程我们是不用的。
这方面有没有思路?绑定变量select和insert的占位方式不知道一不一样?
---------------
这只是sql块,和触发器和存储过程没什么关系,和你的环境也没有关系,在你程序里用就行了。
就是说在插入变量的时候,我自己都不知道究竟要有几个字段入表。而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的分项。这里我不知道应该怎么处理。先帮我看看这个问题。