存储过程学习总结

存储过程学习总结
存储过程学习总结

存储过程

一、概述

存储过程(Stored Procedure)应用在大型数据库系统中,是SQL语句和流程控制语句的集合,经编译后存储在数据库系统中,用户通过指定存储过程的名字并给出参数(如果带有参数的话)来执行,类似高级语言中的函数。在创建时编译一次,以后执行时运行很快。

存储过程的种类:

1系统存储过程,以sp_开头,用来进行系统的各项设定,取得信息及相关管理工作, 如sp_help就是取得指定对象的相关信息。

2本地存储过程,由用户创建的存储过程,一般所说的存储过程就是指本地存储过程。

3扩展存储过程,以XP_开头,用户可以使用外部程序语言编写的存储过程,用来调用操作系统提供的功能。

存储过程的优点:

1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

3.存储过程可以重复使用,可减少数据库开发人员的工作量。

4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

存储过程的缺点:

1. 调试麻烦。

2. 移植问题,与具体数据库相关,需要考虑移植问题。在梅安森项目中需要考虑从SQL Server到PostgreSQL移植工作。

3. 如果在应用程序中大量使用存储过程时,到程序交付给客户的时候,需要考虑系统的相关问题,维护代价大。

二、存储过程的常用格式:

--创建存储过程,

create proc or procedure sp_name

@[参数名][类型],@[参数名][类型][output]

[with]{recompile|encryption}

as

begin

sql_statement

end

--调用存储过程

exec sp_name[参数名]

--删除存储过程

drop procedure sp_name

解释:

output:表示此参数是可传回的

with {recompile|encryption}

recompile:表示每次执行此存储过程时都重新编译一次

encryption:所创建的存储过程的内容会被加密

三、各种常见数据库对存储过程的支持

大多数常用数据都支持存储过程,但是各类数据库都有自己的过程语言或者语法格式,也就是访问不同类型的数据库,需要考虑移植问题。下面简单描述了各种常见数据库中使用存储过程的语法格式。

MySQL:

1.创建存储过程,CREATE PROCEDURE simpleproc (OUT param1 INT),参数类型(in、out、

inout)

2.调用存储过程,CALL simpleproc

SQL Server: SQL Server数据库提供的过程语言是Transact-SQL,简称T-SQL。

1.创建语法

create proc | procedure pro_name

[{@参数数据类型} [=默认值] [output],

{@参数数据类型} [=默认值] [output],

....

]

[ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

as

SQL_statements

2.调用、执行, exec pro_name

Oracle: Oracle数据库提供工程语言PL/SQL来构建存储过程。

1.创建存储过程语法:

CREATE [OR REPLACE] PROCEDURE procedure_name

([arg1 [ IN | OUT | IN OUT ]] type1 [DEFAULT value1],

[arg2 [ IN | OUT | IN OUT ]] type2 [DEFAULT value1]],

......

[argn [ IN | OUT | IN OUT ]] typen [DEFAULT valuen])

[ AUTHID DEFINER | CURRENT_USER ]

{ IS | AS }

<声明部分>

BEGIN

<执行部分>

EXCEPTION

<可选的异常错误处理程序>

END procedure_name;

2.调用存储过程,EXECUTE | EXEC procedure_name(param1,param2);

PostgreSQL: PostgreSQL数据库提供多种过程语言,PL/pgSQL, PL/Tcl, PL/Perl, PL/Python,下面是PL/gpSQL过程语言的一个示例。

--创建表

create table test(id int,name text);

--创建存储过程

create function ins_data_test1(int,text) returns bool as'

declare

id alias for $1;

name alias for $2;

begin

insert into test values(id,name);

return true;

end;

'language 'plpgsql'

--执行存储过程

select ins_data_test1(1,'shengch');

四、PostgreSQL的存储过程及示例

4.1 介绍

在Oracle数据库中,存储过程和函数统称为PL/SQL子程序,他们的唯一区别是函数总向调用者返回数据,而过程则不返回数据,过程的参数可以有三种模式(IN、OUT、IN OUT),而函数只有一种(IN)。

而在PostgreSQL数据库中不区分函数和存储过程,或者说它把存储过程当做函数来处理,因此在用PL/gpSQL创建的存储过程中,必须返回数据,类型可以为VOID。

4.2 示例

需求:

给出如下条件进行批处理编排

- 开始日期时间

- 重复间隔(分钟)

- 重复次数

要求在档期内重复安排节目播出, 比如: 2003.01.01 08:00 开始每隔240分钟

播出一次, 一共播出100次, 或者用户自行设定的其他时间。

数据库表格(CO_SCHEDULE)

------------------------------

N_PROGID INT

DT_STARTTIME TIMESTAMP

DT_ENDTIME TIMESTAMP

--创建表

create table co_schedule(n_progid int,dt_starttime timestamp,dt_endtime timestamp);

