“升职加薪钱多多”通过精心收集,向本站投稿了7篇Sybase数据库中存储过程的建立和使用,下面是小编为大家整理后的Sybase数据库中存储过程的建立和使用,供大家参考借鉴,希望可以帮助到有需要的朋友。
- 目录
篇1:Sybase数据库中存储过程的建立和使用
Sybase的存储过程是集中存储在SQL Server中的预先定义且已经编译好的事务,存储过程由SQL语句和流程控制语句组成。它的功能包括:接受参数;调用另一过程;返回一个状态值给调用过程或批处理,指示调用成功或失败;返回若干个参数值给调用过程或批处理,为调用者提供动态结果;在远程SQL Server中运行等。
存储过程的性能特点如下:
·存储过程是预编译过的,这就意味着它与普通的SQL语句或批处理的SQL语句不同,当首次运行一个存储过程时,SQL Server的查询处理器对其进行分析,在排除了语法错误之后形成存储在系统中的可执行方案。由于查询处理的大部分工作已经完成,所以存储过程执行速度很快。
·存储过程和待处理的数据都放在同一台运行SQL Server的计算机上,使用存储过程查询当地的数据,效率自然很高。
·存储过程一般多由Client端通过存储过程的名字进行调用,即跨网传送的只是存储过程的名字及少量的参数(如果有的话),而不是构成存储过程的许多SQL语句,因此可以减少网络传输量,加快系统响应速度。
·存储过程还有着如同C语言子函数那样的被调用和返回值的方便特性。
所以,存储过程大大增强了SQL语言的功能、效率和灵活性。掌握和应用好存储过程,对进一步发挥Sybase数据库系统的强大功能有着重要的意义。
存储过程的语法规则
建立存储过程的语法规则为:
CREATE PROCedure[owner.]procedurename[;number]
[[(]@parameter_name datatype[=default][OUTput]
[,@parameter_name datatype[=default][OUTput]]...[)]]
[WITH RECOMPILE]
AS SQL_statements
使用存储过程的语法规则为:
[EXECute][@return-status=]
[[[server.]database.]owner.]procedurename[;number]
[[@parameter_name=]value|[@parameter_name=]@varialbe[OUTput]
[,[@parameter_name=]value|[@parameter_name=]@variable[OUTput]...]]
[WITH RECOMPILE]
下面简要介绍这两个命令的常用选项以及建立和使用存储过程的要点,关于选项的更为详细的说明请参考有关手册。
·[[[server.]database.]owner.]procedure_name:存储过程的名字。
·@parameter_name datatype[=default][OUTput]:形式参数(形参)的名称、类型。df ault是赋予的缺省值(可选),OUTput指定本参数为输出参数(可选)。形参是存储过程中的自变量,可以有多个,名字必须以@打头,最长30个字符。
·SQL_statements:定义存储过程功能的SQL语句。
·@return_status:接受存储过程返回状态值的变量。
·[@parameter_name=]value:实际参数(实参),@parameter_name为实参的名称(可选)。如果某个实参以@parameter_name=value提供,那么随后的实参也都要采用这一形式提供。
·[@parameter_name=]@varialbe[OUTput]:将变量@varialbe中的值作为实参传递给形参@parameter_name(可选),如果变量@varialbe是用来接受返回的参数值,则选项OUTput不可缺少。
存储过程的建立和使用,我们将通过几个例子进行介绍。
假设有一个用下述语句生成的技能工资表RS-LS-GZ-JiNeng:
create table RS_LS_GZ_JiNeng/*技能工资表*/
(GeRen_id char(4),/*个人代码 */
RiQi smalldatetime,/*执行日期 */
YuanYin_id char(1) null,/*变动原因代码 */
JinE smallmoney)/*技能工资金额 */
该表存储着某单位员工多年来技能工资的历史档案。
例1.如果要查询全体员工的技能工资变动历史,则可先建立一个存储过程p-RsGz-JiNeg-All:
create procedure p_RsGz_JiNeng_All as
select *
from RS_LS_GZ_JiNeng
order by GeRenid,RiQi
然后用批处理语句调用存储过程p_RsGz_JiNeng_All进行查询:
execute p_RsGz_JiNeng_All
本例只显示查询到的数据,无输入、输出参量,是最简单的一个存储过程。 [page]
例2.如果要查询某人技能工资的变动历史,可建立另一个存储过程p_RsGz_JiNeng:
create procedure p_RsGz_JiNeng @c_GeRenId char(4)
as
select *from RS_LS_GZ_JiNeng
where GeRen_id=@c_GeRenId
order by RiQi
之后用批处理语句调用存储过程p_Rs_Gz_JiNeng进行查询:
declare @GeRenId char(4)
select @GeRenId=“0135”/*设要查询员工的个人代码为“0135” */
execute p_RsGz_JeNeng @c_GeRenId=@GeRenId
存储过程p_RsGz_JiNeng中定义了一个形参@c_GeRenId,是字符型变量,
在调用该过程的批处理中,既可以用具体的值也可以用变量作为实参。用变量作实参(如本例)时,必须用del are语句加以说明。值得注意的是,在批处理的调用过程语句中,@c_GeRenId=@GeRenId中的@ c_GeRenId是存储过程p_RsGz_JiNeng中的形参名,不是批处理中的变量,所以不能将它列入d eclare语句的变量单中。
例3.如果要计算当月工资,就必须从工资历史中查出员工距离当前最近的一次技能工资变动的结果:
create procedure p_RsGz_JiNeng_Slt
(@c_GeRenId char(4),@sm_JinE smallmoney output)
as
select @sm_JinE=JinE
from RS_LS_GZ_JiNeng
where RiQi=(select max(RiQi)
from RS_LS_GZ_JiNeng
where GeRenid=@c-GeRenId)/*找出历史记录中距离当前最近的日期*/
调用存储过程p_RsGz_JiNeng_Slt进行查询:
declare @GeRenId char(4),@JinE smallmoney
select @GeRenid=“0135”/*设要查询员工的个人代码为“0135”*/
select @JinE=0
execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId,
@sm_JinE=@ JinE output
这里,变量 @JinE用来存储过程形参@sm_JinE传回的金额。在调用过程语句中,@sm_JiE = @JinE output中的output不可省略。否则,变量@JinE将得不到形参传回的数值而始终为零(等于初值)。 [page]
例4.查到了个人代码为“0135”员工的技能工资就显示其历史纪录,查不到则显示一条出错信息。
create procedure p_RsGz_JiNeng_Rtn
@c_GeRenId char(4)
as
declare @ErrCode smallint
select @ErrCode=0
if exists(select* from RS-LS-GZ-JiNeng
where GeRenid=@c-GeRenId)
begin
select * from RS_LS_GZ_JiNeng
whrer GeRen_id=@c_GeRenId
order by RiQi
return @ErrCode
end esle
begin
select @ErrCode=1
return @ErrCode
end
调用存储过程p_RsGz_JiNeng_Rtn:
declare @GeRenId char(4),@RtnCode smallint
select @GeRenId=“0135”
select @RtnCode=0
execute @RtnCode=p_RsGz_JiNeng_Rtn @c_GeRenId=@GeRenId
if @RtnCode=1
print“No this one!”
存储过程p_RsGz_JiNeng_Rtn向调用者返回一个存储在变量@ErrCode里的值,这个值被称为状态值,它向调用者反映存储过程执行的成败状态。在本例中,如果查不到指定员工技能工资的任何记录时,就认为“查无此人”,返回出错状态值1。否则,返回成功状态值0。
调用过程的批处理语句使用变量@RtnCode存储返回的状态值,一旦检出存储过程p_RsG_ JiNeng_Rtn返回了错误标志(@RtnCode=1),就显示一条信息“No this one!”。
小结
上述四个例子简要介绍了存储过程常用的几种形式,从中我们已经可以领略到它的编程特色以及使用上的灵活性和方便性。虽然上述例子在调用存储过程时都是用SQL的批处理语句实现的,但并不意味着这是唯一的方法。例如在存储过程中调用存储过程(即所谓过程嵌套)的现象就很常见。另外,在其它Sybase数据库开发系统 (如PowerBuilder)的 script语句中调用Sybase的存储过程也非常普遍。
篇2:sybase存储过程问题
问:SYBASE存储过程,为什么执行到这一句就不执行了
select @nSerialNo = serialno from schedule where phonenum= @strPhoneNum and type = @nTypeif @@rowcount = 0
begin
...
end
else
begin
...
end
上面的select结果是空记录集,存储过程一执行到空记录集,就会返回?
答:if exists(select @nSerialNo = serialno from schedule where phonenum= @strPhoneNum and type = @nType)这个语句的逻辑有点问题?
if exists 一般是用来确定是否存在类似的记录?你现在又要将存在的结果赋值?其实还不如写 if exists(select 1 from schedule where phonenum= @strPhoneNum and type = @nType)
确定是否存在这样的记录,在执行相应的处理,
sybase存储过程问题
,
篇3:sybase的存储过程
存储过程是存储在服务器端的一类数据库对象,它实质上是一段用SQL语言编写的程序,它在服务器端预先经过编译,并确定出执行计划,因此与同样功能的批处理语句相比,它的执行速度较快,
基本语法:
Create Procedure[owner.]过程名
[@参数名 数据类型[=默认值][Output]]
[,@参数名 数据类型[=默认值][Output]]
[……]
AS
Begin
SQL语句(块)
End
存储过程是数据库对象,和表、索引是一个级别的;是SQL语句和控制流语言的集合,存储过程在首次运行时被编译,并驻留在过程高速缓存的内存中,所以存储过程的招待非常快。存储过程可以带参数,可以调用其他过程,返回状态值,返回参数值,并且可以在远程SQL Server执行。可以在远程SQL Server执行对数据库设计有特别重要的意义。SQL Server提供的存储过程称为系统过程。
存储过程大大增强了SQL的能力、效率和灵活性,经过编译的存储过程极大地改善SQL语句和批处理的性能。
存储过程有很多优点:
●存储过程在第一次执行时编译,并存储在过程高速缓存的内存中。编译时系统对其进行优化,以选择最佳的路径来访问数据集中的数据,这种优化考虑了数据集的实际数据结构。因此存储过程大大提高了系统的性能。
●存储过程可以跨服务器运行。这一点是通过触发器来实现的,当然,首先存储过程要能登录到该远程服务器。
●应用程序也能执行存储过程,从而实现服务器和客户之间的协同作业。
●存储过程减少了网络的交通。这是因为存储过程的文本存储在数据库里,调用存储过程时通过网络的只是存储过程的过程名。
●利用存储过程可以提供一个附加的安全层。
如(该例子取自pubs2数据库):
Create proc titleid_proc(@title_id varchar(80))
As
Begin
Select @title_id=lower(@title_id) ”%”
Select title,title_id,price
Form. titles
Where lower(title_id) like @title_id
Return @@rowcount
End
注意例子中的黑体部分,这实际上是一条赋值语句。该存储过程有返回值。
存储过程可以变得非常复杂。我们认为,创建存储过程还是要遵循“最简单就是最好”的原则。建议在创建存储过程时采用缩进风格,否则创建的存储过程三天之后连自己都看不懂。
需要对存储过程作些说明:
●Create procedure 语句不能和其他语句在同一个批命令里,
●Create procedure 语句不能包括下列语句:
use
Create View
Create default
Create rule
Create trigger
Create procedure
不能使用use语句好理解,存储过程是针对数据库的,不能在一个数据库里访问另外的数据库。如果在存储过程里访问另外的数据库,则数据库表的参照完整性难于得到保障。
从另外几条语句看,在存储过程里一般不能创建新的数据库对象。但可以创建表和索引,以及和表相关联的键,表是临时表,在存储过程结束后不能看见创建的临时表;否则的话每运行一次存储过程就创建一个表,结果可想而知。
存储过程里不能创建一个对象,删除它;然后又在同一存储过程里用相同的名字创建新的对象。实际上,SQL Server在存储过程运行时而不是在编译时创建对象的。
●如果存储过程调用另外的存储过程,则第二个存储过程可以调用在第一个存储过程里创建的对象。
●存储过程包含的最多参数为255个,对存储过程里的局部和全局变量没有限制。
最后讨论一下系统存储过程。系统存储过程以sp_开头,当然用户创建的存储过程也可以以sp_开头;系统过程保存在sybsystemprocs数据库里。系统过程的使用有权限,如果打入系统过程名但没有出现预期的结果,要么是命令名错,要么是使用者没有该过程的权限。一般可通过系统管理员或数据库所有者对系统过程的execute授权。
系统过程繁多,大致有几类:
a. 用户标志和授权。这一类的过程主要由于:增加、删除或报告在SQL Server上的登录,增加、删除或报告某数据库的用户、分组或别名等。这类过程有sp_addlogin,sp_adduser,sp_helpgroup,sp_dropuser等。
b. 远程过程的调用。这类过程用于:增加、删除或报告能存取本SQL Server的远程服务器;增加能从远程服务器上存取本SQL Server的用户名。这类过程有:sp_addremotelogin,sp_addserver,sp_dropserver等。
c. 数据定义和数据库对象。这类存储过程用于:连接和定义规则和缺省值,增加、删除或报告主码、外码和公共码;增加、删除或报告用户定义的数据类型。这类存储过程有:sp_bindfault, sp_bindrule, sp_help, sp_helpdb, sp_foreignkey, sp_helptext等。
d. 系统管理。这类存储过程用于:增加、删除或报告数据库及转储设备;报告锁;设置的数据库选择及用户正进行的进程;修改及报告配置变量;监控SQL Server的活动。这类过程有:sp_addumpdevice,sp_dropdevice, sp_helpdevice等。
篇4:Sybase存储过程点滴
Sybase存储过程点滴
使用存储过程来执行DDL语句,
CREATE OR REPLACEPROCEDURE CNTL_DATA.alt_tbl(altsql IN varchar2) ISStoO_error INTEGER;StoO_errmsg VARCHAR2(255);BEGIN execute immediate altsql;EXCEPTION WHEN others THENStoO_error := SQLCODE;StoO_errmsg := SQLERRM;RAISE_APPLICATION_ERROR(SQLCODE, SQLERRM,TRUE);END alt_tbl;使用循环FOR rciKorMaps IN (select regexp_substr(rciKorMapId,'[^,]+',1, level) as ids from dual connect by regexp_substr(rciKorMapId,'[^,]+',1, level) is not null)LOOP QueryEnd loop输出行dbms_output.put_line(SubStr('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM , 1 , 255));事务例子ISPRAGMA AUTONOMOUS_TRANSACTION;BEGIN INSERT INTO CNTL_DATA.cntl_log values (seq_cntl_log.nextval, in_job_id, proc_name|| msg, sysdate) ; COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line('error:-->' || SQLCODE || ', ERR:-->' || SQLERRM ); ROLLBACK;END;
篇5:数据库面试题:存储过程
存储过程和函数的区别是什么?
答:存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。
而函数通常是数据库已经定义的方法,它接收参数并返回某种类型的值,并且不涉及特定用户表,例如聚集函数avg、max、count等,日期时间单数day、month等。
PL/SQL(Procedural Language/SQL, PL/SQL)是编写数据库存储过程的一种过程语言,它结合了SQL的数据操纵能力
和过程化语言的流程控制能力,是SQL的过程化扩展。
综上PL/SQL就是对数据的操纵过程化
存储过程的优点
它是由PL/SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只要调用即可。
1、由于存储过程不像解释执行的SQL语句那样在提出操作请求时才进行语法分析和优化工作,因而运行效率高,
它提供了在服务器端快速执行SQL语句的有效途径。
2、存储过程降低了客户机和服务器之间的通信量。客户机上的应用程序只要通过网络向服务器发出存储过程的名字和参数,就可以让RDBMS执行许多条的SQL语句,并执行数据处理。只有最终处理结果才返回客户端。
3、方便实施企业规则。可以把企业规则的运算程序写成存储过程放入数据库服务器中,由RDBMS管理,既有利于集中控制,又能方便地进行维护。当用户规则发生变化时,只需要修改存储过程,无需修改其他应用程序。
[数据库面试题:存储过程]
篇6:Sybase ASA中几个非常有用的存储过程
Sybase ASA中几个非常有用的存储过程
以下过程非常实用:
1. Send UDP包到指定地址:
sa_send_udp
CALL sa_send_udp( '10.25.99.196', 2345', 'This is a test' );
2. 获取当前系统中活跃的事务列表:
call sa_transactions( )
3. 有用的tsql 环境设置
CREATE PROCEDURE dbo.sp_tsql_environment
BEGIN
IF db_property( 'IQStore' ) = 'Off' THEN
-- SQL Anywhere datastore
SET TEMPORARY OPTION close_on_endtrans='OFF';
END IF;
SET TEMPORARY OPTION ansinull='OFF';
SET TEMPORARY OPTION tsql_variables='ON';
SET TEMPORARY OPTION ansi_blanks='ON';
SET TEMPORARY OPTION chained='OFF';
SET TEMPORARY OPTION quoted_identifier='OFF';
SET TEMPORARY OPTION allow_nulls_by_default='OFF';
SET TEMPORARY OPTION on_tsql_error='CONTINUE';
SET TEMPORARY OPTION isolation_level='1';
SET TEMPORARY OPTION date_format='YYYY-MM-DD';
SET TEMPORARY OPTION timestamp_format='YYYY-MM-DD HH:NN:SS.SSS';
SET TEMPORARY OPTION time_format='HH:NN:SS.SSS';
SET TEMPORARY OPTION date_order='MDY';
SET TEMPORARY OPTION escape_character='OFF';
END
4. 执行操作系统命令
xp_cmdshell system procedure
Carries out an operating system command from a procedure.
xp_cmdshell( 'dir >c:\temp.txt', 'no_output' )
5. 读取写入文件
xp_read_file
xp_write_file
6. 获取某一个表的 DDL语句
sa_get_table_definition system procedure
select row_value from sa_split_list( sa_get_table_definition('DBA', 'ttt'), char(10));
row_value
CREATE TABLE “DBA”.“ttt” (
“abc” timestamp NULL
)
;
7. 发送邮件
CALL xp_startsmtp( smtp_sender = 'xxx@163.com', smtp_server='smtp.163.com', smtp_port='25',
timeout=240, smtp_auth_username='iihero', smtp_auth_password='***');
CALL xp_sendmail( recipient='xxxx@gmail.com',
subject='New Pricing');
call xp_stopmail();
篇7:存储过程在数据库中的作用
第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快,
第二:存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。
第三:存储过程运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。
第四:存储过程主要是在服务器上运行,减少对客户机的压力。
第五:存储过程可以包含程序流、逻辑以及对数据库的查询,
同时可以实体封装和隐藏了数据逻辑。
第六:存储过程可以在单个存储过程中执行一系列 SQL 语句。
第七:存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
其实存储过程还可以控制权限,比如一个表不直接允许用户直接访问,但要求允许用户访问和修改其中一个或多个字段,那就可以通过一个存储过程来实现并允许该用户使用该存储过程。
还有,如果多条SQL语句执行过程中,过程环节返回了数据作为后面环节的输入数据,如果直接通过SQL语句执行,势必导致大量的数据通过网络返回到客户机,并在客户机运算;如果封装在存储过程中,则将运算放在服务器进行,不但减少了客户机的压力,同时也减少了网络流量,提高了执行的效率。
★ 建立模板
Sybase数据库中存储过程的建立和使用(合集7篇)




