当前位置:首页 » 服务存储 » 项目存储过程
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

项目存储过程

发布时间: 2023-02-23 03:58:33

‘壹’ 存储过程 项目如何维护

刚开始创建数据对象(例如table)时就应该考虑到这些,将table多创建一些弹性域,如segment1,segment2....后续新功能扩展时就可以直接调用弹性域栏位.另外存储过程的调用应该使用动态方法调用,这样就不会有影响了

‘贰’ 做项目使用存储过程的优点

是的,使用了存过程,很多相似性的删除,更新,新增等操作就变得轻松了,并且以后也便于管理!

‘叁’ 什么是存储过程有什么优点

存储过程是事先经过编译并存储在数据库中的一段sql语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

优点:

1、重复使用:存储过程可以重复使用,从而可以减少数据库开发人员的工作量。

2、减少网络流量:存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。

3、安全性:参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。

(3)项目存储过程扩展阅读

存储过程的缺点:

1、更改比较繁琐:如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐。

2、可移植性差:由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则需要将业务逻辑封装在不特定于 RDBMS 的中间层中。

‘肆’ 存储过程如何在Java项目中调用

存储过程在Java项目中调用:

public Object clone(){

MathHomework m = null;

/**

* 深度复制

*/

m = (MathHomework) this.clone();

m.A = (Date)this.getA().clone();

return m;

}

public Date getA(){

return A;

}

‘伍’ 啥叫“存储过程”啊

存储过程
存储过程是保存在数据库中的专门进行数据操作的代码过程。存储过程通常与触发器结合使用,来控制数据的完整性。在打开数据库时,存储过程被自动加载到内存中,可以象其他过程文件一样进行调用。

1.建立存储过程
可以在项目管理器中选择建立或修改存储过程。在项目管理器的Data选项卡中选定Stored Proceres节点,然后单击New、Add或Modify按钮都将打开存储过程文本编辑器,如图7-12所示。

也可以在首先打开数据库的情况下,执行MODIFY STRUCTURE命令打开存储过程文本编辑器。如:

OPEN DATABASE dbMyData
MODIFY STRUCTURE

一个数据库的所有存储过程包含在一个文件中,过程使用PROCEDURE语句声明,这与一般的过程文件是完全一样的。

例如,下面为数据库建立了一个名为NewStuId的存储过程,该过程为学生档案表的StuId字段根据当前StuId中的最大值自动生成一个编号,并保存到StuId字段中中,如图7-13所示。

图7-12 可以在项目管理器选择建立或修改存储过程

图7-13 NewStuId存储过程

执行下面的代码,将在学生档案表中添加一条新记录,并为StuId字段赋值。

APPEND BLANK

NewStuId() &&执行存储过程

需要注意的是,如果准备存储过程用于表的触发器,则不能包含如图7-13中所示的CALCULATE、GO和REPLACE这些引起记录移动的命令。

2.从文本文件中导入存储过程
可以使用APPEND PROCEDURES命令将文本文件中的存储过程以编程的方式添加到当前数据库中,其语法格式如下:

APPEND PROCEDURES FROM FileName [AS nCodePage] [OVERWRITE]

其中,FileName指定保存存储过程的文本文件名称;AS nCodePage指定要追加其存储过程的文本文件要转换的代码页;OVERWRITE指定用文本文件中的过程改写数据库中的当前存储过程,如果不包含此参数,文本文件中的存储过程将追加到当前存储过程中。

需要注意的是,在使用该命令前,数据库必须以独占方式打开并设置为当前数据库。

3.将存储过程导出到文本文件中
可以使用COPY PROCEDURES命令将当前数据库中的存储过程导出到文本文件,其语法格式如下:

COPY PROCEDURES TO FileName [AS nCodePage] [ADDITIVE]

其中,FileName指定文本文件名,存储过程将被复制到此文本文件中;AS nCodePage指定文本文件的代码页;ADDITIVE指定将存储过程追加到指定文本文件尾,如果若省略该参数,则覆盖文本文件的内容。

4.查看数据库中的存储过程
可以使用DISPLAY PROCEDURES或LIST PROCEDURES命令显示当前数据库中的存储过程名称,二者的功能基本相同。其中,DISPLAY PROCEDURES命令的语法格式如下:

DISPLAY PROCEDURES [TO PRINTER [PROMPT] | TO FILE FileName] [NOCONSOLE]