--创建函数(存储过程)

create function add_program_time(int4,timestamp,int4,int4,int4) returns bool as '

declare

prog_id alias for $1;

duration_min alias for $3;

period_min alias for $4;

repeat_times alias for $5;

i int;

starttime timestamp;

ins_starttime timestamp;

ins_endtime timestamp;

begin

starttime :=$2;

i := 0;

while i

ins_starttime := starttime;

ins_endtime := timestamp_pl_interval(ins_starttime, CAST(duration_min || ''mins'' AS interval));

starttime := timestamp_pl_interval(ins_starttime, CAST(period_min || ''mins'' AS interval));

insert into co_schedule values(prog_id,ins_starttime,ins_endtime);

i := i+1;

end loop;

if i

return false;

else

return true;

end if;

end;

'language 'plpgsql';

--执行存储过程

select add_program_time(1,'2002-10-20 0:0:0','5','120','5');

五、PL/pgSQL概述

PL/pgSQL 是PostgreSQL 数据库系统的一个可加载的过程语言。PL/pgSQL 的设计目标是创建一种可加载的过程语言,可以

?用于创建函数和触发器过程

?为SQL 语言增加控制结构

?执行复杂的计算

?继承所有用户定义类型、函数、操作符

?定义为被服务器信任的语言

?容易使用

具体的语法规则请参看PostgreSQL的用户手册。

oracle统计分析信息拷贝介绍

