• 【数据库系统】数据库编程


    嵌入式SQL的处理过程:

    嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的设计语言为主语言。

    当主语言为C语言时,语法格式为:

    EXEC SQL

    嵌入式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      --此时不执行select

    ②打开游标:

            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

  • 相关阅读:
    Mojave
    【推荐】中国光伏大会资料合集25篇
    【SA8295P 源码分析 (二)】109 - QNX 如何实现显示图片到 Screen 显示屏上
    OpenHarmony教程—语言基础类库
    废水含镍如何处理
    【读书笔记】【More Effective C++】异常(Exceptions)
    Django调用SECRET_KEY对数据进行加密
    7 Series Devices Memory Interface Solution - Memory Controller Block
    Web3.0时代的全新合作模式:DAO
    idea2018修改大小写提示(敏感)信息
  • 原文地址:https://blog.csdn.net/m0_52043808/article/details/127849074