其中,TO PRINTER [PROMPT]指定将显示结果输出到打印机中,包含PROMPT子句可以在打印开始前显示一个打印对话框;TO FILE FileName指定将显示结果输出到FileName指定的文件中;NOCONSOLE指定不向Visual FoxPro主窗口或活动的用户自定义窗口输出。

例如,下面的代码将显示dbMyData数据库中的存储过程名称。

OPEN DATABASE dbMyData

DISPLAY PROCEDURES

7.3.6 设置触发器
触发器是绑定在表上的表达式,当表中的任何记录被指定的操作命令修改时,触发器被激发。当数据修改时,触发器可执行数据库应用程序要求的任何其他操作。

触发器作为特定表的属性来创建和存储。如果从数据库中移去一个表,则同时删除和该表相关联的触发器。从前面的表7-7可以看出,触发器是在进行了其他所有检查之后(如有效性规则、主关键字的实施,以及NULL值的实施)被激活,位于所有约束的最后面。并且与字段级规则和记录级规则不同,触发器不对缓冲数据起作用。

1.建立触发器
可以使用表设计器或CREATE TRIGGER命令来创建触发器。对于每个表,可为插入、更新及删除3个事件各创建一个触发器。在任何情况下,一个表最多只能有3个触发器。触发器必须返回“真”(.T.)或“假”(.F.),只有返回“真”时操作才能继续进行。能够激发触发器的命令如表7-9所示。

表7-9 能够激发触发器的命令

触发器
命令

删除触发器
DELETE命令

插入触发器
APPEND FROM、APPEND FROM ARRAY、APPEND BLANK、IMPORT、INSERT-SQL和RECALL命令

序表

触发器
命令

更新触发器
GATHER、REPLACE、REPLACE FROM ARRAY和UPDATE SQL命令

需要注意的是,不能对有触发器的表使用INSERT命令,但是可以使用INSERT-SQL命令;发出PACK或ZAP不会激发任何触发器;如果更新具有删除标记的记录,不会激发触发器;如果表使用了缓冲模式,只有当使用TABLEUPDATE( )函数进行发送更新时,才激发更新触发器。

下面是在dbMyData数据库中建立的4个存储过程。其中,InsertData用于在添加记录时显示一个“新增记录…”提示;UpdateData用于在记录更新时自动将更新记录写入到一个日志表tblStudent2中,来记录用户对学生档案表所做的修改;DeleteData用于在删除记录时显示一个信息框,询问用户是否确认删除记录;WriteLog用于写入日志,该过程可以接收来自UpdateData过程的参数传入值。

PROCEDURE WriteLog

PARAMETERS lcStuId,lcStuName,lcClassName,ldEnterDate,lnChinese,lnMaths,lnTotal

*!* 将变动写入到日志表tblStuden2中

INSERT INTO tblStudent2 (StuId,StuName,ClassName,EnterDate,Chinese,Maths,Total) ;

VALUES (lcStuId,lcStuName,lcClassName,ldEnterDate,lnChinese,lnMaths,lnTotal)

PROCEDURE InsertData

WAIT WINDOW "新增记录..." NOWAIT TIMEOUT 2

RETURN .T.

PROCEDURE UpdateData

WAIT WINDOW "正在将变动写入日志表..." NOWAIT TIMEOUT 2

WriteLog(StuId,StuName,ClassName,EnterDate,Chinese,Maths,Total)

RETURN .T.

PROCEDURE DeleteData

IF MESSAGEBOX("确认删除该记录吗?",4+32," 提示")=6

RETURN .T.

ELSE

RETURN .F.

ENDIF

打开表设计器,在Table选项卡的Insert trigger、Update trigger和Delete trigger文本框中分别输入InsertData()、UpdateData()和DeleteData(),如图7-14所示。

图7-14 为表建立触发器

也可以使用CREATE TRIGGER命令为表建立触发器表达式,该命令的语法格式如下:

CREATE TRIGGER ON TableName FOR DELETE | INSERT | UPDATE AS lExpression

其中,TableName是要建立触发器的表名称,lExpression是触发器表达式。例如,下面使用该命令为学生档案表建立了与图7-14同样的触发器表达式。

OPEN DATABASE dbMyData

CREATE TRIGGER ON 学生档案表 FOR INSERT AS InsertData() &&建立插入触发器

CREATE TRIGGER ON 学生档案表 FOR UPDATE AS UpdateData() &&建立更新触发器

CREATE TRIGGER ON 学生档案表 FOR DELETE AS DeleteData() &&建立删除触发器

2.删除触发器
可以在表设计器的Table选项卡中删除触发器或使用DELETE TRIGGER命令从数据库表中删除触发器。其中,DELETE TRIGGER命令的语法格式如下:

