存储过程

存储过程编写经验和优化措施

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-14 09:40:59
一、适合读者对象 :数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。   二、介绍 :在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。   三、内容:   1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。 2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。   3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: a)SQL的使用规范 :  i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。  ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。  iii.

Oracle存储过程、函数、包加密wrap

心不动则不痛 提交于 2020-03-14 04:46:28
wrap加密可以将PL/SQL的代码实现部分隐藏,提高代码的安全性,如存储过程、函数、包等都隐藏。 wrap加密的方法有两种,下面以函数为例分别介绍一下: 方法一: 编写好函数后保存到 d:\testWrap.sql 文件 CREATE OR REPLACE FUNCTION testwrap RETURN VARCHAR2 IS BEGIN RETURN(to_char(SYSDATE, 'yyyy-mm-dd hh24:mi:ss')); END testwrap; 打开cmd命令窗口,执行如下命令 D:\>dir test* 驱动器 D 中的卷没有标签。 卷的序列号是 A5EB-573A D:\ 的目录 2019/06/10 17:22 132 testwrap.sql 1 个文件 132 字节 0 个目录 184,808,128,512 可用字节 D:\>wrap iname=testwrap.sql PL/SQL Wrapper: Release 11.2.0.4.0- 64bit Production on 星期一 6月 10 17:25:03 2019 Copyright (c) 1993, 2009, Oracle. All rights reserved. Processing testwrap.sql to testwrap.plb D:\>dir test*

Oracle --存储函数和存储过程

时间秒杀一切 提交于 2020-03-13 13:55:28
oracle提供可以将pl/sql程序块存储在数据库中,并可以在任何地方运行它,这种pl/sql程序块称为存储过程或函数。 存储过程和函数的区别:函数需要向调用者返回数据,而过程不需要返回数据。 1.创建函数 create or replace function getAllSalary(i_cstmId in t_consumption.csptn_id%type) return number is v_sum number; begin select sum(amount) into v_sum from t_consumption tcm where tcm.cstm_id = i_cstmId; return v_sum; end getAllSalary; 调用函数 在函数或存储过程里面均可调用函数 declare v_mount number; begin --SQL语句 v_mount := getAllSalary(100000001); end; 2.创建存储过程 create or replace procedure getAllSalary(i_cstmId in t_consumption.csptn_id%type, o_amount number) is v_sum number; begin select sum(amount) into v_sum

调用存储过程,返回字段

大兔子大兔子 提交于 2020-03-13 11:11:25
Connection conn = null; CallableStatement proc = null; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); String url = "jdbc:sqlserver://localhost; DatabaseName=数据库"; String username = "sa"; String password = "密码"; // String password = "111111"; conn = DriverManager.getConnection(url, username, password); proc = conn.prepareCall("{call zz_GetICMaxNumOld(?,?)}"); //给存储过程的参数设置值 proc.setString(1,"cdgl_clyupai"); proc.registerOutParameter(2, Types.VARCHAR); proc.execute(); fid_z = Integer.parseInt(proc.getString(2)); System.out.println("存储过程返回的值是:"+fid_z); } catch

初始化存储过程出错,microsoft ole db provider for sql server execution of .net framework code is disabled.set \"clr enabled\" configuration option and restart the server.

时光毁灭记忆、已成空白 提交于 2020-03-12 13:25:58
大概中文意思是(禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项) 原因分析:从提示可以看出可能是数据库连接组件或者.NET设置的问题,但用友小辣妹表示实在没有碰到过此类错误提示,因为软件都是正常安装的,没有报错,于是就直接百度了一下 clr enabled 这个内容,出来好多可参考的文章。 解决办法:在查询分析其中执行如下代码: SQL exec sp_configure 'show advanced options', '1'; Go reconfigure; go exec sp_configure 'clr enabled', '1' go reconfigure; exec sp_configure 'show advanced options', '1'; go 来源: https://www.cnblogs.com/derekhan/p/12468580.html

Oracle存储过程

无人久伴 提交于 2020-03-12 04:01:25
文章目录 一、存储过程的概念 二、存储过程的创建、调用和权限 1、创建存储过程 2、存储过程的调用 3、存储过程的权限 三、删除存储过程 四、PL/SQL语言 五、应用经验 1、存储过程的优点 2、存储过程的缺点 3、我的看法 六、Oracle的包 七、版权声明 一、存储过程的概念 存储过程(stored procedure)是Oracle数据库中为了完成某功能的PL/SQL代码集,就像没有返回值的自定义函数。 二、存储过程的创建、调用和权限 1、创建存储过程 create or replace procedure 存储过程名 ( 参数 1 模式 数据类型 , . . . . . . ) as / is -- 定义局部变量 变量 1 数据类型 ; . . . . . . begin -- 实现存储过程功能的PL / SQL代码。 . . . . . . exception -- 异常处理的PL / SQL代码。 . . . . . . end ; / 1)参数的模式有三种: in :只读模式,在函数中,参数只能被引用/读取,不能改变它的值。 out :只写模式,参数只能被赋值,不能被引用/读取。 in out :可读可写。 参数的模式可以不写,缺省为in,out和in out两种模式极少使用。 2)as/is二选一,在这里没有区别。 3)可以不定义局部变量。 4)可以没有异常

