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

article/2025/9/20 15:09:11

嵌入式SQL的处理过程:

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

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

EXEC SQL <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语句>      --此时不执行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<amount then // 如果账户存款不足

           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


http://chatgpt.dhexx.cn/article/QEm0MIrr.shtml

相关文章

数据库应用(mysql)数据库编程

第1关&#xff1a;创建存储过程1 任务描述 本关任务&#xff1a; 1.新建一个没有参数的存储过程p1&#xff0c;显示product表中所有数据。 2.调用p1。 USE petstore; create procedure p1() #新建一个没有参数的存储过程 select * from product; call p1(); …

java数据库编程

java数据库编程 刚入门学习java数据库的编程&#xff0c;看了一部分的java核心技术卷2的内容&#xff0c;结合在blibli上看了javaweb的视频&#xff0c;先写一个入门级的数据库文章。 jdbc是由java定制的一套操作数据库的API&#xff08;应用程序编程接口&#xff09;。通过…

MySQL数据库编程(C++)介绍

本文主要介绍基于 C 编程语言&#xff0c;实现 MySQL 数据库编程的相关知识。 1 概述 本文利用 MySQL 接口实现基于 C 编程语言的 MySQL 数据库编程。 官网中对于 MySQL 的介绍如下&#xff1a; MySQL is a C wrapper for MySQL’s C API. It is built around the same prin…

数据库编程——简单教程

一、实验目的 1、掌握存储过程的概念、优点、特点及用途&#xff1b; 2、掌握创建、执行、修改和删除存储过程的方法。 二、实验内容 &#xff08;一&#xff09;附加上次实验所创建的数据库“db_Library”&#xff0c;并回顾该库的数据表信息。 &#xff08;二&#xff09;练习…

数据库基础编程

连接mysql在黑窗口 mysql -u root -p #登录MySQL SQL语句分类 数据库操作 创建数据库 create database [if not exists] db_name; 1.character set :指定数据库采用的字符集&#xff0c;如果不指定字符集&#xff0c;默认utf8 2&#xff0c;collate&#xff1a;指定数据库…

数据库编程

数据库编程 T-SQL编程基础知识 标识符 标识符分类 常规标识符&#xff08;严格遵守标识符格式规则&#xff09; 界定标识符&#xff08;引号”或方括号[]&#xff09;标识符格式规则 字母或_、、&#xff03;开头的字母数字或_、、$序列 不与保留字相同 长度小于128 不符合规…

数据库编程之ODBC编程

ODBC优点 移植性好 能同时访问不同的数据库 共享多个数据资源 ODBC概述 ODBC产生的原因 由于不同的数据库管理系统的存在&#xff0c;在某个关系数据库管理系统下编写的应用程序就不能在另一个关系数据库管理系统下运行 许多应用程序需要共享多个部门的数据资源&#xff0c…

第8章 数据库编程

文章目录 ❖第一节 T-SQL编程基础标识符注释语句表达式SET、SELECT区别 流程控制语句选择结构❖IF ELSECASE语句搜索式CASE语句 循环结构等待语句返回语句 系统函数标量函数日期和时间函数字符串函数 数据类型转换函数 ❖第二节 游标&#xff08;重点&#xff09;1. 声明游标2.…

teredo实现ipv4公网环境下接入ipv6

teredo实现ipv4公网环境下接入ipv6 系统&#xff1a;macOS High Sierra 10.13.3 测试成功 软件下载 下载安装Miredo http://www.deepdarc.com/miredo-osx-prerelease2.pkg.zip 项目github地址&#xff1a;https://github.com/darconeous/miredo-osx下载安装tuntaposx http…

Tornado简介

Tornado龙卷风是一个开源的网络服务器框架&#xff0c;它是基于社交聚合网站FriendFeed的实时信息服务开发而来的 Tornado是使用Python编写的Web服务器兼Web应用框架与主流Web服务器框架不同的是&#xff0c;Tornado是异步非阻塞式服务器&#xff0c;得益于非阻塞式和对epoll模…

【小白教程】win10系统如何开启ipv6