DELETE TRIGGER ON TableName FOR DELETE | INSERT | UPDATE

其中,TableName是要删除触发器的表名称。

例如,下面的代码将删除学生档案表中的插入触发器。

DELETE TRIGGER ON 学生档案表 FOR INSERT

3.修改触发器
可以在表设计器的Table选项卡中或者使用CREATE TRIGGER命令来修改触发器。使用命令修改触发器与建立触发器时相同。

‘陆’ 在SQL中存储过程分为哪五类

1、目录存储过程

例如:sp_columns返回当前环境中可查询的指定表或视图的列信息。

sp_tables返回当前环境下可查询的对象的列表(任何可出现在FROM子句中的对象)。

2、复制类存储过程

例如:sp_addarticle创建项目并将其添加到发布中。此存储过程在发布服务器的发布数据库上执行。

3、安全管理类存储过程

例如:sp_addrole在当前数据库创建新的Microsoft SQL Server角色。

sp_password添加或更改Microsoft SQL Server登录的密码。

4、分布式查询存储过程

例如:sp_foreignkeys返回引用主键的外键,这些主键在链接服务器中的表上。

sp_primarykeys返回指定远程表的主键列,每个键列占一行。

5、扩展存储过程

例如:xp_sendmail向指定的收件人发送邮件和查询结果集附件。

xp_startmail启动SQL邮件客户端会话。



存储过程的特点

1、存储过程在服务器端运行,执行速度快。

2、存储过程执行一次后,其执行驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。

3、确保数据库的安全。使用存储过程可以完成所有的数据库操作。

4、降低网络负载,提高效率。

5、可以接受用户参数,亦可返回参数。

6、作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

‘柒’ 存储过程在实际项目中用的多吗

存储过程在项目中非常重要,我们的数据等格式都是通过这个存储过程得到翻译,最终形成输出端文件,相当于中枢

‘捌’ 怎样在项目中使用存储过程

如何用JAVA调用存储过程

CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参,另一种形式不带结果参数。结果参数是一种输出 (OUT) 参数,是已储存过程的返回值。两种形式都可带有数量可变的输入(IN 参数)、输出(OUT 参数)或输入和输出(INOUT 参数)的参数。问号将用作参数的占位符。
在 JDBC 中调用已储存过程的语法如下所示。注意,方括号表示其间的内容是可选项;方括号本身并不是语法的组成部份。
{call 过程名[(?, ?, ...)]}
返回结果参数的过程的语法为:
{? = call 过程名[(?, ?, ...)]}
不带参数的已储存过程的语法类似:
{call 过程名}
通常,创建 CallableStatement 对象的人应当知道所用的 DBMS 是支持已储存过程的,并且知道这些过程都是些什么。然而,如果需要检查,多种DatabaseMetaData 方法都可以提供这样的信息。例如,如果 DBMS 支持已储存过程的调用,则supportsStoredProceres 方法将返回 true,而getProceres 方法将返回对已储存过程的描述。CallableStatement 继承 Statement 的方法(它们用于处理一般的 SQL 语句),还继承了 PreparedStatement 的方法(它们用于处理 IN 参)。
CallableStatement 中定义的所有方法都用于处理 OUT 参数或 INOUT 参数的输出部分:注册 OUT 参数的 JDBC 类型(一般 SQL 类型)、从这些参数中检索结果,或者检查所返回的值是否为 JDBC NULL。
1、创建 CallableStatement 对象
CallableStatement 对象是用 Connection 方法 prepareCall 创建的。下例创建 CallableStatement 的实例,其中含有对已储存过程 getTestData 调用。该过程有两个变量,但不含结果参数:
CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
其中?占位符为IN、OUT还是INOUT参数,取决于已储存过程getTestData。
2、IN和OUT参数
将IN参数传给 CallableStatement 对象是通过 setXXX 方法完成的。该方法继承自 PreparedStatement。所传入参数的类型决定了所用的setXXX方法(例如,用 setFloat 来传入 float 值等)。
如果已储存过程返回 OUT 参数,则在执行 CallableStatement 对象以前必须先注册每个 OUT 参数的 JDBC 类型(这是必需的,因为某些 DBMS 要求 JDBC 类型)。注册 JDBC 类型是用 registerOutParameter 方法来完成的。语句执行完后,CallableStatement 的 getXXX 方法将取回参数值。正确的 getXXX 方法是为各参数所注册的 JDBC 类型所对应的 Java 类型。换言之, registerOutParameter 使用的是 JDBC 类型(因此它与数据库返回的 JDBC 类型匹配),而 getXXX 将之转换为 Java 类型。
作为示例,下述代码先注册 OUT 参数,执行由 cstmt 所调用的已储存过程,然后检索在 OUT 参数中返回的值。方法 getByte 从第一个 OUT 参数中取出一个 Java 字节,而 getBigDecimal 从第二个 OUT 参数中取出一个 BigDecimal 对象(小数点后面带三位数):
CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
cstmt.executeQuery();
byte x = cstmt.getByte(1);
java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);
CallableStatement 与 ResultSet 不同,它不提供用增量方式检索大 OUT 值的特殊机制。