数据库统计分析信息拷贝介绍 1.数据库统计分析简介 统计分析主要包括产生表及索引的统计信息。表的统计信息主要包括表的行数,每行的平均长度(字节),空闲块,统计时间等信息;索引的统计信息主要包括行数、层数、叶块数、统计时间等信息。另外ORACLE还可以统计列及数据不对称信息。 ORACLE执行成本分析时首先取出所应用表及索引的统计数据进行分析,其中数据行数是一个重要的参数,因为ORACLE在分析表大小时行数为主要参数,如果进行两个表联合时,ORACLE会通过分析表的大小,决定应用小表进行全表查询,而大表执行联合查询,这种性能明显高于先大表进行全表扫描。索引的统计信息对分析也产生比较大的影响,如ORACLE 通过统计可以分析产生多个索引的优先级及索引的实用性来确定最优的索引策略。ORACLE 还可以统计列及数据对称信息以产生更精确的分析。 dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划。 2.存储过程解析 2.1DBMS_STATS.GATHER_TABLE_STATS介绍 DBMS_STATS.GATHER_TABLE_STATS功能为:统计表、列、索引的统计信息。DBMS_STATS.GATHER_TABLE_STATS的语法如下: DBMS_STATS.GATHER_TABLE_STATS ( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2, estimate_percent NUMBER, block_sample BOOLEAN, method_opt VARCHAR2,

存储过程

用了两年Oracle还没写过存储过程,真是十分惭愧,从今天开始学习Oracle存储过程,完全零起点,争取每日一篇学习笔记,可能开始认识的不全面甚至有错误,但坚持下来一定会有收获。 1. 建立一个存储过程 create or replace PROCEDURE firstPro IS BEGIN DBMS_OUTPUT.PUT_LINE('Hello World!'); END; 其中IS关键字替换为AS关键字结果不会出现任何变化,大多认为他们是等同的,但也有一种说法解释为:一般PACKAGE 或者单独的FUNCTION, PROCEDURE 都用AS,PACKAGE 中的FUNCTION, PROCEDURE 用IS。 DBMS_OUTPUT.PUT_LINE('Hello World!'); 是一个输出语句。 2. 执行存储过程 Oracle返回结果需要使用包,那么存储过程似乎只能在数据库中执行或被其他调用,编程语言似乎并不能直接调用存储过程返回数据,是否能执行他有待研究。那么首先在数库中执行上面的存储过程。 BEGIN FirstPro();//注意有括号 END; 运行后输出Hello World。 3. 下面写一个稍复杂的存储过程,他定义了变量,进行了运算,输出一个count操作所用的时间。 CREATE OR REPLACE procedure testtime is n_start number; n_end number; samplenum number; use_time number; begin n_start:=dbms_utility.get_time; select count(*) into samplenum from emp; n_end:=dbms_utility.get_time; use_time:= n_end - n_start; dbms_output.put_line('This statement cost '|| use_time ||' miliseconds'); end; 4. 下面试验下怎么能给存储过程赋值 CREATE OR REPLACE procedure test(num in number) is begin dbms_output.put_line('The input numer is:' || num); end ; 今天的就到这,明天将调用这个存储过程,并试验一写对表的操作。 1. 首先把昨天带参的存储过程执行一下 declare

Oracle存储过程及块编程基础经典案例

Oracle存储过程及块编程基础案例 pl/sql(procedure language/sql:过程语言)编程是oracle的精髓之所在。跑得慢: 提高应用程序的运行性能,提高效率。 1.作为存储过程处理:模块化的设计思想(分页过程,订单的过程,转账的过程。) 2.优化sql做的最简。 3.减少网络传输量:java(sql)--》oracle,调用的这个数据库不在同一个机器上,就需要网络传输,每个sql语句都要传到数据库所在的机器上去,所以执行效率就会变得慢下来。 案例1: 编写一个存储过程该过程可以向某张表添加记录。 1.建表:create table mytest(name varchar2(30),passwd varchar2(30)); 2.建过程: create or replace procedure sp_p1 is begin insert into mytest values('xxx','m123'); end; 3.调用该过程:exec 过程名 注:在一局中添加replace:表示如果有sp_prol,就替换。如何查看错误信息:show error; 调用该过程:exec 过程名;或者call 过程名。 2.编写一个存储过程该过程可以删除某表记录。 create or replace procedure sp_pro1 is begin delete from mytest where name='xxx'; end; 这里需要引入一个快的概念,块(编程):块中可以包含过程,函数,触发器,包等。 块结构:定义部分,执行部分,例外处理部分;decrear:(可选),定义部分常量,变量,游标,例外,复杂数据类型。begin(必选)执行部分即要执行的pl/sql 语句;exception:(可选)例外处理部分即处理运行的各种错误。End结束; 案例2:输出hello begin dbms_output.put_line('hello'); end;

sap存储过程

SBO中的一个极具震撼力的的流程控制功能详细分析 在我开发的项目过程中,许多客户和顾问向我提出了许许多多的功能需求。但我在分析研究了这些需求后发现许多的需求我们顾问均可以解决。尤其是流程控制方面的需求。我把这方面的一些粗浅看法整理出来,供大家分享。 一、各种顾问在项目实施过程中出现过的看是需要研发解决的需求 1、如何控制不同的销售人员只能修改自己管理的客户的数据? 2、如何控制不同的销售人员只能录入修改自己的销售订单? 3、如何给sbo的任何单据(我这里强调任何单据,包括销售订单,销售发货单、发票、采购订单、采购收货单、采购发票、财务凭证、库存转储等等)加上自己的逻辑验证控制(例如不填某一个字段不用许sbo添加到数据库) 4、如何在各种单据或主数据添加修改过程中加上自己想要的功能? 以前这些需求一般都是顾问要求研发人员来参与协同工作来解决。我们现在要讨论的就是这些问题统统不再研发,顾问可轻松搞定。当然这要求顾问要具备一些基础知识。 二、顾问要解决这些问题要具备的基础知识 1、sql的知识。我一直认为,一个ERP软件顾问高手对SQL必须的基本素质。他可以让你随心所欲从这个充满金矿的ERP数据海洋里找到你想要的金子。我认为有志于成为ERP软件顾问高手的朋友在此付出一点时间和金钱是绝对值得的!它是打开我们理解ERP软件内核的金钥匙,也是会让我们终生受益的一种技能。无论我们从事的是哪一个ERP系统的顾问工作! 2、SBO对象的概念与规则。 当然,我觉得您在读这篇杂论前要有坚持读下去的意志。尽管这好像是有点枯燥乏味。但这点乏味的知识会给您带来无穷的想象力! SBO的DI对象,针对顾问通俗点简单点说就像物料主数据、客户主数据、销售订单、采购订单等等这些SBO里的东东。他们在SBO系统里都有一个编号,就像我们都有一个名字一样用于唯一识别。例如物料主数据的编号是:4。具体清单如下: Member Value oChartOfAccounts 1 oBusinessPartners 2 oBanks 3 oItems 4 oVatGroups 5 oPriceLists 6 oSpecialPrices 7 oItemProperties 8 oUsers 12 oInvoices 13 oCreditNotes 14 oDeliveryNotes 15 oReturns 16 oOrders 17 oPurchaseInvoices 18 oPurchaseCreditNotes 19 oPurchaseDeliveryNotes 20

C#调用存储过程简单完整例子讲解

C#调用存储过程简单完整例子https://www.360docs.net/doc/dd13336353.html,/itblog/article/details/752869 创建存储过程 Create Proc dbo.存储过程名 存储过程参数 AS 执行语句 RETURN 执行存储过程 GO DECLARE @iRet INT, @PKDisp VARCHAR(20) SET @iRet = '1' Select @iRet = CASE WHEN @PKDisp = '一' THEN 1 WHEN @PKDisp = '二' THEN 2 WHEN @PKDisp = '三' THEN 3 WHEN @PKDisp = '四' THEN 4 WHEN @PKDisp = '五' THEN 5 ELSE 100 END DECLARE @i INT SET @i = 1 WHILE @i<10 BEGIN set @i=@i+1 PRINT @i END DECLARE @d INT set @d = 1 IF @d = 1 BEGIN -- 打印 PRINT '正确' END ELSE BEGIN PRINT '错误' END

CREATE PROC P_TEST @Name VARCHAR(20), @Rowcount INT OUTPUT AS BEGIN SELECT * FROM T_Customer WHERE NAME=@Name SET @Rowcount=@@ROWCOUNT END GO ---------------------------------------------------------------------------------------- --存储过程调用如下: ---------------------------------------------------------------------------------------- DECLARE @i INT EXEC P_TEST 'A',@i OUTPUT SELECT @i --结果 /* Name Address Tel ---------- ---------- -------------------- A Address Telphone (所影响的行数为 1 行) ----------- 1 (所影响的行数为 1 行) */ ---------------------------------------------------------------------------------------- --DotNet 部分(C#) --WebConfig 文件: ---------------------------------------------------------------------------------------- ......

实验一 Power Designer 入门

实验一Power Designer 入门 (实验估计时间:90分钟) 一、背景知识 PowerDesigner(http://www.sybase.com/powerdesigner)最初由Powersoft 公司开发,后来为S y b a s e 公司并购。从1 9 8 9 年到2 0 0 3 年的十几年间,PowerDesigner 经历了巨大的变化,从一个单一数据库设计工具发展为一个全面的数据库设计和应用开发的建模软件。PowerDesigner 面向数据分析、设计和实现,集成了UML(统一建模语言)和数据建模的CASE 工具。它不仅可以用于系统设计和开发的不同阶段(即系统需求分析、对象分析、对象设计以及数据库设计和程序框架设计),绘制系统的数据流程图DFD 和E-R 图,以及生成物理的建表程序、存储过程与触发器框架等,也可以满足管理、系统设计、开发等相关人员的使用。 PowerDesigner 包含4 个模型,即业务处理模型(BPM)、概念数据模型( C D M )、物理数据模型( P D M )和面向对象模型( O O M )。这4 个模型覆盖了软件开发生命周期的各个阶段。在软件开发周期中,首先进行的是需求分析,并完成系统的概要设计:系统分析员可以利用B P M 画出业务流程图,利用O O M 和C D M 设计出系统的逻辑模型:然后进行系统的详细设计,利用OOM 完成系统的设计模型,并利用PDM完成数据库的详细设计,最后,根据O OM 生成的源代码框架进入编码阶段。 1.PowerDesigner 的特性 建模工具的重点曾经完全放在数据建模这一个方面,而随着需求的不断提高,商业流程建模和UML 已经成为软件开发不可缺少的部分。从PowerDesigner 的变化,可以看出它正在努力发展成为UML 建模工具,但同时又不放弃自己的特长,即提供更好、更方便的数据建模能力。PowerDesigner 支持UML,包括新的业务处理建模能力,改善了的基于UML 的对象模型,而且可以在一个丰富的图表环境中,支持传统的和新增的建模技术。因此,对于那些需要跨平台作业和使用多种类型编码的项目,可以大大地缩短开发时间,降低复杂度。PowerDesigner 还具备一个完整的版本资料库(repository),用来存储和管理所有建模和设计过程中的信息,并将最大限度地减少其中不一致的部分,从而极大地提高了开发者的效率。 市场上有很多工具提供数据建模,包括数据仓库建模、对象建模、业务流程建模以及U M L 建模等,但这些产品都无法与将所有的功能集于一体PowerDesigner 相媲美。在努力将商业需求和IT 技术需要结合时,建模工具之间的一致性显得尤为重要。通过PowerDesigner,有可能通过一套完整的工具来集合三种建模技术—业务流程建模、数据建模和UML 建模,从而使商业和IT 部门能够更容易进行项目合作,帮助客户实施更多连贯的、成功的项目。 Power Designer 主要特性包括: 1)、业务过程建模,允许非IT 专业用户用一个简单的图示模型,进行实际业务过程的设计或建模。 2)、数据建模,利用基于可靠方法、真正的两级(概念上和物理上)关系数据库建模,设计并生成数据库模型。同时还支持数据仓库建模技术。 3)、对象建模,使用标准的UML 技术(所有U ML 图)完成设计和分析,并且利用定制的生成器,自动地生成源代码,如Java、XML、Web Services、C++、PowerBuilder、V isual Basic 和Microsoft.Net 等。 4)、企业版本库,PowerDesigner 的企业版中加入了企业级版本库,可以查阅共享工作组里所有成员的模型和信息。版本库可升级支持角色安全设置、版本控制、并具备搜索及报告能力。

《数据库与信息系统》实验4指导解析_9-10

实验四数据库操作语言SQL 一.实验目的 ?了解使用SQL中DDL语句创建数据库和表的方法 ?熟练掌握使用SQL中DML语句对数据库进行查询、插入、修改和删除等操作的方法?掌握可编程对象视图和存储过程的创建与使用方法,了解触发器的创建方法 二.实验环境及素材 ?MySQL和Navicat for MySQL ?bookstore数据库的脚本文件bookstore.sql 三.实验内容 首先创建一个bookstore数据库,执行bookstore.sql脚本文件实现表的创建及数据记录的添加。然后在bookstore数据库中完成以下题目(bookstore数据库设计说明参见10.1节)。 ①在Navicat for MySQL中,创建数据库bookstore。 ②右击数据库bookstore,选择“运行SQL文件…”,在对话框中浏览选择“bookstore.sql”文件,点击“开始”即可完成数据表定义及添加数据记录。 ③在左栏连接窗口展开数据库“bookstore”/表,右击“表”选“刷新”菜单,即可看到恢复的各数据表。 9.创建和使用存储过程。 解析:存储过程是经过编译的SQL语句的集合。用户首先创建存储过程,然后在程序中调用该存储过程执行。创建存储过程可以在Navicat for MySQL中使用向导建立,也可以使用SQL的CREATE PROCDURE语句。存储过程可以接受参数、也可将查询信息通过输出参数返回调用者。 常用存储过程的语法格式: CREATE PROCDURE 存储过程名( [形式参数列表]) SQL语句段 “形式参数列表”中多个参数之间用逗号分隔,如果没有参数,则()中为空。每个参数由输入输出类型、参数名和参数类型三部分组成,定义规则如下: [IN|OUT|INOUT 参数名类型 输入输出类型中:IN是输入参数,即把数据传递给存储过程;OUT是输出参数,即从存储过程返回值;INOUT表示输入输出,即传入也能返回值。默认为IN类型;参数名必须符合标识符规则;参数类型可以是MySQL支持的任意数据类型。 存储过程创建后,可以通过CALL语句调用执行存储过程。语法格式如下:

存储过程的概念

存储过程的概念 SQL Server提供了一种方法,它可以将一些固定的操作集中起来由SQLServer 数据库服务器来完成,以实现某个任务,这种方法就是存储过程。 存储过程是SQL语句和可选控制流语句的预编译集合,存储在数据库中,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其他强大的编程功能。 在SQL Server中存储过程分为两类:即系统提供的存储过程和用户自定义的存储过程。 可以出于任何使用SQL语句的目的来使用存储过程,它具有以下优点: 可以在单个存储过程中执行一系列SQL语句。 可以从自己的存储过程内引用其他存储过程,这可以简化一系列复杂语句。 存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句快,而且减少网络通信的负担。 安全性更高。 创建存储过程 在SQL Server中,可以使用三种方法创建存储过程: ①使用创建存储过程向导创建存储过程。 ②利用SQL Server 企业管理器创建存储过程。 ③使用Transact-SQL语句中的CREATE PROCEDURE命令创建存储过程。 下面介绍使用Transact-SQL语句中的CREATE PROCEDURE命令创建存储过程创建存储过程前,应该考虑下列几个事项: ①不能将CREATE PROCEDURE 语句与其它SQL 语句组合到单个批处理中。 ②存储过程可以嵌套使用,嵌套的最大深度不能超过32层。 ③创建存储过程的权限默认属于数据库所有者,该所有者可将此权限授予其他用户。 ④存储过程是数据库对象,其名称必须遵守标识符规则。 ⑤只能在当前数据库中创建存储过程。 ⑥一个存储过程的最大尺寸为128M。 使用CREATE PROCEDURE创建存储过程的语法形式如下: QUOTE: CREATE PROC[EDURE]procedure_name[;number][;number] [{@parameter data_type} [VARYING][=default][OUTPUT] ][,...n] WITH {RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}] [FOR REPLICATION] AS sql_statement [ ...n ] 用CREATE PROCEDURE创建存储过程的语法参数的意义如下:

DB2存储过程快速入门.

1.1 SQL过程的结构 命名规则: 1、清洗过程名称命名: PROC_业务主题_目标表(PROC_JY_KJYRLJB 交易主题的卡交易日类聚表) 2、函数名称命名: PROC_业务主题_函数名(PROC_JY_GETYWZL 交易主题取得卡业务种类函数) 3、变量命名: VAR_变量描述(VAR_YWZL 业务种类变量) 4、游标命名: CUR_游标描述(CUR_KJYB 对卡交易表进行游标处理) 语法: CREATE PROCEDURE 过程名称 (参数列表 DYNAMIC RESULT SETS 结果集数量 是否允许SQL LANGUAGE SQL BEGIN SQL 过程体

END 范例“资产负债.sql ”中 第1行:Create Procedure admin.BalanceSheetDayly定义了过程名称 参数列表为Out ProcState varchar(100 其定义SQL 过程从客户应用获取,或返回客户应用的0个或多个参数,参数列表使用逗号侵害各个参数 参数类型有三种: l IN 从客户应用检索值。其不能够在SQL 过程体中修改 l OUT 向客户应用返回值 l INOUT 从客户应用检索值,并返回值 省略了结果集数量的定义,default 为0。即表示不返回结果集。 省略了是否允许SQL 的说明。其值指出了存储过程是否会使用SQL 语句,如果使用,其类型如何: l NO SQL 不能够执行任何SQL 语句 l COTAINS SQL 可以执行不会读取SQL 数据,也不会修改SQL 数据的SQL 语句 l READS SQL DATA 可以包含不会修改SQL 数据的SQL 语句 l MODIFIES SQL DATA 可以执行任何SQL 语句,除了不能够在存储过程中支持的语句以外。

2016年10月全国自考《数据库系统原理》真题及详解

2016年10月全国自考《数据库系统原理》真题 (总分100, 考试时间90分钟) 1. 单项选择题 1. 造成数据库中的数据不一致的原因是( ) A 数据冗余 B 数据存储数量太大 C 数据相互关系复杂 D 数据库安全性差 答案:A 2. 逻辑模式/内模式映像,保证了数据库的( ) A 完整性 B 全性 C 逻辑独立性 D 物理独立性 答案:D 解析:如果数据库的内模式要修改,即数据库的物理结构有所变化,那么只要对逻辑模式/内模式映像(即"对应性")作相应的修改,可以使逻辑模式尽可能保持不变。也就是对内模式的修改尽量不影响逻辑模式,当然对于外模式和应用程序的影响更小,这样,我们称数据库达到了物理数据独立性(简称物理独立性)。 3. 数据库系统生存期中,下面不是需求分析阶段工作的是( ) A 分析用户活动,产生业务流程图 B 确定系统范围,产生系统关联图 C 可行性分析 D 分析系统数据,产生数据字典 答案:C 解析:需求分析阶段的工作主要有:(1)分析用户活动,产生业务流程图。(2)确定系统范围,产生系统关联图。 (3)分析用户活动涉及的数据,产生数据流图。(4)分析系统数据,产生数据字典。 4. 关系数据库的数据与更新必须遵循三类完整性规则,下列不是其中一项的是( ) A 实体完整性规则 B 逻辑完整性规则 C 参照完整性规则 D 用户定义的完整性规则 答案:B 5. 设关系模式R(ABCDE),F是R上成立的FD集,F={AB→C,CD→E,DE→B},则关系R的候选键是( ) A A B AB C ABD D ABE 答案:C 6. 关于模式分解,下面叙述不正确的是( ) A 模式分解能消除数据冗余和操作异常现象 B 在分解以后,所有的检索操作可以节省时间 C 在分解了的数据库中可以存储悬挂元组,存储泛关系中无法存储的信息 D 在有泛关系假设时,对数据库中关系进行自然连接时,可能产生寄生元组,即损失了信息 答案:B 解析:模式分解以后,检索操作需要做笛卡儿积或连接操作,这将付出时间代价。 7. 假设有学生表(学号,姓名;性别,班级,专业),查找英语专业的学生学号、姓名和班级,正确的关系代数表达式是( ) i.π学号,姓名,班级(σ专业='英语' (学生表))ii.σ专业='英语' (π学号,姓名,班级(学

存储过程

66:创建无参数无返回值的存储过程(存储过程的默认返回值都是int类型的,并且为0)create proc mya as select*from orders go exec mya 67:删除存储过程 Drop proc 存储过程名称,如果多个用,号进行分割。 68:创建有参数但无返回值的存储过程 create proc myb @param int= 1 as select*from orders where oid > @param go exec myb 3 69:调用以上俩个存储过程,并查看默认返回值 declare @number int set @number = 1; exec @number = mya exec @number = myb 3 print @number go 70:获取存储过程的返回值(存储过程默认的返回值都为0) declare @number int set @number = 1 exec @number = mya exec @number = myb print @number 71:创建有参数并且有返回值的存储过程,并调用存储过程,获取返回值 select*from person; go --create proc myc --@inparm int, --@outparm int output --as

--select @outparm=count(*) from person where pid>@inparm --go declare @flag int set @flag = 2 exec myc @outparm = @flag output,@inparm = 1 if(@flag>0) begin print @flag end else begin print'set is null' end go --1 调用方法: --1:不要返回值return,的俩种写法 --2:计算参数总共有多少个输出参数,有多少个输出参数,就需要有多少个变量,output不能少 --创建存储过程时,注意,sql中引用表必须在当前数据库中存在,否则调用不成功 --存储过程与use 间必须用批处理命令 go 去隔开 72:手工改变存储过程的返回值 create proc mya as select*from person return 888 go declare @flag int set @flag = 0 exec @flag = mya print @flag create proc mya as declare @flag int set @flag = 0 select @flag =count(*)from person return @flag go

MySQL存储过程简单入门

MySQL存储过程语法 1、概念 存储过程就是能完成一定操作的一组SQL语句。 2、作用 大大提高效率(存储过程本身执行速度非常快,而且,调用存储过程大大减少数据库交互次数);提高重用性。 3、使用方法 1、创建: create procedure sp_name() begin …… end 注意:可能有参数。 2、调用: call sp_name() 注意:括号不能省略。 3、删除: drop procedure sp_name 注意:没有括号,不能在一个存储过程中删除另一个存储过程,只能调用。 4、语句: 条件语句, if 条件then statement else statement end if while循环语句, [label:] while expression do statement end while [label]; loop循环语句, [label:] loop statement end loop [label];

repeat until循环语句, [label] repeat statement until expression end repeat [label]; 5、常用命令: show procedure status:显示数据库所有存储过程基本信息。 show create procedure sp_name:显示一个存储过程详细信息。 关于运算符和基本函数与Java有些区别,用时注意就行。 4、实例 1、创建: create procedure proc_name (in parameter integer) begin declare variable varchar(20); if parameter=1 then set variable='MySQL'; else set variable='PHP'; end if; insert into tb (name) values (variable); end; 注意:代码不区分大小写;存储过程之间以及存储过程与内建函数不能同名; 存储过程参数(in传入,out传出,inout可传入,修改后传出,缺省是in); 由于存储过程内部要以分号结束,需要delimiter进行更改。 2、实现: ⑴、mysql –u用户名–p用户密码 ⑵、delimiter //(将结束符号“;”改成“//”,避免与存储过程冲突) ⑶、use 数据库名 ⑷、……(创建存储过程) ⑸、call proc_name(5)//(调用存储过程) -------------------------------------------- call proc_name(@para)//(对应存储过程定义中out的输出) select @para// ⑹、show procedure status//与show create procedure proc_name// 3、程序代码调用:(out型的部分代码) try{ //调取out型的存储过程P(计算记录总数) stmt = conn.prepareCall("{call p(?)}"); //读取所有OUT型的存储过程的返回参数数据 stmt.registerOutParameter(1, Types.INTEGER); stmt.execute(); int i= stmt.getInt(1);

SQL编程及存储过程实验

集美大学计算机工程学院实验报告 一、实验目的 1.了解T-SQL的基本数据类型、函数; 2.掌握局部变量的定义和赋值; 3.掌握存储过程的定义及调用 二、实验内容与设计思想 ●主要内容: 1.基本结构编程; 2.存储过程的建立; 3.存储过程的调用。 ●知识准备: 1.SQL中的基本数据类型: VARCHAR:字符数据。 DATETIME:(常量使用特定格式的字符日期值来表示,并使用单引号括起来。例如:'1976-05-28','MAY 28, 1976','28 MAY, 1976','760528','05/28/76'。 INTEGER:用一串数字来表示,不含小数点,不使用引号。例如,123,1896。 DECIMAL:用一串数字来表示,可以包含小数点,不使用引号。例如,1893.1209,2.0。 FLOAT和REAL:使用科学记数法表示。例如,101.5E5,0.5E-2。 MONEY:用一串数字,可以包含或不包含小数点,以一个货币符号($)作为前缀,不使用等等2.SQL中的变量:SQL中变量用来存放临时数据,变量使用前一定要先进行定义,变量名必须 以@开头。另外,SQL SERVER中还提供一些系统变量,系统变量是以@@开头的。 变量的定义:DECLARE 变量名数据类型 如 GO DECLARE @NAME VARCHAR(20) SET @NAME='王雨' PRINT @NAME GO 3.SQL中的基本函数 (1) 字符串函数:LEN()、UPPER()、LOWER()、RIGHT()、LEFT()、SUBSTRING()、CHARINDEX()、STR()、REPLACE()等 (2) 数学函数:常用的数学函数通常对作为参数提供的输入值执行计算,并返回一个数字值。

oracle存储过程讲解及实例

存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4: NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名 =param1; If (判断条件) then Select 列名into 变量2 from 表A where列名 =param1; Dbms_output。Put_line(‘打印信息’); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback;

End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select 。。。into。。。给变量赋值 5,在代码中抛异常用 raise+异常名 CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 is_ym IN CHAR(6) ,

存储过程

MySQL 5.0 版本开始支持存储过程。 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。 存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。 存储过程思想上很简单,就是数据库SQL 语言层面的代码封装与重用。 优点 ?存储过程可封装,并隐藏复杂的商业逻辑。 ?存储过程可以回传值,并可以接受参数。 ?存储过程无法使用SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。 ?存储过程可以用在数据检验,强制实行商业逻辑等。 缺点 ?存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。 ?存储过程的性能调校与撰写,受限于各种数据库系统。 一、存储过程的创建和调用 ?存储过程就是具有名字的一段代码,用来完成一个特定的功能。 ?创建的存储过程保存在数据库的数据字典中。 创建存储过程 CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name([proc_par ameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type characteristic: COMMENT'string' | LANGUAG E SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA |

(完整版)SQLSERVER存储过程大总结

SQLSERVER存储过程使用说明书 引言 首先介绍一下什么是存储过程:存储过程就是将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,并且这样的语句是放在数据库中的,还可以根据条件执行不同SQL语句,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。 请大家先看一个小例子: create proc query_book as select * from book go --调用存储过程 exec query_book 请大家来了解一下存储过程的语法。 Create PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ] 一、参数简介 1、procedure_name 新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。 要创建局部临时过程,可以在 procedure_name 前面加一个编号 符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两

个编号符 (##procedure_name)。完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。 2、;number 是可选的整数,用来对同名的过程分组,以便用一条 Drop PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。Drop PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应 在 procedure_name 前后使用适当的定界符。 3、@parameter 过程中的参数。在 Create PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2100 个参数。 使用@符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。 4、data_type 参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。 说明:对于可以是cursor 数据类型的输出参数,没有最大数目的限制。 5、VARYING 指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。 6、default 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。 7、OUTPUT

ORACLE存储过程开发基础语法

ORACLE存储过程开发基础语法 create or replace procedure test(var_name_1 in type,var_name_2 out type) as --声明变量(变量名变量类型) begin --储备过程的执行体 end test; 打印出输入的时刻信息 E.g: create or replace procedure test(workDate in Date) is begin dbms_output.putline('The input date is:'||to_date(workDate,'yyyy-mm-dd')); end test; 2、变量赋值 变量名:= 值; E.g: create or replace procedure test(workDate in Date) is x number(4,2); begin x := 1; end test; 3、判定语句:

if 比较式then begin end; end if; E.g create or replace procedure test(x in number) is begin if x >0 then begin x := 0 - x; end; end if; if x = 0 then begin x: = 1; end; end if; end test; 4、For 循环 For ... in ... LOOP --执行语句 end LOOP; (1)循环遍历游标 create or replace procedure test() as Cursor cursor is select name from student; name varchar(20);

oracle实验--存储过程

实验八存储过程的使用 一、实验目的 1、熟练掌握存储过程的定义及使用 二、实验要求 1、实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成 实验内容的预习准备工作; 2、能认真独立完成实验内容; 3、实验后做好实验总结,根据实验情况完成实验报告。 三、实验内容 创建图书管理库的图书、读者和借阅三个基本表的表结构: 图书表: BOOK ( BOOK_ID NUMBER(10), SORT V ARCHAR2(10), BOOK_NAME V ARCHAR2(50), WRITER V ARCHAR2(10), OUTPUT V ARCHAR2(50), PRICE NUMBER(3)); 读者表 READER ( READER_ID NUMBER(3), COMPANY V ARCHAR2(10), NAME V ARCHAR2(10), SEX V ARCHAR2(2), GRADE V ARCHAR2(10), ADDR V ARCHAR2(50)); 借阅表 BORROW ( READER_ID NUMBER(3),

BOOK_ID NUMBER(10), BORROW_DA TE DA TE); 插入数据: BOOK表: insert into book values(445501,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445502,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445503,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(332211,'TP5/10','计算机基础','李伟','高等教育出版社',18.00); insert into book values(112266,'TP3/12','FoxBASE','张三','电子工业出版社',23.60); insert into book values(665544,'TS7/21','高等数学','刘明','高等教育出版社',20.00); insert into book values(114455,'TR9/12','线性代数','孙业','北京大学出版社',20.80); insert into book values(113388,'TR7/90','大学英语','胡玲','清华大学出版社',12.50); insert into book values(446601,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446602,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446603,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(449901,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(449902,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(118801,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); insert into book values(118802,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); READER表: insert into reader values(111,'信息系','王维利','女','教授','1号楼424'); insert into reader values(112,'财会系','李立','男','副教授','2号楼316'); insert into reader values(113,'经济系','张三','男','讲师','3号楼105'); insert into reader values(114,'信息系','周华发','男','讲师','1号楼316'); insert into reader values(115,'信息系','赵正义','男','工程师','1号楼224'); insert into reader values(116,'信息系','李明','男','副教授','1号楼318'); insert into reader values(117,'计算机系','李小峰','男','助教','1号楼214'); insert into reader values(118,'计算机系','许鹏飞','男','助工','1号楼216'); insert into reader values(119,'计算机系','刘大龙','男','教授','1号楼318'); insert into reader values(120,'国际贸易','李雪','男','副教授','4号楼506'); insert into reader values(121,'国际贸易','李爽','女','讲师','4号楼510'); insert into reader values(122,'国际贸易','王纯','女','讲师','4号楼512'); insert into reader values(123,'财会系','沈小霞','女','助教','2号楼202'); insert into reader values(124,'财会系','朱海','男','讲师','2号楼210'); insert into reader values(125,'财会系','马英明','男','副教授','2号楼212'); BORROW表:

相关文档
最新文档