分页存储过程(一)使用SQL Server2005的新函数构造分页存储过程

夙愿已清 提交于 2020-03-11 16:59:07
使用 SQL Server2005 的新函数构造分页存储过程 分页存储过程一直是很多人经常用到的东西,怎么样才能设计一个既实用,又强大,还可以解决大数据量的分页存储过程呢?其实在很多时候设计的度还是要把握的,不至于让自己陷入【非要把它设计成万能的分页存储过程】的怪圈中才是最重要的,因为我们还要留出时间还解决其他的很多问题,个人认为适度就可以了,留出一定的空间。也因为万能是不存在的,万物在一定的范畴之内都是合理的,出了范畴可能就没有合理的了。 分页存储过程大致有下列几种 1、 利用 Not in 和 select top 2、 利用 id 大于多少和 select top 3、 利用 sql 中的游标 4 、临时表 可以参看网上的以下链接 http://www.zxbc.cn/html/20090625/71918.html http://read.newbooks.com.cn/info/174545.html 在 2005 中我们的选择就多了,可以利用新语法 CTE (公用表表达式) , 关于 CTE 的介绍大家可以参看博客园中一位仁兄的系列教程 http://www.cnblogs.com/nokiaguy/archive/2009/01/31/1381562.html 或者干脆上微软的官网 http://msdn.microsoft.com/zh-cn/library

SQL的存储过程及把字段数据改为文字形式

空扰寡人 提交于 2020-03-10 20:21:26
SQL的存储过程及把字段数据改为文字形式 SQL存储过程 存储过程《无返无参》 存储过程《无返有参》 存储过程《有返有参》 存储过程综合案例 字段数据改为文字形式 SQL存储过程 存储过程语法 的三种形式: 无返无参 、 无返有参 、 有返有参 。 存储过程综合案例 存储过程《无返无参》 注意 :如果存储过程始终存在则无需判断存储过程是否存在 < 如下同理 > //存储过程 《无返无参》 //判断存储过程是否存在 储存过程名称(sp_或xp_) if exists ( select * from sysobjects where name = 'sp_heros' ) //存在删除 drop proc sp_heros go //创建存储过程 create proc sp_heros as //SQL执行语句 select * from UserInfo s1 , Sutclass s2 where s1 . UserID = s2 . UserID order by s1 . UserID go //调用存储过程 (exec 或 execute) exec sp_heros 存储过程《无返有参》 //存储过程《无返有参》 //判断存储过程是否存在 if exists ( select * from sysobjects where name = 'xp_peroscan' ) /

SQL Server存储过程

喜你入骨 提交于 2020-03-10 08:05:02
在SQL Server中,存储过程是比视图更强大。视图让我们简单地做一个SELECT查询也在可视图本身,它的工作方式是用于运行复杂的查询。 但视图并不姝真正为我们提供代码业务逻辑的能力。例如,视图不会能让我们增加条件代码(如IF语句)。幸运的是存储过程可能使用。 什么是存储过程? 存储过程是一组SQL语句编译成一个SQL。类似于在说的SQL脚本页面,在这里可以运行许多SQL脚本合为一个整体。 然而,存储过程并不仅仅是一个长脚本。这是已保存在SQL Server中明确在存储过程节点的脚本。存储过程通常包含一些业务逻辑。 例如,一个存储过程可以接受被传递给它的并针对这些参数测试使用IF语句的参数。例如,如果该参数是一个值,这样做,如果它是另一个值。 它们包含业务逻辑的能力使存储过程SQL Server的强大的一部分。存储过程可以提高性能的应用程序,因为存储过程进行解析,并尽快,因为它是建立优化,然后存储在内存中。运行通过存储过程条件的查询可以是非常快 - 相比,发送查询通过网络,到SQL Server的应用程序,遂将全部返还给它在网络上,因此它可以过滤通过它,并挑选出只是它感兴趣的记录数据。 存储过程的好处 下面是一些在使用存储过程的主要优点: 好处 说明 模块化编程 可以写一个存储过程一次,然后一次又一次地调用它,从应用程序的不同部分(甚至多个应用程序)。 性能

C# 使用存储过程来查询数据库

六月ゝ 毕业季﹏ 提交于 2020-03-09 21:56:04
using System ; using System . Collections . Generic ; using System . ComponentModel ; using System . Data ; using System . Drawing ; using System . Linq ; using System . Text ; using System . Threading . Tasks ; using System . Windows . Forms ; using System . Data . SqlClient ; namespace _02_通过存储过程查询数据 { public partial class Form1 : Form { public Form1 ( ) { InitializeComponent ( ) ; } private int _pageIndex = 1 ; //--@pageIndex --当前查询的是第几页 private int _rowsInPage = 10 ; //--@rowsInPage --一页中有多少行 private int _rowsInTable ; //--@rowsInTable --一共有多少行 private int _pageInTable ; //--@pagesInTable