3、INOUT参数
既支持输入又接受输出的参数(INOUT 参数)除了调用 registerOutParameter 方法外,还要求调用适当的 setXXX 方法(该方法是从 PreparedStatement 继承来的)。setXXX 方法将参数值设置为输入参数,而 registerOutParameter 方法将它的 JDBC 类型注册为输出参数。setXXX 方法提供一个 Java 值,而驱动程序先把这个值转换为 JDBC 值,然后将它送到数据库中。这种 IN 值的 JDBC 类型和提供给 registerOutParameter 方法的 JDBC 类型应该相同。然后,要检索输出值,就要用对应的 getXXX 方法。例如,Java 类型为byte 的参数应该使用方法 setByte 来赋输入值。应该给registerOutParameter 提供类型为 TINYINT 的 JDBC 类型,同时应使用 getByte 来检索输出值。
下例假设有一个已储存过程 reviseTotal,其唯一参数是 INOUT 参数。方法setByte 把此参数设为 25,驱动程序将把它作为 JDBC TINYINT 类型送到数据库中。接着,registerOutParameter 将该参数注册为 JDBC TINYINT。执行完该已储存过程后,将返回一个新的 JDBC TINYINT 值。方法 getByte 将把这个新值作为 Java byte 类型检索。
CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");
cstmt.setByte(1, 25);
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.executeUpdate();
byte x = cstmt.getByte(1);
4、先检索结果,再检索 OUT 参数
由于某些 DBMS 的限制,为了实现最大的可移植性,建议先检索由执行CallableStatement 对象所产生的结果,然后再用 CallableStatement.getXXX 方法来检索 OUT 参数。如果 CallableStatement 对象返回多个 ResultSet 对象(通过调用 execute 方法),在检索 OUT 参数前应先检索所有的结果。这种情况下,为确保对所有的结果都进行了访问,必须对 Statement 方法 getResultSet、getUpdateCount 和getMoreResults 进行调用,直到不再有结果为止。
检索完所有的结果后,就可用 CallableStatement.getXXX 方法来检索 OUT 参数中的值。
5、检索作为OUT参数的NULL值
返回到 OUT 参数中的值可能会是JDBC NULL。当出现这种情形时,将对 JDBC NULL 值进行转换以使 getXXX 方法所返回的值为 null、0 或 false,这取决于getXXX 方法类型。对于 ResultSet 对象,要知道0或false是否源于JDBCNULL的唯一方法,是用方法wasNull进行检测。如果 getXXX 方法读取的最后一个值是 JDBC NULL,则该方法返回 true,否则返回 flase。

‘玖’ 给我个真正项目中的存储过程例子

存储过程调用深度为16层,存储过程的复杂度与设计时存储过程的整体框架相关,一般底层的存储过程简单一些,实现基本的功能,而上层的存储过程调用底层的过程,从而实现复杂的功能,供程序调用。

总而言之,存储过程像模块化编程一样,都是由小模块堆积起来的。因而楼主关注存储过程的复杂度,不如有空自己多写几个小存储过程;以前我们公司的存储过程长的大概在1000行左右,短的只有几行。

‘拾’ 为什么要使用存储过程

存储过程是指一组具有某种特殊功能的SQL语句集,常用于大型数据库中,也出现于开发过程中。程序员经常运用存储过程是由于其具有以下优点:

一、响应时间上来说有优势:如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话,就只有一次。存储过程可以给我们带来运行效率提高的好处。

二、安全上使用了存储过程的系统更加稳定:程序容易出现 BUG 不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。

(10)项目存储过程扩展阅读

存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。

一般来说,存储过程的编写比基本SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。经自已测试,一个有着十万条记录的表,通过php调用存储过程比通过PHP执行sql语句获取所有记录的时间,平均快0.4秒左右。