oracle调用plsql函数,oracle plsql开发之一:函数_weixin_39765290的博客-程序员宅基地

技术标签: oracle调用plsql函数  

ORACLE 提供可以把PL/SQL 程序存储在数据库中,并可以在任何地方来运行它。这样就叫存储过程或函数。过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。

创建函数的语法如下:

Sql代码 icon_copy.gif

CREATE[ORREPLACE]FUNCTIONfunction_name

[ (argment [ {IN|OUT|INOUT} ] Type ,

argment [ {IN|OUT|INOUT} ] Type ]

RETURNreturn_type

{IS|AS}

BEGIN

FUNCTION_body

EXCEPTION

其它语句

END;CREATE [OR REPLACE] FUNCTION function_name

[ (argment [ { IN | OUT | IN OUT } ] Type ,

argment [ { IN | OUT | IN OUT } ] Type ]

RETURN return_type

{ IS | AS }

BEGIN

FUNCTION_body

EXCEPTION

其它语句

END;

注意:这里的type只能是类型,不能有长度或大小的定义,比如varchar2而非varchar2(20)

创建函数举例:

Java代码 icon_copy.gif

create or replace function get_salary(

v_deptno number,

emp_count out number

)

returnnumber

is

v_sum number;

begin

select sum(deptno),count(*) into v_sum,emp_count

from emp where empno = v_deptno;

returnv_sum;

exception

when no_data_found then

dbms_output.put_line('部门号为'|| v_deptno ||'部门没有员工!');

when others then

dbms_output.put_line(sqlcode || sqlerrm);

end;create or replace function get_salary(

v_deptno number,

emp_count out number

)

return number

is

v_sum number;

begin

select sum(deptno),count(*) into v_sum,emp_count

from emp where empno = v_deptno;

return v_sum;

exception

when no_data_found then

dbms_output.put_line('部门号为' || v_deptno || '部门没有员工!');

when others then

dbms_output.put_line(sqlcode || sqlerrm);

end;

调用函数方法

函数声明时所定义的参数称为形式参数,应用程序调用时为函数传递的参数称为实际参数。应用程序在调用函数时,可以使用以下三种方法向函数传递参数:

第一种参数传递格式称为位置表示法,格式为:

argument_value1[,argument_value2 …]

第二种参数传递格式称为名称表示法,格式为 :

argument => parameter [,…]

其中:argument 为形式参数,它必须与函数定义时所声明的形式参数名称相同。Parameter 为实际参数。在这种格式中,形式参数与实际参数成对出现,相互间关系唯一确定,所以参数的顺序可以任意排列。

第三种参数传递格式称为混合表示法 :

即在调用一个函数时,同时使用位置表示法和名称表示法为函数传递参数。采用这种参数传递方法时,使用位置表示法所传递的参数必须放在名称表示法所传递的参数前面。也就是说,无论函数具有多少个参数,只要其中有一个参数使用名称表示法(如EMPNUM=>7369),其后所有的参数都必须使用名称表示法。

例子:

Sql代码 icon_copy.gif

declare

v_sum number;

v_num number;

begin

--位置表示法

v_sum := get_salary(30,v_num);

dbms_output.put_line('deptno 30 sum salary is '|| v_sum ||',emp count is '|| v_num);

--名称表示法

v_sum := get_salary(emp_count=> v_num,v_deptno => 20);

dbms_output.put_line('deptno 20 sum salary is '|| v_sum ||',emp count is '|| v_num);

--混合表示法

v_sum := get_salary(10,emp_count => v_num);

dbms_output.put_line('deptno 10 sum salary is '|| v_sum ||',emp count is '|| v_num);

end;declare

v_sum number;

v_num number;

begin

--位置表示法

v_sum := get_salary(30,v_num);

dbms_output.put_line('deptno 30 sum salary is ' || v_sum || ',emp count is ' || v_num);

--名称表示法

v_sum := get_salary(emp_count=> v_num,v_deptno => 20);

dbms_output.put_line('deptno 20 sum salary is ' || v_sum || ',emp count is ' || v_num);

--混合表示法

v_sum := get_salary(10,emp_count => v_num);

dbms_output.put_line('deptno 10 sum salary is ' || v_sum || ',emp count is ' || v_num);

end;

参数默认值

在CREATE OR REPLACE FUNCTION 语句中声明函数参数时可以使用DEFAULT关键字为输入参数指定默认值。

Sql代码 icon_copy.gif

createorreplacefunctiondefault_param(

namevarchar2,

age numberdefault20,

sex varchar2default'male'

)

returnvarchar2

is

v_str varchar2(50);

begin

v_str :=name||', '|| age ||', '|| sex;

returnv_str;

end;create or replace function default_param(

name varchar2,

age number default 20,

sex varchar2 default 'male'

)

return varchar2

is

v_str varchar2(50);

begin

v_str := name || ', ' || age || ', ' || sex;

return v_str;

end;

具有默认值的函数创建后,在函数调用时,如果没有为具有默认值的参数提供实际参数值,函数将使用该参数的默认值。但当调用者为默认参数提供实际参数时,函数将使用实际参数值。在创建函数时,只能为输入参数设置默认值,而不能为输入/输出参数设置默认值。

调用的例子:

Sql代码 icon_copy.gif

declare

v_str varchar2(50);

begin

v_str := default_param('scott',10,'male');

dbms_output.put_line(v_str);

v_str := default_param('smith');

dbms_output.put_line(v_str);

v_str := default_param('lucy', sex =>'female');

dbms_output.put_line(v_str);

end;declare

v_str varchar2(50);

begin

v_str := default_param('scott',10,'male');

dbms_output.put_line(v_str);

v_str := default_param('smith');

dbms_output.put_line(v_str);

v_str := default_param('lucy', sex => 'female');

dbms_output.put_line(v_str);

end;

或者是这样:

Java代码 icon_copy.gif

select default_param('smith') from dual;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39765290/article/details/116436023

智能推荐

从程序员到项目经理(15):原来一切问题都是可以解决的-程序员宅基地

项目经理是否具有积极的心态,直接关系着项目的成败。很多情况下,项目经理并不是真的不愿意积极面对问题,而是觉得问题本身是难以解决的,只能听之任之。而事实上,一切问题都是可以解决的——这不只是一句口号,而是确确实实可以做到的。当你持有这想的信念时,解决问题的能力将会变更为强大。1.我的第二次顿悟项 目管理培训并不是人人都需要,但对于渴望获得帮助以消化理论知识、尽快掌握要领的项目经理而...

hummer_2.1(悍马)版java开发框架有or/mapping和事务处理-程序员宅基地

大家好,好久没有在javaeye上发贴了,我又回来了,回来的感觉真好O(∩_∩)O~,其实我就是消失了好几个月的不差托的作者,经过大家对我原来的mymapping的批评后我又潜心研究,总于发了这一版hummer2.1之所以取名为悍马,是因为本人比较喜欢悍马的车,牛逼什么路都能开,所以我也希望我写的这个框架使用自由,没有什么限制,多了不说了都是废话,下面我说说我的改进。1:我参考了ibatis的..._悍马团队源码

python程序打包多个py文件_Py之cx_Freeze:Python库之cx_Freeze库(程序打包)简介、安装、使用方法...-程序员宅基地

Py之cx_Freeze:Python库之cx_Freeze库(程序打包)简介、安装、使用方法详细攻略—案例之实现机器人在线24小时智能翻译导读 将Python程序生成exe程序目前流行这三种: cx_freeze py2exe Pyinstaller,后面两种支持python3有些问题,推荐使用cx_Freeze打包。相关文章Py之Pyinstaller:Python库之Pyin..._cx_freeze 多文件

4.20. 恺撒Caesar密码_一本日记,上面写着:(caesar) o(→2) n(←5) x(→3) s(←5)需要输入四位大写-程序员宅基地

【问题描述】Julius Caesar 生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是Caesar 军团中的一名军官,需要把Caesar 发送的消息破译出来、并提供给你的将军。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A都分别替换成字母F),其他字符不 变,并且消息原文的所有字母都是大写的。 密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 原_一本日记,上面写着:(caesar) o(→2) n(←5) x(→3) s(←5)需要输入四位大写字

docker安装的autoware之启动docker的脚本理解-程序员宅基地

#!/bin/bashset -e# Default settingsCUDA="off"IMAGE_NAME="autoware/autoware"TAG_PREFIX="latest"ROS_DISTRO="kinetic"BASE_ONLY="false"PRE_RELEASE="off"AUTOWARE_HOST_DIR=""USER_ID="$(id -u)"...

多项式回归以及python实现-程序员宅基地

多项式回归原理之前已经介绍过一元线性回归以及python实现,详情请戳这里。而多项式回归,原理和多元线性回归相似。还是先举个栗子:唯一特征X,共有m = 500个数据数量,Y是实际结果,从中找到一条曲线,使数据集到曲线之间的距离差最小,如下图所示:先假设一条曲线:这里只假设成一个找到它和y的损失函数:和线性回归一样,找到最小的就可以了。梯度下降...

随便推点

柠檬水问题【简单】【力扣】_你正在考虑摆一个柠檬水摊。这个小摊本身要花200美 元。 每杯柠檬水的原料售-程序员宅基地

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意,一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。public class lemonadeChange { public static void main(String[] args) _你正在考虑摆一个柠檬水摊。这个小摊本身要花200美 元。 每杯柠檬水的原料售

4-11 Isomorphic(判断两树同构)_two trees, t1 and t2, are isomorphic if t1 can be -程序员宅基地

Two trees, T1 and T2, are isomorphic if T1 can be transformed into T2 by swapping left and right children of (some of the) nodes in T1. For instance, the two trees in Figure 1 are isomorphic because they are the same if the children of A, B, and G, but not_two trees, t1 and t2, are isomorphic if t1 can be transformed into t2 by swa

vue项目iview和ant-design树图标的修改-程序员宅基地

vue项目iview和ant-design树(三角形)图标的修改修改图标之前先准备iconfont,我用的是阿里矢量图,如何引入项目,网上已经有很多的教程了,这里我就不再重复了。废话不多说,直接贴代码iview用的是官网这个例子:思路:先禁止图标的旋转,然后把view的字体图标换成自己想要的字体图标。最后的效果://禁止图标旋转:.ivu-tree .ivu-icon { ...

关于sql_mode对自增的一个影响-程序员宅基地

今天碰巧遇到一个以前忽视的问题,就是sql_mode对自增列值的影响,这里做个简单的测试:(user:root time: 11:30)[db: lidan]show variables like '%mode%';+--------------------------+---------------------+| Variable_name | Va

ajax .load()方法-程序员宅基地

1. home.html<!DOCTYPE html><html> <head> <title>home</title> <meta http-equiv="Content-Type" content="text/html"; charset="utf-8" /> <script ty...

android版本升级5.0,安卓系统升级到Android 5.0教程【详解】_FBINA链世界的博客-程序员宅基地

很多安卓手机用户在得知Android 5.0系统推出后,都很想将自己的手机系统升级成5.0。但是,,目前,Android 5.0只推送了部分手机,其他的安卓用户想要使用此系统的话,就要来看一看小编今天为大家带来的安卓系统升级到Android 5.0教程了。升级前准备先确保你的手机处于解锁状态,已经打开了USB调试先配置好你的电脑升级环境(如果你已经配置好可以忽略此步),将文件解压将名称中含有adb..._安卓4.3系统怎么升级到5.0