Proc开发中sql用法

建立.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”,所以在定义字符变量时要多加一位。)

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

 

 

 

 

 


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值