存储过程调用function
㈠ 创建存储过程和函数,调用存储过程和函数的区别
不同点:
1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。
2、函数中有返回值,且必须返回,而过程没有返回值。
3、过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除在select中,必须将返回值赋给变量。
4、函数可以在select语句中直接使用,而过程不能,例如:假设已有函数fun_getAVG() 返回number类型绝对值。那么select fun_getAVG(col_a) from table 这样是可以的。
相同点:
二者都可以有出参
㈡ 怎样从存储过程中调用函数
一,存储过程:
1、 在oracle的 配置和移植工具 àNET MANAGER中配置连接
2、 在plsql中新建SQL窗口,编写存储过程
3、 在plsql中新建测试窗口,在begin end之间调用
4、 查看编译错误:在命令窗口中show errors procere procere_name
或者 编辑的方式打开存储过程,在编译时会有错误提示
二,存储过程基本语法
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;
㈢ 存储过程和函数有何区别
存储过程和函数目的是为了 可重复地 执行操作数据库的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;
/
㈣ 如何在SQL语句中使用FUNCTION
1、function是SQL的函数
是由一个或多个 Transact-SQL 语句组成的子程序,可用于封装代码以便重新使用。Microsoft® SQL Server™ 并不将用户限制在定义为 Transact-SQL 语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
可使用 CREATE FUNCTION 语句创建、使用 ALTER FUNCTION 语句修改、以及使用 DROP FUNCTION 语句除去用户定义函数。每个完全合法的用户定义函数名 (database_name.owner_name.function_name) 必须唯一。
必须被授予 CREATE FUNCTION 权限才能创建、修改或除去用户定义函数。不是所有者的用户在 Transact-SQL 语句中使用某个函数之前,必须先给此用户授予该函数的适当权限。若要创建或更改在 CHECK 约束、DEFAULT 子句或计算列定义中引用用户定义函数的表,还必须具有函数的 REFERENCES 权限。
在函数中,区别处理导致删除语句并且继续在诸如触发器或存储过程等模式中的下一语句的 Transact-SQL 错误。在函数中,上述错误会导致停止执行函数。接下来该操作导致停止唤醒调用该函数的语句。
用户定义函数的类型
2、Procere是SQL的存储过程
存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在ORACLE中,若干个有联系的过程可以组合在一起构成程序包。
存储过程是利用SQL Server所提供的Transact-SQL语言所编写的程序。Transact-SQL语言是SQL Server提供专为设计数据库应用程序的语言,它是应用程序和SQL Server数据库间的主要程序式设计界面。它好比Oracle数据库系统中的PL-SQL和 Informix的数据库系统结构中的Informix- 4GL语言。这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序:
1)、变量说明
2)、ANSI兼容的SQL命令(如Select,Update….)
3)、一般流程控制命令(if…else…、while….)
4)、内部函数
㈤ Oracle中存储过程相互调用问题
使用包返回存储过程结果集,例子:
create or replace package pkg_return_table
is
type c1 is ref
cursor;
procere p_return_table(v_c1 out c1); --定义存储过程返回一个结果集
function f_return_table return pkg_return_table.c1; --定义函数返回一个结果集
procere
p_return_table1(v_id int,v_c1 out c1,v_c2 out c1);
--定义存储过程返回多个结果集
end;
/
create or replace package body pkg_return_table
is
procere
p_return_table(v_c1 out c1)
is
begin
open v_c1 for select * from
student;
end p_return_table;
function f_return_table return
pkg_return_table.c1
is
v_c1 pkg_return_table.c1;
begin
open v_c1 for select * from student;
return v_c1;
end
f_return_table;
procere p_return_table1(v_id int,v_c1 out c1,v_c2 out
c1)
is
sqlstr varchar2(500);
begin
sqlstr:='select * from
student';
open v_c1 for sqlstr; --使用动态sql
sqlstr:='select * from
student where id=:w_id';
open v_c2 for sqlstr using v_id; --动态sql传参
end p_return_table1;
end pkg_return_table;
/
--存储过程调用
variable v_c1 REFCURSOR;
exec
pkg_return_table.p_return_table(:v_c1);
print v_c1;
--存储过程调用
variable v_c1 REFCURSOR;
variable
v_c2 REFCURSOR;
exec
pkg_return_table.p_return_table1(1,:v_c1,:v_c2);
print v_c1;
print
v_c2;
--函数调用
select pkg_return_table.f_return_table()
from al;
重点是定义游标变量,获取存储过程结果集,然后Open游标,就跟平常的游标一样的操作啦
不用包应该也可以的,定义REFCURSOR变量即可
㈥ oracle中运用存储过程调用函数
我也来做,以下程序经过测试,正常获取cost值,插入收银信息表正常!!
--创建表
CREATE TABLE member_info(
memberid NUMBER,
memberlevel VARCHAR2(20),
memberdis NUMBER)
;
CREATE TABLE cost_info(
memberid NUMBER,
spend FLOAT,
COST FLOAT)
;
INSERT INTO member_info VALUES(1,'A',0.1);
INSERT INTO member_info VALUES(2,'A',0.2);
INSERT INTO member_info VALUES(3,'A',0.3);
INSERT INTO member_info VALUES(4,'A',0.4);
--创建函数
CREATE OR REPLACE FUNCTION function_mem(p_memeberid member_info.MEMBERID%TYPE,p_spend cost_info.SPEND%TYPE)
RETURN FLOAT
IS
v_cost cost_info.COST%TYPE;
v_memberdis member_info.MEMBERDIS%TYPE;
BEGIN
SELECT memberdis INTO v_memberdis FROM member_info WHERE memberid = p_memeberid;
v_cost := v_memberdis* p_spend;
RETURN v_cost;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END ;
--创建procere
CREATE OR REPLACE PROCEDURE proc_mem(p_memeberid member_info.MEMBERID%TYPE,p_spend cost_info.SPEND%TYPE)
IS
v_cost cost_info.COST%TYPE;
BEGIN
SELECT function_mem(p_memeberid,p_spend) INTO v_cost FROM al;
INSERT INTO cost_info VALUES(p_memeberid,p_spend,v_cost);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
dbms_output.put_line(SQLERRM);
END;
----执行procere
BEGIN
proc_mem(1,1000);
END;
㈦ mysq 存储过程怎么调用自定义函数
call
或,如果在select中调用,直接写func()
~~~~~~~~~~~~~~~~~~~~~~~
mysql> delimiter $$
mysql> CREATE FUNCTION isodd(input_number int) //创建函数
-> RETURNS int
-> BEGIN
-> DECLARE v_isodd INT;
->
-> IF MOD(input_number,2)=0 THEN
-> SET v_isodd=FALSE;
-> ELSE
-> SET v_isodd=TRUE;
-> END IF;
->
-> RETURN(v_isodd);
->
-> END$$
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE PROCEDURE myProc(aNumber int) //创建mysql存储过程
-> Begin
-> IF (isodd(aNumber)) THEN
-> SELECT ' is odd';
-> ELSE
-> SELECT ' is even';
-> END IF;
-> END$$
Query OK, 0 rows affected (0.02 sec)
㈧ function直接调用存储过程
function调用存储过程?你说的function不是js的吧。
c#的
public static System.Data.DataSet ProcDataSet(string connStringName, string cmdText, params SqlParameter[] cmdParms)
{
System.Data.SqlClient.SqlConnection conn = GetConnection(connStringName);
System.Data.SqlClient.SqlCommand cmd = new SqlCommand(cmdText, conn);
cmd.CommandType = CommandType.StoredProcere;
foreach (SqlParameter param in cmdParms)
{
cmd.Parameters.Add(param);
}
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(cmd);
System.Data.DataSet ds = new DataSet();
da.Fill(ds);
cmd.Parameters.Clear();
return ds;
}