ORACLE存储过程里可以声明过程和函数吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE存储过程里可以声明过程和函数吗相关的知识,希望对你有一定的参考价值。
ORACLE存储过程和函数:
1. 返回值的区别:函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有
2.调用的区别:函数可以在查询语句中直接调用,而存储过程必须单独调用.
3.用途:函数一般情况下是用来计算并返回一个计算结果而存储过程一般是用来完成特定的数据操作(比如修改、插入数据库表或执行某些DDL语句等等)
存储过程可以调用函数:
1.因为函数有返回值,可以用函数给变量赋值。例如,变量名 变量类型 := 包名.函数名(参数);
2.也可以在sql语句里直接调用函数。例如,select 包名.函数名(字段名) into 变量1 from 表名;
参考技术A这个是可以实现的,不过一切只能通过动态sql来实现:
你只能用动态sql来实现创建
如果你想调用,那么因为你的过程或者函数在你当前存储过程创建时并不存在,故也只能通过动态sql来调用函数或者过程。
2、调用函数时注意要有接受函数返回值的参数,最好在存储过程开头预先定义
希望能帮到你 参考技术D procedure可以调用procedure和function ,package里可以定义procedure和function
oracle 函数中能调用存储过程吗
oracle 函数中能调用存储过程,举例如下:
1、无参数存储过程的调用
--创建无参存储过程CREATE OR REPLACE FUNCTION stu_proc RETURN VARCHAR2 IS
--声明语句段
v_name varchar2(20);
BEGIN
--执行语句段
SELECT o.sname INTO v_name FROM student o where o.id=1;
RETURN v_name;
END;
--调用无参存储过程
DECLARE
BEGIN
DBMS_OUTPUT.put_line(\'在PL/SQL中打印的结果:\'||stu_proc);
END;
2、入参存储过程的调用
--创建入参存储过程CREATE OR REPLACE FUNCTION stu_proc(v_id IN NUMBER) RETURN VARCHAR2 IS
--声明语句段
v_name varchar2(20);
BEGIN
--执行语句段
SELECT o.sname INTO v_name FROM student o where o.id=v_id;
RETURN v_name;
END;
--调用入参存储过程
DECLARE
BEGIN
DBMS_OUTPUT.put_line(\'在PL/SQL中打印的结果:\'||stu_proc(1));
END; 参考技术A 举个例子吧,你看看
--创建表
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 ;
--创建procedure
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 dual;
INSERT INTO cost_info VALUES(p_memeberid,p_spend,v_cost);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
dbms_output.put_line(SQLERRM);
END;
----执行procedure
BEGIN
proc_mem(1,1000);
END;本回答被提问者和网友采纳 参考技术B 当然可以。
以上是关于ORACLE存储过程里可以声明过程和函数吗的主要内容,如果未能解决你的问题,请参考以下文章
Plsql developer 工具创建存储过程,必须要在package 文件下创建存储声明 pa