存储过程访问不了包?关于存储过程中连接数据库问题
一、怎么使用存储过程
问题一:SQL中存储过程怎么使用? sql存储过程及应用
一、简介:
存储过程(Stored Procedure),是一组为了完成特定功能的SQL语句,集经编译后
存储在数据库中,用户通过指定存储过程的名字并给出参数,如果该存储过程带有参数来执行
它,
在SQL Server的系列版本中,存储过程分为两类:系统提供的存储过程和用户自定义存储过程
。
系统SP,主要存储master数据库中,并以sp_为前缀并且系统存储过程主要是从系统表中获取
信息,从而为系统管理员管理SQL Server。用户自定义存储过程是由用户创建,并能完成
某一特定功能,如:查询用户所需数据信息的存储过程。
存储过程具有以下优点
1.存储过程允许标准组件式编程(模块化设计)
存储过程在被创建以后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句,而
且数
据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响。因为应用程序源代
码只包含存
储过程的调用语句,从而极大地提高了程序的可移植性。
2.存储过程能够实现快速的执行速度
如果某一*作包含大量的Transaction-SQL代码,,或分别被多次执行,那么存储过程要比批处理
的
执行速度快很多,因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进
行分析优
化,并给出终被存在系统表中的执行计划,而批处理的Transaction-SQL语句在每次运行时
都要进行
编译和优化,因此速度相对要慢一些。
3.存储过程能够减少网络流量
对于同一个针对数据数据库对象的*作,如查询修改,如果这一*作所涉及到的Transaction-SQL
语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调
用语句,否
则将是多条SQL语句从而大大增加了网络流量降低网络负载。
4.存储过程可被作为一种安全机制来充分利用
系统管理员通过,对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的
限
制。
二、变量
@I
三、流程控制语句(if else| select case| while)
Select... CASE实例
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
四、存储过程格式
创建存储过程
Create Proc dbo.存储过程名
存储过程参数
AS
执行语句
RETURN
执行存储过程
GO
*********************************************************/
--变量的声明,sql里面声明变量时必须在变量前加@符号
DECLARE@I INT
--变量的赋值,变量赋值时变量前必须加set
SET@I= 30
--声明多个变量
DECLARE@s varchar(10),@a INT
-- Sql里if语句
IF条件 BEGIN
执行语句
END
ELSE BEGIN
......>>
问题二:SQL存储过程如何调用存储过程?在存储过程里用exec执行另一存储过程名及它需要的参数就可以了
如 exec抚abc'1','2'(abc是存储过程的名字,'1','2'是它的参数
问题三:oracle中的存储过程,有什么作用,以及怎么在代码中使用?楼上也不知道从哪扒下来的,一看LZ就是初学,举点例子不行吗?
比如建立个测试表
create table test(id int,name varchar2(10),counts int); insert into test values(1,'张三',100);insert into test values(2,'李四',200); mit;
现在给你出个题目是
查询所有人加在一起的counts是多少
创建存储过程
create or replace p_test--创建存储过程,asv_counts int;--定义变量begin--开始select sum(counts) into v_counts from test;--将得到的结果放到变量里DBMS_OUTPUT.PUT_LINE(v_counts);--将结果打印输出end;--结束
执行这种不带输入参数的
begin p_test;end;
然后你检查下结果
再给你创建一个带输入参数的
题目是,查询id为1的人名是什么
create or replace p_test1(v_id int)asv_name varchar2(10);beginselect name into v_name from test where id=v_id;DBMS_OUTPUT.PUT_LINE(v_name);end;
执行时这样
beginp_test1(1);end;
第2个我没给你写注释,你看你自己应该能理解吧
补充一下,存储过程不一定只是执行查询,也可以做删除或者修改等sql语句,总体来说就是几个或N个sql语句的***,来完成系统内某些特定的需求,这些需求可以是一个sql搞定的,也可以是多个sql组合的
问题四:sql server怎么调用存储过程在SQL Server数据库的维护或者Web开发中,有时需要在存储过程或者作业等其他数据库*作中调用其它的存储过程,下面介绍其调用的方法
在SQL Server数据库的维护或者Web开发中,有时需要在存储过程或者作业等其他数据库*作中调用其它的存储过程,下面介绍其调用的方法
一、SQL SERVER中调用不带输出参数的存储过程
SQL代码
--存储过程的定义
create procedure [sys].[sp_add_product]
(
@m_viewcount int= 0
,@m_hotcount int= 0
)
as
go
--存储过程的调用
declare@m_viewcount int
declare@m_hotcount int
exec sp_add_product@m_viewcount,@m_hotcount
二、SQL SERVER中调用带输出参数的存储过程
SQL代码
--定义存储过程
create procedure [sys].[sp_add_product]
(
@m_viewcount int= 0
,@m_hotcount int output
)
--存储过程的调用
declare@m_viewcount int=0
declare@m_hotcount int
exec dbo.sp_add_product@m_viewcount,@m_hotcount output
问题五:怎样调用存储过程里面的存储过程这里一定要用Closed,因为其他非Closed状态再执行Open时会引发不能重复开启的异常
if(sqlConn.State!= ConnectionState.Closed)
sqlConn.Open();
Sqlmand sqlCmd= new Sqlmand();
sqlCmd.Connection= sqlConn;
sqlCmd.mandText= proc_history;
sqlCmd.mandType= mandType.StoredProcedure;sqlCmd.Parameters.Add(new SqlParameter(@like, NewTitle));
如果要返回数据集,则不要调用sqlCmd.ExecuteNonQuery();,直接调用下面的方法
SqlDataAdapter sqlDA= new SqlDataAdapter(sqlCmd);
DataSet ds= new DataSet();
sqlDA.Fill(ds);
return ds;
如果是执行DML语句,就直接调用如下
sqlCmd.ExecuteNonQuery();
/*以上两种情况不可同时存在*/
问题六:怎么在PL/SQL Developer中调用存储过程呢?看你存储过程里是否有参数了
正常的话,在左边列表找到procedure里找到你写的那存储过程名,看上边有红叉没,没红叉就是编译成功,有红叉就是还有问题,需要改
然后右键点这个存储过程,(中文版选择测试按钮,英文版选择test按钮),然后下边有输入参数的地方,输入,点上边的齿轮即可
还有种方法,就是开一个sql窗口,写以下代码
begin
存储过程名;
end;
然后点齿轮运行,注意两个分号不可少
问题七:数据库中的存储过程怎么用啊!!求解..... 10分关键字:procedure
例子:
SQL> create [or replace] procedure procedure_name is
begin
--开始执行
insert into test('10001','Visket');
end;
/
以上*作就能为test表添加一条信息
执行存储过程procedure用的命令是exec
记住存储过程中,语句结尾一定要有分号
问题八:ORACLE存储过程怎么调用? PL/SQL SQL窗口输入存储过程名,右键测试(英文版为test唬,出现测试界面,输入对应参数后F8,如果没有参数直接F8.
问题九:存储过程中怎么使用row一般分为十种情况,每种语法各不相同: 1、创建语法create proc| procedure pro_name [{@参数数据类型} [=默认值] [output],{@参数数据类型} [=默认值] [output],.... ]as SQL_statements2、创建不带参数存储过程--创建存储过程if(exists(select* from sys.objects where name='proc_get_student')) drop proc proc_get_studentgocreate proc proc_get_studentas select* from student;--调用、执行存储过程exec proc_get_student;3、修改存储过程--修改存储过程alter proc proc_get_studentasselect* from student;4、带参存储过程--带参存储过程if(object_id('proc_find_stu','P') is not null) drop proc proc_find_stugocreate proc proc_find_stu(@startId int,@endId int)as select* from student where id between@startId and@endIdgoexec proc_find_stu 2, 4;5、带通配符参数存储过程--带通配符参数存储过程if(object_id('proc_findStudentByName','P') is not null) drop proc proc_findStudentByNamegocreate proc proc_findStudentByName(@name varchar(20)='%j%',@nextName varchar(20)='%')as select* from student where name like@name and name like@nextName;goexec proc_findStudentByName;exec proc_findStudentByName'%o%','t%';6、带输出参数存储过程if(object_id('proc_getStudentRecord','P') is not null) drop proc proc_getStudentRecordgocreate proc proc_getStudentRecord(@id int,--默认输入参数@name varchar(20) out,--输出参数@age varchar(20) output--输入输出参数)as select@name= name,@age= age from student where id=@id and sex=@age;go-- declare@id int,@name varchar(20),@temp varchar(20)......>>
问题十:如何使用sql语句查看存储过程--下面这条语句可以查看存储过程具体代码exec sp_helptext存储过程名--下面这条语句查看数据库中有哪些存储过程select* from sysobjects where type='P'
二、存储过程和函数的区别
一、含义不同
1、存储过程:存储过程是 SQL语句和可选控制流语句的预编译**,以一个名称存储并作为一个单元处理。
2、函数:是由一个或多个 SQL语句组成的子程序,可用于封装代码以便重新使用。函数限制比较多,如不能用临时表,只能用表变量等
二、使用条件不同
1、存储过程:可以在单个存储过程中执行一系列 SQL语句。而且可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
2、函数:自定义函数诸多限制,有许多语句不能使用,许多功能不能实现。函数可以直接引用返回值,用表变量返回记录集。但是,用户定义函数不能用于执行一组修改全局数据库状态的*作。
三、执行方式不同
1、存储过程:存储过程可以返回参数,如记录集,函数只能返回值或者表对象。存储过程的参数有in,out,inout三种,存储过程声明时不需要返回类型。
2、函数:函数参数只有in,而函数需要描述返回类型,且函数中必须包含一个有效的return语句。
参考资料链接:百度百科-存储过程
参考资料链接:百度百科-函数
三、关于存储过程中连接数据库问题
存储过程的概念
SQL Server提供了一种方法,它可以将一些固定的*作集中起来由SQL Server数据库服务器来完成,以实现某个任务,这种方法就是存储过程。
存储过程是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创建存储过程的语法参数的意义如下:
procedure_name:用于指定要创建的存储过程的名称。
number:该参数是可选的整数,它用来对同名的存储过程分组,以便用一条 DROP PROCEDURE语句即可将同组的过程一起除去。
@parameter:过程中的参数。在 CREATE PROCEDURE语句中可以声明一个或多个参数。
data_type:用于指定参数的数据类型。
VARYING:用于指定作为输出OUTPUT参数支持的结果集。
Default:用于指定参数的默认值。
OUTPUT:表明该参数是一个返回参数。
例如:下面创建一个简单的存储过程productinfo,用于检索产品信息。
USE Northwind
if exists(select name from sysobjects
where name='productinfo' and type='p')
drop procedure productinfo
GO
create procedure productinfo
as
select* from products
GO
通过下述sql语句执行该存储过程:execute productinfo
即可检索到产品信息。
执行存储过程
直接执行存储过程可以使用EXECUTE命令来执行,其语法形式如下:
[[EXEC[UTE]]
{ [@return_status=]
{procedure_name[;number]|@procedure_name_var} [[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]}
[,...n]
[ WITH RECOMPILE ]
使用 EXECUTE命令传递单个参数,它执行 showind存储过程,以 titles为参数值。showind存储过程需要参数(@tabname),它是一个表的名称。其程序清单如下:
EXEC showind titles
当然,在执行过程中变量可以显式命名:
EXEC showind@tabname= titles
如果这是 isql脚本或批处理中第一个语句,则 EXEC语句可以省略:
showind titles或者showind@tabname= titles
下面的例子使用了默认参数
USE Northwind
GO
CREATE PROCEDURE insert_Products_1
(@SupplierID_2 int,
@CategoryID_3 int,
@ProductName_1 nvarchar(40)='无')
AS INSERT INTO Products
(ProductName,SupplierID,CategoryID)
VALUES
(@ProductName_1,@SupplierID_2,@CategoryID_3)
GO
exec insert_Products_1 1,1
Select* from Products where SupplierID=1 and CategoryID=1
GO
下面的例子使用了返回参数
USE Northwind
GO
CREATE PROCEDURE query_products
(@SupplierID_1 int,
@ProductName_2 nvarchar(40) output)
AS
select@ProductName_2= ProductName from products
where SupplierID=@SupplierID_1
执行该存储过程来查询SupplierID为1的产品名:
declare@product nvarchar(40)
exec query_products 1,@product output
select'产品名'=@product
go
查看存储过程
存储过程被创建之后,它的名字就存储在系统表sysobjects中,它的源代码存放在系统表syscomments中。可以使用使用企业管理器或系统存储过程来查看用户创建的存储过程。
使用企业管理器查看用户创建的存储过程
在企业管理器中,打开指定的服务器和数据库项,选择要创建存储过程的数据库,单击存储过程文件夹,此时在右边的页框中显示该数据库的所有存储过程。用右键单击要查看的存储过程,从弹出的快捷菜单中选择属性选项,此时便可以看到存储过程的源代码。
使用系统存储过程来查看用户创建的存储过程
可供使用的系统存储过程及其语法形式如下:
sp_help:用于显示存储过程的参数及其数据类型
sp_help [[@objname=] name]
参数name为要查看的存储过程的名称。
sp_helptext:用于显示存储过程的源代码
sp_helptext [[@objname=] name]
参数name为要查看的存储过程的名称。
sp_depends:用于显示和存储过程相关的数据库对象
sp_depends [@objname=]’object’
参数object为要查看依赖关系的存储过程的名称。
sp_stored_procedures:用于返回当前数据库中的存储过程列表
修改存储过程
存储过程可以根据用户的要求或者基表定义的改变而改变。使用ALTER PROCEDURE语句可以更改先前通过执行 CREATE PROCEDURE语句创建的过程,但不会更改权限,也不影响相关的存储过程或触发器。其语法形式如下:
ALTERPROC[EDURE]procedure_name[;number]
[{@parameterdata_type}
[VARYING][=default][OUTPUT]][,...n] [WITH
{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS
sql_statement [...n ]
重命名和删除存储过程
1.重命名存储过程
修改存储过程的名称可以使用系统存储过程sp_rename,其语法形式如下:
sp_rename原存储过程名称,新存储过程名称
另外,通过企业管理器也可以修改存储过程的名称。
删除存储过程
删除存储过程可以使用DROP命令,DROP命令可以将一个或者多个存储过程或者存储过程组从当前数据库中删除,其语法形式如下:
drop procedure{procedure} [,…n]
当然,利用企业管理器也可以很方便地删除存储过程。
存储过程的重新编译
在我们使用了一次存储过程后,可能会因为某些原因,必须向表中新增加数据列或者为表新添加索引,从而改变了数据库的逻辑结构。这时,需要对存储过程进行重新编译,SQL Server提供三种重新编译存储过程的方法:
1、在建立存储过程时设定重新编译
语法格式:CREATE PROCEDURE procedure_name WITH RECOMPILE AS sql_statement
2、在执行存储过程时设定重编译
语法格式: EXECUTE procedure_name WITH RECOMPILE
3、通过使用系统存储过程设定重编译
语法格式为: EXEC sp_recompile OBJECT
系统存储过程与扩展存储过程
1.系统存储过程
系统存储过程存储在master数据库中,并以sp_为前缀,主要用来从系统表中获取信息,为系统管理员管理SQL Server提供帮助,为用户查看数据库对象提供方便。比如用来查看数据库对象信息的系统存储过程sp_help、显示存储过程和其它对象的文本的存储过程sp_helptext等。
2.扩展存储过程:
扩展存储过程以xp_为前缀,它是关系数据库引擎的开放式数据服务层的一部分,其可以使用户在动态链接库(DLL)文件所包含的函数中实现逻辑,从而扩展了Transact-SQL的功能,并且可以象调用Transact-SQL过程那样从Transact-SQL语句调用这些函数。
例:利用扩展存储过程xp_cmdshell为一个*作系统外壳执行指定命令串,并作为文本返回任何输出。
执行代码:
use master
exec xp_cmdshell'dir*.exe'
执行结果返回系统目录下的文件内容文本信息。
后给大家举一个例子:
QUOTE:
/**
1、在Northwind数据库中,创建一个带查询参数的存储过程,
要求在输入一个定购金额总额@total时,查询超出该值的所
有产品的相关信息,包括产品名称和供应商名称、单位数量、
单价、以及该产品的定购金额总额,并通过一个输出参数返回
满足查询条件的产品数
**/
IF exists(select* from SysObjects where name='more_than_total' and type='p')
drop procedure more_than_total
go
CREATE PROCEDURE More_Than_Total
@total money= 0
AS
Declare@amount **allint
BEGIN
select distinct
P.productName,
S.contactName,
P.UnitPrice
from Products P inner join [order Details] O
on p.productID=o.productID inner join suppliers s
on p.supplierID=s.SupplierID
where O.productID in
(select productID
from [order Details]
group by productId
having sum(quantity*unitprice)>@total
)
END
GO