谨请大家给点建议:ADO访问ORACLE存储过程

wljwljwlj 2003-03-18 02:41:17
假如我有个表:UNIT_M 我在ORACLE后端写四个存储过程了
P_LOCK(用于记录锁定,处理并发)
P_INSERT
P_UPDATE
P_DELETE
我打算在前端用ADODATASET 或ADOTABLE
连接DATASOURCE 再连接NAVIGATOR操作记录,
但提交时调用后端过程,不直接操作记录。
大家是如何处理的,另请对比一下最好的效率。
...全文
111 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
debussy 2003-03-20
  • 打赏
  • 举报
回复
如果单纯是做Select操作,使用StoredProcedure的确可以提高效率,但是做Update、Insert和Delete就不一定了。
okook 2003-03-20
  • 打赏
  • 举报
回复
这是从SQL server 联机丛书中搜索来的
一.基本概念
存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。
存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理
。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有
条件执行以及其它强大的编程功能。

存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返
回单个或多个结果集以及返回值。

可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点:
1)可以在单个存储过程中执行一系列 SQL 语句。
2)可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
3)存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。

二。如何创建存储过程
可使用 Transact-SQL 语句 CREATE PROCEDURE 创建存储过程。创建存储过程前,
请考虑下列事项:
1)不能将 CREATE PROCEDURE 语句与其它 SQL 语句组合到单个批处理中。
2)创建存储过程的权限默认属于数据库所有者,该所有者可将此权限授予其他用户。
3)存储过程是数据库对象,其名称必须遵守标识符规则。
4)只能在当前数据库中创建存储过程。

创建存储过程时,应指定:
1)所有输入参数和向调用过程或批处理返回的输出参数。
2)执行数据库操作(包括调用其它过程)的编程语句。
3)返回至调用过程或批处理以表明成功或失败(以及失败原因)的状态值。

什么是系统存储过程?
Microsoft® SQL Server 中的许多管理活动是通过一种称为系统存储过程的特殊过程执
行的。系统存储过程在 master 数据库中创建并存储,带有 sp_ 前缀。可从任何数据
库中执行系统存储过程,而无需使用 master 数据库名称来完全限定该存储过程的名称。

强烈建议您不要创建以 sp_ 为前缀的存储过程。SQL Server 始终按照下列顺序查
找以 sp_ 开头的存储过程:
1)在 master 数据库中查找存储过程。
2)根据所提供的任何限定符(数据库名称或所有者)查找该存储过程。
3)如果未指定所有者,则使用 dbo 作为所有者查找该存储过程。
因此,虽然当前数据库中可能存在带 sp_ 前缀的用户创建的存储过程,但总会先
检查 master 数据库(即使该存储过程已用数据库名称限定)。

另外, 如果用户创建的存储过程与系统存储过程同名,则永远不执行用户创建的存储过程。

三.如何执行存储过程?
当需要执行存储过程时,请使用 Transact-SQL EXECUTE 语句。如果存储过
程是批处理中的第一条语句,那么不使用 EXECUTE 关键字也可以执行该存储过程。

如果存储过程编写为可以接受参数值,那么可以提供参数值。

说明 如果使用 @parameter = value 的形式,那么可以按任何顺序提供参数。
还可以省略那些已提供默认值的参数。如果以 @parameter = value 形式提
供了一个参数,就必须按此种形式提供后面所有的参数。如果没有以
@parameter = value 形式提供参数,则必须按照 CREATE PROCEDURE
语句中给出的顺序提供参数。

执行存储过程时,服务器将拒绝所有未包含在过程创建期间的参数列表中
的参数。如果参数名称不匹配,用地址传递(显式传递该参数名称)的任
何参数都不会被接受。

虽然可以省略已提供默认值的参数,但只能截断参数列表。例如,如果一个
存储过程有五个参数,可以省略第四个和第五个参数,但不能跳过第四个参
数而仍然包含第五个参数,除非以 @parameter = value 形式提供参数。


如果在存储过程中定义了参数的默认值,那么下列情况下将使用默认值:

执行存储过程时未指定该参数的值。


将 DEFAULT 关键字指定为该参数的值。
若要执行与其它同名存储过程处于同一分组中的存储过程,请指定此存储
过程在组内的标识号。例如,要执行 my_proc 组中的第二个存储过程,
请执行:

EXECUTE my_proc;2

四。如何用SQL语句创建存储过程
CREATE PROCEDURE
创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的
Transact-SQL 语句的集合。
可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所
有会话中临时使用(全局临时过程)。
也可以创建在 Microsoft® SQL Server™ 启动时自动运行的存储过程。
语法
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]

参数说明:
procedure_name
这是新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必
须唯一。有关更多信息,请参见使用标识符。
要创建局部临时过程,可以在 procedure_name 前面加一个编号符 (#procedure_name),
要创建全局临时过程,可以在 procedure_name 前面加两个编号符 (##procedure_name)。
完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。

;number
这是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将
同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为
orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。
如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name
前后使用适当的定界符。

@parameter
这是过程中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数。用户
必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程
最多可以有 2.100 个参数。
使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。
每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,
参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信
息,请参见 EXECUTE。

data_type
这是参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作
存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类
型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的
数据类型及其语法的更多信息,请参见数据类型。

说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。

VARYING
这是指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。
仅适用于游标参数。

default
这是参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认
值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含
通配符(%、_、[] 和 [^])。

OUTPUT
这是表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可
将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT
关键字的输出参数可以是游标占位符。

n
这是表示最多可以指定 2.100 个参数的占位符。

{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
RECOMPILE 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。
在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE
选项。

ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文
本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。

说明 在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。

FOR REPLICATION
这是指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION
选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和
WITH RECOMPILE 选项一起使用。

AS
指定过程要执行的操作。

sql_statement
这是过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。
n
这是是表示此过程可以包含多条 Transact-SQL 语句的占位符。

注意:存储过程的最大大小为 128 MB。

用户定义的存储过程只能在当前数据库中创建(临时过程除外,临时过程总是在
tempdb 中创建)。在单个批处理中,CREATE PROCEDURE 语句不能与其它 Transact-SQL
语句组合使用。

默认情况下,参数可为空。如果传递 NULL 参数值并且该参数在 CREATE 或 ALTER
TABLE 语句中使用,而该语句中引用的列又不允许使用 NULL,则 SQL Server 会产生一
条错误信息。为了防止向不允许使用 NULL 的列传递 NULL 参数值,应向过程中添加编
程逻辑或为该列使用默认值(使用 CREATE 或 ALTER TABLE 的 DEFAULT 关键字)。

建议在存储过程的任何 CREATE TABLE 或 ALTER TABLE 语句中都为每列显式指定
NULL 或 NOT NULL,例如在创建临时表时。ANSI_DFLT_ON 和 ANSI_DFLT_OFF 选项控制
SQL Server 为列指派 NULL 或 NOT NULL 特性的方式(如果在 CREATE TABLE 或
ALTER TABLE 语句中没有指定的话)。如果某个连接执行的存储过程对这些选项的设置
与创建该过程的连接的设置不同,则为第二个连接创建的表列可能会有不同的为空性,
并且表现出不同的行为方式。如果为每个列显式声明了 NULL 或 NOT NULL,那么将对
所有执行该存储过程的连接使用相同的为空性创建临时表。

在创建或更改存储过程时,SQL Server 将保存 SET QUOTED_IDENTIFIER 和 SET
ANSI_NULLS 的设置。执行存储过程时,将使用这些原始设置。因此,所有客户端会话
的 SET QUOTED_IDE

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