****包 ****
包由两部分组成:规范部分和包体部分
包格式
create or replace package 包名
is
procedure 存储过程名[(形参 in|out|in out 数据类型,...)];
function 函数名(形参 数据类型) return 返回值类型;
end [包名];
包的实现(包体):
create or replace package body 包名
is
procedure 存储过程名[(形参 in|out|in out 数据类型,...)]
is
begin
实现代码;
end;
create or replace package hh
is
procedure h1(c in number);
procedure h2;
end;
create or replace package body hh
is
procedure h1(c in number)
is
begin
dbms_output.put_line(c);
end;
procedure h2
is
begin
dbms_output.put_line('啥也没有');
end;
end;
begin
hh.h1(5);
hh.h2();
end;
****存储过程调试功能 ****
--调试权限开启,system登录开启
GRANT debug any procedure, debug connect session TO scott;
--对着调试的存储过程右键选中添加调试信息
--对着调试的存储过程右键测试,点击启动调试器,单步进入,进到内容后可以添加变量查看,可以看输出
作业
/*写一个包,包含两个存储过程。分别实现菱形和三角形输出过程,三角形可以根据输入
行数来输出。*/
create or replace package bao
is
procedure leng(n in out number);
procedure triangle(m in out number);
end;
create or replace package body bao
is
procedure leng(n in out number)
is
begin
for i in 1 .. n
loop
for j in 1 .. n+i-1
loop
if j<n-i+1 then
dbms_output.put(' ');
else
dbms_output.put('*');
end if;
end loop;
dbms_output.put_line(null);
end loop;
for k in 1 .. n-1
loop
for m in 1 .. 2*n-k-1
loop
if m<k+1 then
dbms_output.put(' ');
else
dbms_output.put('*');
end if;
end loop;
dbms_output.put_line(null);
end loop;
end;
procedure triangle(m in out number)
is
begin
for i in 1 .. m
loop
for j in 1 .. m+i-1
loop
if j<m-i+1 then
dbms_output.put(' ');
else
dbms_output.put('*');
end if;
end loop;
dbms_output.put_line(null);
end loop;
end;
end;
declare
m number(5):=&输入行数;
begin
bao.leng(m);
bao.triangle(m);
end;
select * from income;
阶段复习作业
--1、编写一个函数,根据物品id,和折扣,返回物品的单个利润
create or replace function lirun(idd in varchar2,idiscount in number)
return number
is
lr income.allprice%type;
begin
select sum(allprice-inprice*sl) into lr
from income left join goods on goodsid=g_id
where goodsid=idd and discount=idiscount;
if lr is null then
dbms_output.put_line('没有这个物品id!');
end if;
return lr;
end;
select lirun(6,0.8) from dual;--验证
select lirun(18,0.1) from dual;
--2、编写一个程序段,打印出当前的所有库存,相同的物品只展示一行,打印名称和数量
create or replace procedure allstock
is
type names is record(
g_name goods.g_name%type,
sl stock.sl%type
);
a names;
yb sys_refcursor;
begin
open yb for
select g_name,sum(sl)
from goods left join stock on g_id=goodsid
group by g_name;
fetch yb into a;
while yb%found
loop
dbms_output.put_line(a.g_name||' '||a.sl);
fetch yb into a;
end loop;
close yb;
end;
call allstock();--验证
--3、编写一个存储过程,实现进货过程,接受一个物品id,物品数量
create sequence onid
start with 3
increment by 1;
create or replace procedure ingoods(idd in varchar2,sll in number)
is
begin
update stock set sl=sl+sll,intime=sysdate,productime=sysdate where goodsid=idd;
insert into oncome(o_id,goodsid,stockid,sl,allprice)
select inid.nextval,goodsid,s_id,sll,inprice*sll
from stock left join goods on goodsid=g_id
where goodsid=idd;
end;
call ingoods(9,100);--验证
select * from oncome;
select * from stock;
commit;
--4、编写一个存储过程,遍历删除库存中过期的物品,(更新为零操作)
create or replace procedure ClearStock
is
begin
update (select * from stock left join goods on goods.g_id=stock.goodsid)
set sl=0 where productime+qualitydate<sysdate;
end;
call ClearStock();--验证
select * from stock;
rollback;
--5、(拓展)编写一个存储过程,实现出货过程,接受物品id,物品数量,折扣
create sequence inid
start with 4
increment by 1;
create or replace procedure SellGoods(idd in income.goodsid%type,ssl in income.sl%type,idiscount in income.discount%type)
is
begin
update stock set sl=sl-ssl where goodsid=idd;
insert into income(i_id,goodsid,stockid,sl,discount,allprice)
select inid.nextval,goodsid,s_id,ssl,idiscount,outprice*ssl
from stock left join goods on goodsid=g_id
where goodsid=idd;
end;
call SellGoods(18,10,0.9);--验证
select * from income;
/*额外要求
1.判断有没有要输入的物品
2.判断库存有没有足够的数量
3.再根据生产日期,先卖出生产日期早的产品,再卖出生产日期晚的产品,
4.如果卖出物品后库存为零,则删除库存记录(更新为零操作),如果库存大于零,则
更改库存数量
5.在出货记录表添加相应记录*/
****Git课程目录 ****
●Git介绍
●工具介绍
●版本控制分类
●Git软件安装及配置
●创建本地仓库和git基本概念
●Git服务器和远程仓库操作
*什*****么是版本控制 ****
版本控制(Version Control)是一种记录一个或多个文件内容变化,以便将来查阅特定版本修订情况的系统。它可以帮助开发者和团队协同工作,追踪和管理代码(或其他任何类型文件)的变更。版本控制系统通常具有以下功能:
记录追踪项目文件和管理变更,清晰溯源历史记录
实现跨区域多人协同开发
代码备份和恢复
协同代码审查,确保代码质量
支持分支处理和合并回主代码库,保持项目稳定性
提高开发效率
保障代码安全
支持项目管理
****没有版本控制的缺点 ****
没有进行版本控制或者版本控制本身缺乏正确的流程管理,在软件开发过程中将会引入很多问题,如软件代码的一致性、软件内容的冗余、软件过程的事物性、软件开发过程中的并发性、软件源代码的安全性,以及软件的整合等问题
****常见的版本工具 ****
Git:它是一个开源的分布式版本控制系统,可以高效、快速地处理从小型到大型项目的版本管理,与许多流行的开发工具和平台都有良好的集成
SVN(Subversion):SVN 是一个集中式的版本控制系统,旨在替代 CVS。它采用客户端/服务器架构,通过中心仓库来管理代码版本,支持跨平台使用
CVS(Concurrent Versions System):集中式版本控制系统:所有版本信息都存储在中央仓库中,用户通过客户端软件与中央仓库进行交互。适用适合小型项目和个人开发者。
VSS(Micorosoft Visual SourceSafe):微软早期推出的一款管理工具,VSS采用中央仓库来管理代码版本,用户通过客户端软件与中央仓库进行交互。目前已被其他主流控制工具替代
TFS(Team Foundation Server): TFS是一个全面的团队协作平台,它提供了版本控制、项目管理、工作项跟踪、自动化构建和测试管理等一系列功能。与Visual Studio紧密集成,提供了无缝的协作体验。
版本控制产品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision
Control System)、 Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、
Mercurial、SourceGear Vault),现在影响力大且使用广泛的是Git与SVN。
****版本控制分类 ****
1. 本地版本控制
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS。
2. 集中版本控制
所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS
3. 分布式版本控制
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
****Git与SVN主要区别 ****
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到 新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
Git是目前世界上 先进的分布式版本控制系统。
****Git软件安装及配置 ****
****Windows系统安装Git ****
- Git官网地址:https://git-scm.com/
傻瓜式一直下一步,选择路径的时候尽量不要默认C盘
安装好后右键如果出现这两个东西,那么Git就安装成功了
****安装Tortoise Git(乌龟Git可视化操作工具) ****
1.打开IP网址:https://download.tortoisegit.org/tgit/
先安装工具包,一直下一步,最后一个安装窗口记得勾上(run frst start )选项。
小乌龟工具包安装完后,接着安装小乌龟语言汉化包,也是无脑下一步,最后一步的时候勾选使用语言提示按钮,最后点击完成即可。
下一步更新切换成中文
填写用户名和邮箱地址(这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中)
选择服务端open ssh
完成安装后在桌面右键可以看到下图的三个功能选择按钮即可
****注:如果在安装过程中没有打开配置向导(语言选择)可在安装好小乌龟后右 ****
键--TortoiseGit(T)--常规设置--重新运行首次启动选项--语言(选择中文)
恭喜你完成软件的安装啦!!!
****创建本地仓库和git基本概念 ****
右键--git bash here--命令窗口(一般在对应工作区右键打开)
git init:创建本地仓库
仓库区和工作区
①.git文件夹为仓库区:类似于一个数据存储着每一次提交的变化
②.git所在目录称为工作区,我们在这里创建项目和其他文件
git.add<文件名>:把文件添加到暂存区,暂存区存储将要被提交的文件变化
commit -m “创建a.txt文件”:提交暂存区存储变化并生成一个新的版本
git status:查看命令状态
git log:查看日志
git的工作流程一般是这样的:
在工作目录中添加、修改文件;
将需要进行版本管理的文件放入暂存区域;
将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)以上是使用git bash here命令窗口的操作,我们再用小乌龟做一遍这些操作
- 创建仓库:打开对应文件夹,右键在这里创建版本库
- 创建好后在工作区新建一个TXT文档,右键git提交,提交窗口注意填写日志文件并勾选所要提交的文件。(修改同上操作)
3.小乌龟查看日志:右键TortoiseGit(T)--查看日志,可以看到对应操作和版本号
****Git服务器和远程仓库操作 ****
使用服务器的好处可多人协同开发。
可以自己搭建git服务器(目前阶段暂不需要操作)
免费服务器:
①github.com 全球最大开源项目托管平台 https://github.com/
②Gitee.com 国内知名开源项目托管平台 码云 https://gitee.com
注册gitee账号,并创建仓库
创建仓库:登陆账号--右上角(+)新建仓库--私有(上传代码需要账号密码)--选择语言--.gitignore忽略文件--开源许可证选MIT--readme初始化 这样就创建好一个仓库了
*从服务器克隆仓***库 ****
1. https方式
①第一次克隆需要我们输入账号密码
操作流程如下:
打开码云平台,进入仓库界面,点击克隆/下载按钮
在弹出界面复制https的ip地址
找到需要克隆仓库的文件夹位置,右键打开git bash here在弹出的对话窗口输入
2.命令git clone 粘贴复制的https地址(复制方法:shift+insert键,也可以右键选择paste)克隆成功后的界面显示如下图:
2. ssh方式克隆
ssh是一种开源非对称加密通信协议
②ssh是一种协议,有开源实现也有商业实现,git默认使用开源实现的openssh
③ssh通信需要一对密钥(公和私一对),私钥留在自己电脑上,公钥给其他的电脑
④使用gitgui生成密钥,并把公钥放在服务器上
⑤安装完第一次克隆会请求是否允许使用ssh,需要我们输入一个”yes”
生成密钥右键打开git gui here---help--show ssh key,在弹出窗口点击 generate key, 在弹出的密码窗口点击OK,生成的密钥文件地址为下图 ’~’波浪线代表用户目录下
注:公钥和私钥都可直接删除
把公钥放到服务器上,复制公钥
打开码云服务器,点击账号头像,在下拉框点击设置,左侧下拉找到ssh公钥点击
粘贴完后需要再弹出框中输入密码,密码就是登陆网站设置的密码,公钥的作用一是加密通讯,二是做用户的权限认证
在文件夹下右键打开小乌龟或者bash here都行,这里以小乌龟为例,打开git克隆URL地址会自动获取在服务器上复制的ssh的地址,确定就完成了克隆了
****推送和拉取 ****
目的是把自己本地的代码更新到服务器仓库,或拉取由其他同学更新后服务器仓库的代码到自己本地库,做到代码实时更新和共享
git add:添加(使用小乌龟勾选add即可)
Commit:提交。提交值提交到本地仓库,需要推送才会把变化更新到服务器仓库
Push:推送。若服务器版本比我们新,也就是你拉取代码后有同事跟新了代码,你没有再拉取就推送是不成功的,需要再重新拉取一次再推送。
Pull:拉取。拉取时确保工作区整洁
以下是小乌龟演示新建后修改文件后在工作区文件夹下右键提交
新建后修改文件后在工作区文件夹下右键提交
在弹出框填写日志信息,一般文件会自动勾选,若未自动勾选则手动勾选对应文件,点提交按钮
提交成功后在弹出的提示窗口点推送,推送弹出窗口直接确定即可
注意:在平台上的邮箱设置要设置成公开的,不然推送不成功
推送后在服务器上可以看到更新后的信息了,以此推送完成
拉取(模拟一个同事B克隆仓库,在B的仓库区新建一个新的文本,此时A想要看B的代码则需要B将文本推送到服务器,A做拉取动作,对齐服务器),在工作区右键点击TortoiseGit(T)--拉取
****七、分支创建与合并 ****
master是仓库的主分支,为了避免开发过程中程序员之间相互影响,我们一般选择创建一个新的分支来开发新功能
创建分支
切换分支
合并分支
创建分支:在.git文件夹下右键点击TortoiseGit(T)--创建分支---点击“确定”即可切换分支:在.git文件夹下右键点击TortoiseGit(T)--切换/检出--弹出框分支按钮处下拉选择需要更换的分支即可
外一种切换分支方法:在.git文件夹下右键点击TortoiseGit(T)--版本分支图
以上完成分支切换尝试切换完分支后在dev分支上对任意一个文件做个修改保存提交,然后看看版本分支图
合并分支:先在dev分支上对文件做出修改,切换到主分支,在.git文件目录右键点击TortoiseGit(T)--选择“合并分支”在弹出框选择需要合并的分支点击“确定”即可
完成后请查看版本分支图
****冲突 ****
- 冲突如何产生的
①两个分支修改了同一个文件,合并的时候会发生冲突(和我们用的事务死锁一个原理)
- 如何解决冲突
①协商修改冲突位置,并重新提交
- 如何减少冲突
①先pull再修改
②确保自己正在修改的文件是最新版本的
③各自开发各自的模块,如果要修改公共文件,最好选确认有没有人正在修改
④不要擅自修改同事的代码
模拟冲突:先切换master主分支修改一个文件并提交,后在dev分支上修改同一个文件并提交,再将dev合并到master主分支上,会出现一个报错。
解决冲突:先点击确定,打开修改文件,重新修改后保持,重新提交
右键报错文件(标红文件)在选项框中点击“解决”,确定提交即可。
也可用小乌龟自带解决方法处理
合并报错点击“解决”:
右键报错文件(标红文件)在选项框中点击“解决”,确定提交即可
修改完后重新提交即可
****忽略 ****
- 有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计
文件等在主目录下建立".gitignore"文件
-- # :为注释
-- **.txt:忽略所有.txt结尾得文件(忽略文件) **
**-- !lib.txt:lib.txt除外 **
**-- /temp:仅忽略项目根目录下的TODO文件,不包括其他目录temp **
**-- build/:忽略build/目录下的所有文件 **
-- doc/.txt:忽略doc/notes.txt但不包括doc/server/arch.txt
-- !*.文件名:反忽略文件
-- !A/:反忽略文件夹
操作步骤:先删掉 .git目录下的.gitignore文件夹,在工作区右键点击git bash here 打开对话框,输入touch .gitignore 即可重建一个忽略文件
不忽略文件夹则在不需要忽略的文件目录下右键点击git bash here 打开对话框,输入touch .gitignore 即可重建一个忽略文件,修改里面的内容为!*.文件类型,反忽略。
空文件夹会被自动忽略
****版本回退 ****
在版本日志界面选择一个节点,使用重置(reset)命令:先了解一下以下概念
Head:当前分支的引用指针(重置就是移动head这个指针)
Index: 就是缓存区(add的,也可以说是将要提交的文件快照)
工作区:.git所在的目录以及子目录
方法:右键点击选择查看日志,在对应节点信息上右键选择“重置master到此版本” 在弹出框中选择硬重置(重置所有改变)点击确定即可。但是这样重置就不能反悔。
想要反悔得添加标签,在需要被标注的的版本阶点右键点击“在此版本上创建标签” ,然后就可以放心大胆的重置你想重置的版本了,取消标签点击删除”标签D”
****子模块 ****
子模块就是一个git仓库包含其他git仓库,当我们需要把其他开源项目作为本项目的一个库,并可以随时拉取更新的时候或者我们的项目需要分模块独立开发项目的时候可以使用子模块,克隆子模块的仓库,需要选择递归。
添加子模块:右键TortoiseGit(T)--”添加子模块”--再推送就可以在服务器上的到一个新的子模块仓库了
****子Issue和request ****
issue:讨论(类似论坛)
Request:拉取请求,为项目贡献代码,请求项目管理者合并自己的代码
创建issue
request先设置成开源如下图
开源代码后,登陆一个其他账号,通过fork拉取项目
然后就可以开始协调工作了
教学视频点击查看:
https://www.bilibili.com/video/BV1h24y1e7jv?
p=11&vd_source=b22442ae2dca586b2b9556d16dc51c75
如何将文档图片快速上传到CSDN:
先将word转PDF,从PDF复制粘贴即可。
版权归原作者 工科小石头 所有, 如有侵权,请联系我们删除。