建立.pc文件,
l 连接数据库:
EXEC SQL connect :变量名(类型可自定义,数据为要连接的数据库的名字);
或EXEC SQL connect :”ta4/ta”;(数据库)
l 断开数据库:
EXEC SQL commitwork release; //提交并断开数据库。
EXEC SQL commit;//提交;
(目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。)
create tableteacher(ID NUMBER(5),NAME VARCHAR(30),AGE NUMBER(5),ADDRESS VARCHAR(100));
Create tableTSTUDENT(
ID NUMBER(5),
NAME VARCHAR2(30),
AGE NUMBER(5),
ADDRESS VARCHAR2(100)
);
Int id;
Char name[31];
Int age;
Charaddress[101];
(注:由于varchar2类型会在数据后面加一个“/0”,所以在定义字符变量时要多加一位。)
l CRUD
EXEC SQL selectID,NAME,AGE,ADDRESS INTO :id, :name, :age, :address FROM TSTUDENT WHERE ID = 1;(查询一条数据的赋值方法)
EXEC SQL insertinto TSTUDENT (ID,NAME,AGE,ADDRESS ) values( :id, :name, :age, :address)
EXEC SQLupdate TSTUDENT set AGE = :age , setADDRESS =:address Where ID =1;
EXEC SQL deletefrom TSTUDENT where ID =1;
l .pc文件头声明:
#include<sqlca.h>
#include<oraca.h>
l 查询出多条数据时的处理方法:
定义游标:EXEC SQL declare 变量名 cursorfor sql语句
EXEC SQL open 变量名; 开启游标
循环{
EXEC SQL fetch 变量名 into :变量,:变量。。。。;
If(sqlca.sqlcode ==DATA_NOTFIND){ /*(DATA_NOTFIND的值为1403)*/
Break; 跳出循环。
}
}
EXEC SQL close 变量名; 关闭游标
EXEC SQL wheneversqlerror do sqlerr(); //do 后面时自定义的函数
或者使用go to:
EXEC SQL wheneversqlerror goto SqlErrProc;
但是需要在每个sql语句后面加标志:
SqlErrProc:
OrcErrProc();
Return -2;
例如:
。。。
EXEC SQL wheneversqlerror goto SqlErrProc;
。。。
Int funvtion1(…){
//逻辑
Return 0;
SqlErrProc:
OrcErrProc();
Return -2;
}
(并且需要在这个标志前加return 0;让程序正常返回,否则程序会进入到OrcErrProc()函数,然而这个函数是只有出错时才使用的。)
例如:
。。。
EXEC SQL wheneversqlerror do sqlerr();
。。。
void sqlerr(){
printf(“sqlcode:%d;desc:%s\n ”,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc ) ;// Sqlca.sqlcode表示一个编码,我妈们可以根据这个编码在网上找到错误信息。
EXEC SQL wheneversqlerror continue;
EXEC SQL rollbackwork release;
EXEC SQL wheneversqlerror do sqlerr();
exit(-1);
}
编译.pc文件:
Linux命令下:
l proc MODE=ORACLE PARSE=FULL CHAR_MAP=STRING SQLCHECK=SEMANTICS ORACA=YES LINES=YES DBMS=V8 UNSAFE_NULL=YES LTYPE=NONE USERID=ta5/ta5@ora11g INAME=pro.pc ONAME=pro.c
l gcc -o pro pro.c -I $ORACLE_HOME/precomp/public -L $ORACLE_HOME/lib-l clntsh
l ./pro
//插入
//最好定义一个宏变量,使id和f1数量一致。n表示控制插入多少数据。
int id[100] = {0};//如果两者数组大小不一样那插入数据的数量会按小的来
int f1[100][51];
EXEC SQL for :n insert into table1(id,f1)values(:id,:f1);
l 游标加数组:(即while游标,内部for循环数组)
#define ANUM 50
nFetch=ANUM;//定义了一个宏,
DealRows=0;
while(nFetch == ANUM){//判断取出的数据是否和规定批量要取出的大小一致。
。。。
nFetch = sqlca.sqlerrd[2] – DealRows;
DealRows = sqlca.sqlerrd[2];
WriteLog(0,”Fetched nFetch%d[%d][%d] %.31f 秒\n”,nFetch,sqlca.sqlerrd[2],ANUM,DiffTime(time));
If(nFetch==0){
Break;
}
Rows=nfetch;
For(int i=0;i<rows;i++){
//这是进行内部读取的数组进行小循环。
}
。。。
}
<注:while后的判断条件与if的判断题条件都是为了避免多循环一次,当fetch=0时从if跳出循环,当最后fetch不为0,并且不满足ANUM时从while跳出循环,提高性能避免多循环一次空数据>
全局变量的定义:
在头文件中声明:extern char name;
在c文件中定义:char name;
desc 表名(描述表结构)
检查点:
trequest(申请表),Tfundinfo(基金信息表),tfarezone(取费率),tfundday(每天的净值)
1. 申请基金代码不在基金信息表中,则确认为失败。
2. 状态不为N也为失败。
3. 申请金额小于配置金额则失败。
4. 检查成功的要算费用:先看金额区间,乘以费率即可。
l 份额=(金额-费用)/当天净值
1.不管成功还是失败都要插入到tconfirm(确认表)中,(申请编号,确认日期【申请日期+1】,确认金额(申请金额), 状态(1成功、2失败),原因)
成功的数据要记录在tsharedetail表中。
Tstaticshares(静态份额表):汇总。放着用户的份额信息,对于确认成功的申请,将确认的份额更新在这个表中,如果表中原来有此人的份额信息则在原基础上加上这次的份额,如果不存在数据则新城插入一个数据。
定义数组大小2.
Pl/s ql块
EXEC SQL EXECUTE
Declare
…
Begin
…
END
END-EXEC
调用存储过程
EXEC SQL EXECUTE
Begin
Raise-salary(:emp_id,:increase);
END
END-EXEC