嵌入式SQL的处理过程:
嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的设计语言为主语言。
当主语言为C语言时,语法格式为:
EXEC SQL
将SQL嵌入到高级语言中混合编程,SQL语句负责操纵数据库,高级语言负责控制逻辑流程。
嵌入式SQL与源程序工作单元之间的通信主要包括:
(1)向主语言传递SQL语句的执行状态,使主语言能够根据此信息控制程序流程
主要用SQL通信区实现
(2)主语言向SQL提供参数,主要用主变量来实现
(3)将SQL语句查询数据库的结果交主语言处理,主要用主变量和游标实现
SQL通信区SQLCA:
是一个数据结构,SQL语句执行后,系统反馈给应用程序信息(描述系统当前工作状态和运行环境),将信息送到SQL通信区。应用程序从SQL通信区中取出这些状态信息,据此决定接下来执行的语句。
主变量:
嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据,该变量称为主变量。
主变量分为输入(到SQL)主变量和输出(到应用程序)主变量。
指示变量:是一个整型变量,用来指示所指主变量的值或条件,一个主变量可以附带一个指示变量。可以判断主变量是否为空。
SQL面向集合,一条SQL语句可以产生或处理多条记录,而主语言是面向记录的,一组主变量一次只能存放一条记录。所以引入了游标的概念。
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。用户可通过游标逐一获取记录并赋给主变量,交给主语句进一步处理。
游标的使用:
①说明游标:
exec sql declare <游标名> cursor for
②打开游标:
exe sql open<游标名>
③推进游标指针并获取当前记录
exec sql fetch <游标名> into <主变量>[<指示变量>][<主变量>[指示变量]]…
④关闭游标
exec sql close<游标名>
CURRENT形式的update和delete语句要用子句:
where current of <游标名>
当游标定义中的SELECT语句有union或order by子句,或者该select 语句相当于定义了一个不可更新的视图时,不能使用current形式的update和delete子句。
存储过程是由过程化SQL语句书写的过程,这个过程经过编译和优化后存储在数据库服务器中,使用时只要调用即可。
创建存储过程:
create (or replace可以不写) procedure 过程名(参数1,参数2,...) as <过程化SQL>;
利用存储过程实现从账户1转指定数额的款项到账户2中。
账户关系表Account(Accountnum,Total)
create (or replace) procedure
transfer(inAccount int,outAccount int,amount float)
as declare
totalDepositOut Float;
totalDepositIn Float;
inAccountnum Int;
BEGIN
select Total into totalDepositOut from Account
where accountnum=outAccount;
if totalDepositOut is null then
rollback;//回滚事务
return;
endif
if totalDepositOut
rollback; //回滚事务
return;
endif
select Accountnum into inAccountnum from Account
where accountnum=inAccount;
if inAccount is null then
rollback;
return;
endif
update Account set total=total-amount
where accountnum=outAccout;
update Account set total=total+amount
where accountnum=inAccount;
commit; 提交事务
end
执行存储过程:
call procedure 过程名(参数1,参数2)
重命名:
alter procedure 过程名1 rename to 过程名2;
删除存储过程:
drop procedure 过程名()
(*)存储过程中使用游标:
create (or replace) function me() returns void
as
declare mcs cursor for
select title,year,name from movies,movieExec where producerC=cert;
declare mt char(20);
my int;
en char(12);
begin
open mcs
loop
fetch mcs into mt,my,en;
if not found then
exit;
end if;
insert into M values(mt,my,en);
end loop;
close mcs;
end
函数必须指定返回类型
create or replace function 函数名(参数1,参数2,...) returns 类型 as <过程化SQL块>
函数执行语句格式:
call 函数名(参数1,参数2,...)
函数重命名:
alter function 过程名1 rename to 过程名2
重新编译:
alter function 过程名 complie;
(背)习题:将maker作为输入参数,求该制造商生成的Laptop内存容量(ram)的平均值总和
create or replace function meanram(in m char(1),out mean float,out sumran int)
as $$
declare count_ram int;
declare getram int;
begin
mean:=0.0;
sumram:=0;
count_ram:=0;
for getram select ram from product,laptop
where product.model=laptop.model and maker=m;
loop
count_ram:=count_ram+1;
sumram:=sumram+getram;
end loop;
mean:=sumram/count_ram;
end;
$$language plpgsql;
creat or replace function Pubmprice (in pub_lisher char(20),out mean float)
as $$
declare sum float;
declare getprice int;
declare count int;
begin
sum:=0;
mean:=0;
count:=0;
for getprice in select price from Book where publisher=pub_lisher
loop
sum:=sum+getprice;
count:=count+1;
end loop;
mean:=sum/count;
end;
$$language plpgsql