Teredo 是一种网络协议&#xff0c;用于在客户端和服务器之间建立安全通信&#xff0c;并且在使用网络地址转换 (NAT) 的路由器后增强设备之间的连接。 #####以下代码均在cmd窗口运行###### 一、设置Teredo 服务器 1、设置Teredo 服务器 netsh interface teredo set state …

Teredo Tunnel Adapter: Error Code 10

Teredo Tunneling 该设备无法启动 错误代码 ErrCode:10 解决方法 前文&#xff1a; Win7 系统&#xff0c;打算开启IPV6&#xff0c;本地连接的网络 ip6 驱动是异常的&#xff0c;先重新安装了网卡驱动。 过程&#xff1a; 几次尝试之后&#xff0c;还是无法启动&#xff0c;…

地平线不能多人联机解决方法

玩地平线4时可能会出现无法连接多人网络问题&#xff0c;在Xbox网络中出现Teredo不合格的问题。 解决方案&#xff1a; 按WinR输入gpedit.msc打开组策略编辑器&#xff0c;依次选择管理模块、网络、TCPIP设置、IPv6转换技术。双击设置6to4状态&#xff0c;点已启用&#xff0c…

微软的teredo服务器,win10系统通过teredo连接ipv6的操作方法

win10系统通过teredo连接ipv6的操作方法? 很多win10用户在使用电脑的时候&#xff0c;会发现win10系统通过teredo连接ipv6的的现象&#xff0c;根据小编的调查并不是所有的朋友都知道win10系统通过teredo连接ipv6的的问题怎么解决&#xff0c;不会的朋友也不用担心&#xff0c…

TCP/IP卷一:55---UDP之(UDP与IPv6、Teredo)

前一篇文章&#xff08;https://blog.csdn.net/qq_41453285/article/details/103984794&#xff09;对UDP和UDP数据报、UDP校验和做了简单的介绍&#xff0c;本片文章介绍一些UDP与IPv6有关的知识 一、IPv6下的UDP 考虑到简单性&#xff0c;在对IPv6而非IPv4进行操作时&#…

miredo - Teredo IPv6 tunneling for Unix

世界 IPv6 日&#xff1a;2011年6月8日 Test your IPv6&#xff1a;http://test-ipv6.com 安装miredo sudo apt-get install miredo 编辑miredo配置文件&#xff0c;加入teredo 的公共服务器地址&#xff0c;如ServerAddress teredo-debian.remlab.net sudo gedit /etc…

teredo 未能解析服务器名,Win10系统Xboxlive显示Teredo无法进行限定怎么解决

有的朋友会在windows10电脑上用Xbox live游玩游戏&#xff0c;但是碰到Xbox live设置显示Teredo无法进行限定&#xff0c;这时候我们该怎么办呢&#xff0c;下面由小编给大家介绍如何解决win10系统Xbox live显示Teredo无法进行限定。 具体步骤如下&#xff1a; 1.按下键盘上的&…

报PING:传输失败。常见故障.connect:network is unreachable“的解决方案-IPv6无法ssh连接的解决方案。

vultr当前2.5美金的vps只有IPv6&#xff0c;很多使用者无法正常使用ssh连接等&#xff0c;报PING&#xff1a;传输失败。常见故障。connect&#xff1a;network is unreachable 很多使用者不知所措&#xff0c;笔者也是一脸懵逼&#xff0c;经过一番研究之后&#xff0c;发现了…

微软的teredo服务器,win10系统通过teredo连接ipv6的具体教程

有关win10系统通过teredo连接ipv6的操作方法想必大家有所耳闻。但是能够对win10系统通过teredo连接ipv6进行实际操作的人却不多。其实解决win10系统通过teredo连接ipv6的问题也不是难事&#xff0c;小编这里提示两点&#xff1a;1、在“开始”里输入“cmd”&#xff0c;右击&am…

Win11地平线4 Xbox live无法登录?或者地平线4无法使用在线模式?尝试一波!!!

全是抄袭&#xff0c;只做整理&#xff0c;希望帮到大家&#xff0c;啥也不懂&#xff01;但是&#xff01;我就是这样弄好的 侵权 联系 我 就下架&#xff0c;但是只是想让大家可以解决问题 以下是我参照的文章&#xff1a; XBOX NAT类型:Teredo不合格解决方案 - 知乎 (zhi…