c存储过程返回多个
1. 存储过程中调用带返回值的函数
如果是ACCESS、Mysql、SQL 2000 数据库
SELECT * FROM tabel_ WHERE date < (now()-30)
数据库都自带很多函数的
2. mysql 与oracle中的存储过程及函数有什么区别,尽可能详细哦
本质上没区别。只是函数有如:只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。执行的本质都一样。
函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少
由于我现在基本上是DBA的工作,因此平时也看一些数据库方面的书籍。但是我一直对存储过程和函数之间的区别掌握不透。我向来认为存储过程可以实现的操作,函数也一样可以实现。最近,刚好大学的老师给我们上SQL-Server的课程,我对这个问题的疑惑终于慢慢解开。今天晚上顺便看了些网上的资料,觉得以下分析比较合理:
1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
2. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。
3. 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
4. 当存储过程和函数被执行的时候,SQL Manager会到procere cache中去取相应的查询语句,如果在procere cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译。
Procere cache中保存的是执行计划 (execution plan) ,当编译好之后就执行procere cache中的execution plan,之后SQL SERVER会根据每个execution plan的实际情况来考虑是否要在cache中保存这个plan,评判的标准一个是这个execution plan可能被使用的频率;其次是生成这个plan的代价,也就是编译的耗时。保存在cache中的plan在下次执行时就不用再编译了。
存储过程和用户自定义函数具体的区别
存储过程
存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。
存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点:
可以在单个存储过程中执行一系列 SQL 语句。
可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。
用户定义函数
函数是由一个或多个 Transact-SQL 语句组成的子程序,可用于封装代码以便重新使用。Microsoft? SQL Server? 2000 并不将用户限制在定义为 Transact-SQL 语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
可使用 CREATE FUNCTION 语句创建、使用 ALTER FUNCTION 语句修改、以及使用 DROP FUNCTION 语句除去用户定义函数。每个完全合法的用户定义函数名 (database_name.owner_name.function_name) 必须唯一。
必须被授予 CREATE FUNCTION 权限才能创建、修改或除去用户定义函数。不是所有者的用户在 Transact-SQL 语句中使用某个函数之前,必须先给此用户授予该函数的适当权限。若要创建或更改在 CHECK 约束、DEFAULT 子句或计算列定义中引用用户定义函数的表,还必须具有函数的 REFERENCES 权限。
函数中的有效语句类型包括:
DECLARE 语句,该语句可用于定义函数局部的数据变量和游标。
为函数局部对象赋值,如使用 SET 给标量和表局部变量赋值。
游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。不允许使用 FETCH 语句将数据返回到客户端。仅允许使用 FETCH 语句通过 INTO 子句给局部变量赋值。
控制流语句。
SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部 table 变量。
EXECUTE 语句,该语句调用扩展存储过程。
在查询中指定的函数的实际执行次数在优化器生成的执行计划间可能不同。示例为 WHERE 子句中的子查询唤醒调用的函数。子查询及其函数执行的次数会因优化器选择的访问路径而异
3. 该如何写存储过程,实现mysql返回多个结果,其中的结果可能为空
就跟写Java代码里有返回值的方法一样,只是把语法换成Sql里面的写法就好了
aaa: 输入参数
bbb: 输出参数,一个表对象,或者一个结果集
包
proce getMySqlDate(aaa IN varchar2,
bbb OUT tmpTable%ROWTYPE) IS
本体
proce getMySqlDate(aaa IN varchar2,
bbb OUT tmpTable%ROWTYPE)
begin
--查询数据
CURSOR curCc is
select a,b from tab1;
type typeCurCc of table curCc%ROWTYPE;
typeCurCc tabCurCc; -- 定义游标类型
--打开游标把查询处理的数据,赋值到bbb的输出参数就行了。
open 游标
....
bbb.a = 游标.a;
close 游标;
--存储过程终了
END getMysql;
4. 如何调用一个Oracle存储过程返回一个或多个REF游标,使用ADO从C
代码如下:
CREATE OR REPLACE PROCEDURE P_TESTB
AS
VARCURSOR SYS_REFCURSOR;
R USERS%ROWTYPE;
BEGIN
P_TESTA(VARCURSOR);
LOOP
FETCH VARCURSOR INTO R;
EXIT WHEN
VARCURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(R.NAME);
END LOOP;
END
P_TESTB;
5. 1,存储过程和函数的区别
存储过程和函数目的是为了 可重复地 执行操作数据库的sql语句的集合。
区别是写法和调用上。
写法上:存储过程的参数列表可以有输入参数、输出参数、可输入输出的参数;
函数的参数列表只有输入参数,并且有return <返回值类型,无长度说明>。
返回值上:
存储过程的返回值,可以有多个值,
函数的返回值,只有一个值。
调用方式上:
存储过程的调用方式有:
1)、exec <过程名>;
2)、execute <过程名>;
3)、在PL/SQL语句块中直接调用。
函数的调用方式有:
在PL/SQL语句块中直接调用。
具体分为:
----调用FUNCTION add_three_numbers
----1. 位置表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(2,4,5));
END;
----2. 命名表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(b=>3, a=>4,c=>2));
END;
----3. 混合使用位置表示法和命名表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(3, b=>4,c=>2));
END;
----4. 排除表示法
BEGIN
dbms_output.put_line(add_three_numbers(12,c=>2));
END;
----5. sql调用表示法 --混合表示法
SELECT add_three_numbers(3, b=>4,c=>2) FROM DUAL;
----1. 该函数接受3个可选参数,返回3个数字的和
CREATE OR REPLACE FUNCTION add_three_numbers
(
a NUMBER:=0, b NUMBER:=0, c NUMBER:=0
)
RETURN NUMBER IS
BEGIN
RETURN a+b+c;
END;
存储过程:
基本语法:
create procere <过程名>(<参数列表,无参时忽略>)
as|is
变量声明、初始化
begin
业务处理、逻辑代码
exception
异常捕获、容错处理
end <过程名>;
参数:<参数名> in|out|in out <参数类型,无长度说明> ,如:v_name varchar2
in:入参
out:出参
in out:出入参
注:as|is表示as或is
调用语法:
1)、exec <过程名>;
2)、execute <过程名>;
3)、在PL/SQL语句块中直接调用。
例:
create or replace procere up_wap(v_param1 in out varchar2,v_param2 in out varchar2)
is
v_temp varchar2(20);
begin
dbms_output.put_line('交换前参数1:'||v_param1||' 参数2:'||v_param2);
v_temp:=v_param1;
v_param1:=v_param2;
v_param2:=v_temp;
dbms_output.put_line('交换后参数1:'||v_param1||' 参数2:'||v_param2);
exception
when others then dbms_output.put_line('There is a error when the procere up_wap executing!');
end up_wap;
/
-- 调用存储过程
declare
v_param1 varchar2(20):='param1';
v_param2 varchar2(20):='param2';
begin
up_wap(v_param1 => v_param1,v_param2 => v_param2);
end;
/
自定义函数(function)
基本语法:
create function <函数名>(<参数列表,无参时忽略>)
return <返回值类型,无长度说明>
as|is
变量声明、初始化
begin
业务处理、逻辑代码
return <返回的值>;
exception
异常捕获、容错处理
end <函数名>;
参数:in 入参
注:只有入参的类型。
在存储过程和自定义函数中的参数的传递(入参和出参)不能使用%type或%rowtype匹配,不能使用空值null,但是存储过程可以返回空值。
例:
create function uf_select_name_by_id_test(v_id in number)
return varchar2
is
v_name t_test.t_name%type;
begin
select t_name into v_name from t_test where t_id=v_id;
return v_name;
exception
when others then dbms_output.put_line('error');
end uf_select_name_by_id_test;
/
select uf_select_name_by_id_test(1) 姓名 from al;-- select调用
declare --pl/sql语句块调用
v_name varchar2(20);
begin
v_name:=uf_select_name_by_id_test(1);
dbms_output.put_line('name = '||v_name);
end;
/
6. 如何使用存储过程返回行集
简单的说,就是在对象模型中创建一个函数,让其映射到数据库中的存储过程。然后通过调用对象模型中的这个函数达到调用映射的那个存储过程的目的。
此演示代码首先给出了测试中用到的存储过程的定义,然后是映射函数的定义,同时也给出了结果类的代码。最后是调用函数并显示结果的代码。
存储过程的定义:
[vb] view plain
01.CREATE PROCEDURE [dbo].[CustomersByCity]
02. (@City NVARCHAR(20))
03.AS
04.BEGIN
05. -- SET NOCOUNT ON added to prevent extra result sets from
06. -- interfering with SELECT statements.
07. SET NOCOUNT ON;
08. SELECT CustomerID, ContactName, ContactTitle, City from Customers
09. as c where c.City=@City
10.END
映射到存储过程的函数如下:
[c-sharp] view plain
01.[Function(Name="dbo.CustomersByCity")]
02.public ISingleResult<CustomersByCityResult> CustomersByCity(
03. [Parameter(Name="City", DbType="NVarChar(20)")] string city)
04.{
05. IExecuteResult result = this.ExecuteMethodCall(this,
06. ((MethodInfo)(MethodInfo.GetCurrentMethod())), city);
07. return ((ISingleResult<CustomersByCityResult>)(result.ReturnValue));
08.}
结果类的定义如下,如果你注意观察的话,一定会发现结果类的列成员和存储过程中查询的数据列是相对应:
[c-sharp] view plain
01.[DataContract()]
02.public partial class CustomersByCityResult
03.{
04.
05. private string _CustomerID;
06.
07. private string _ContactName;
08.
09. private string _ContactTitle;
10.
11. private string _City;
12.
13. public CustomersByCityResult()
14. {
15. }
16.
17. [Column(Storage="_CustomerID", DbType="NChar(5) NOT NULL", CanBeNull=false)]
18. [DataMember(Order=1)]
19. public string CustomerID
20. {
21. get
22. {
23. return this._CustomerID;
24. }
25. set
26. {
27. if ((this._CustomerID != value))
28. {
29. this._CustomerID = value;
30. }
31. }
32. }
33.
34. [Column(Storage="_ContactName", DbType="NVarChar(30)")]
35. [DataMember(Order=2)]
36. public string ContactName
37. {
38. get
39. {
40. return this._ContactName;
41. }
42. set
43. {
44. if ((this._ContactName != value))
45. {
46. this._ContactName = value;
47. }
48. }
49. }
50.
51. [Column(Storage="_ContactTitle", DbType="NVarChar(30)")]
52. [DataMember(Order=3)]
53. public string ContactTitle
54. {
55. get
56. {
57. return this._ContactTitle;
58. }
59. set
60. {
61. if ((this._ContactTitle != value))
62. {
63. this._ContactTitle = value;
64. }
65. }
66. }
67.
68. [Column(Storage="_City", DbType="NVarChar(15)")]
69. [DataMember(Order=4)]
70. public string City
71. {
72. get
73. {
74. return this._City;
75. }
76. set
77. {
78. if ((this._City != value))
79. {
80. this._City = value;
81. }
82. }
83. }
84.}
7. 如何在存储过程中直接使用另一个存储过程返回的数据集
resultset
rs
=
cstmt.executequery();
callablestatement
自身就有一个返回是个结果集的方法
然后你可以通过循环resultset
封装你的数据
8. C#获取 sqlserver 存储过程返回多表数据
返回的时候用dataset就可以,比如你存储过程这样写
select * from A
select * from B
select * from C
select * from D
select * from D
在执行完存储过程后返回一个dataset
dataset ds = 执行存储过程
ds.tables[0]就是表A
ds.tables[1]就是表B
ds.tables[2]就是表C
剩下的依次类推.
9. sqlserver存储过程中有多个insert和select,如何只获得想要的返回集
@id INT, @value VARCHAR(10);BEGIN -- 定义游标. DECLARE c_test_main CURSOR FAST_FORWARD FOR SELECT id,valueFROM test_main; -- 打开游标. OPEN c_test_main; WHILE 1=1 BEGIN -- 填充数据. FETCH NEXT FROM c_test_main INTO @id, @value; -- 假如未检索到数据,退出循环. IF@@fetch_status!= 0 BREAK; PRINT @value; END; -- 关闭游标 CLOSE c_test_main; -- 释放游标. DEALLOCATE c_test_main;END;
10. 如何在mysql存储过程中处理select语句返回的多行结果
CREATE PROCEDURE curdemo()BEGIN DECLARE done INT DEFAULT 0; DECLARE a CHAR(16); DECLARE b,c INT; DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN cur1; OPEN cur2; REPEAT FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF NOT done THEN IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END IF; UNTIL done END REPEAT; CLOSE cur1; CLOSE cur2;END