函数

实例1:输入雇员的姓名,返回该雇员的年薪

create function fun1(spName varchar2) return number is yearSal number(,);
begin
select sal*+nvl(comm,) into yearSal from emp where ename=spName;
return yearSal;
end;
/ 在sqlplus中调用函数
var income number
call annual_incomec('SCOTT') into: income;
print income

同样我们可以在java程序中调用该函数
select annual_income('SCOTT') from dual;
可以通过rs.getInt(1)得到返回的结果


包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。

实例1 用create package命令来创建包
create package mypackage is
procedure update_sal(name varchar2, newsal number);
function annual_income(name varchar2) return number;
end;
包的规范只包含了过程和函数的说明,但是没有过程和函数的实现代码,包体用于实现包规范中的过程和函数 实例2 建立包体使用命令create package body的命令
create package body mypackage is procedure update_sal(name varchar2, newsal number)
is
begin
update emp set sal=newsal where ename=name;
end; function annual_income(name varchar2)
return number is
annual_salary number;
begin
select sal*+nvl(comm,) into annual_salary from emp where ename=name;
return annual_salary;
end; end; 实例3 如何调用包的过程和函数
当调用包的过程和函数时,在过程和函数前需要带有包名,如果要访问其他方案的包,还需要在包名前加方案名
call mypackage.update_sal('SCOTT',);

触发器
触发器是指隐含的执行的存储过程,当定义触发器时,必须要指定触发的事件和触发的操作,常用的触发事件包括insert,update,delete语句,而触发操作实际就是一个pl/sql

块,可以使用create trigger来建立触发器

变量的定义和使用
在编写pl/sql程序时,可以定义变量和常量,在pl/sql程序中包括有:
1标量类型(scalar)
定义一个变长字符串: v_ename varchar2(10);
定义一个小数并给初始值: v_sal number(6,2):=5.4;
定义一个布尔便令不能为空初始值为false:v_valid boolean not null default false
定义一个日期类型的数据: v_date date;

在定义好变量后,就可以使用这些变量了,这里需要说明的是pl/sql块为变量赋值不同于其他的编程语言,需要在等号前加冒号。

案例1:以输入员工号,显示雇员姓名,工资,个人所得税(0.03)为例。
declare
c_tax_rate number(,):=0.03;
v_name varchar2();
v_sal number(,);
v_tax_sal number(,);
begin
select ename,sal into v_ename,v_sal from emp where emp=&no;
--计算所得税
v_tax_sal:=v_sal*c_tax_rate;
dbms_output.put_line('姓名是:'||v_ename||' 工资:'||v_sal||' 交税':v_tax_sal)
end;

2 增强版标量%type
在正常定义标量时字符需要指定大小,太大了浪费空间,可以采用:
v_ename emp.ename%type;
这是v_ename的类型和大小和表emp中字段ename的类型和大小保持一致性。

3 复合变量(composite)
用于存放多个值的变量,主要包括这几种:pl/sql记录、pl/sql表、嵌套表、varry

(1)pl/sql记录;类似高级语言中的结构体

declare
type emp_record_type is record(
v_name varchar2(),
v_sal number(,)); sp_record emp_record_type; begin
select ename,sal into sp_record from emp where empno=;
dbm_output.put_line('员工名:'||emp_record.name);
end;

(2) pl/sql表:相当于数组

declare
--定义了一个pl/sql表类型sp_table_type,该类型是用于存放emp.ename%type
--index by binary_integer表示下标是整数
type sp_table_type is table of emp.ename%type index by binary_integer;
--定义了一个sp_table变量
sp_table sp_table_type;
begin
select ename into sp_table() from emp where empno=;
dbms_output.put_line('员工名:'||sp_table());
end; 如果上述中select语句将where语句去掉,也就是返回了很多数据。

3参照变量 : 高级数组
参照变量是指用于存放数组值的指针变量,通过使用参照变量
(1)参照变量-ref cursor游标变量
使用游标时,当定义游标时,当定义游标时不需要指定相应的select语句,但是当使用游标时需要指定select语句,这样一个游标就与一个select语句结合了。

实例1:编写一个块,可以输入部门号,显示该部门所有员工的信息
declare
--定义游标类型
type sp_emp_cursor is ref cursor;
--定义一个游标变量
test_cursor sp_emp_cursor;
v_ename emp.ename%type;
v_sal emp.sal%type; begin
--把test_cursor和一个select结合
open test_cursor for select ename,sal from emp where deptno=&no;
--循环取出
loop
fetch test_cursor into v_ename,v_sal;
--判断退出条件
exit when test_cursor%notfound;
dbms_output.put_line(v_ename||' '||v_sal);
end loop; end;

oracle函数、包、变量的定义和使用、重点”结构体和数组”的更多相关文章

  1. C语言--- 高级指针2(结构体指针,数组作为函数参数)

    一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[ ...

  2. C# 篇基础知识2——运算符、类型转换、流程控制、枚举、结构体和数组、函数

    1.运算符.类型转换 计算某年y某月m某日d是周几的基姆拉尔森公式公式:int week = (d + 2*m + 3*(m + 1)/5 + y + y/4 - y/100 + y/400 + 1) ...

  3. C语言定义结构体指针数组并初始化;里面全是结构体的地址

    #include <stdio.h> #include <string.h> struct tells;//声明结构体 struct info { char *infos; } ...

  4. 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏

    C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...

  5. Kotlin基本语法笔记之函数、变量的定义及null检测

    定义函数 fun sum(a: Int, b: Int): Int { return a + b } 该函数中两个参数的类型都是Int,返回类型是Int 也可以做如下简化 fun sum(a: Int ...

  6. oracle 11g 通过在线重定义方式修改表结构

    今天因为要对一套数据库的数据抽取进行io优化,希望通过修改表结构将抽取io降下来,因为抽取只针对标签HAVE_FLAG为"0"的值进行抽取,抽取之后更新HAVE_FLAG为其他值, ...

  7. 类成员函数指针的特殊之处(成员函数指针不是指针,内含一个结构体,需要存储更多的信息才能知道自己是否virtual函数)

    下面讨论的都是类的非静态成员函数. 类成员函数指针的声明及调用: 1 2 3 4 5 6 7 //pr是指向Base类里的非静态成员函数的指针 //其行参为(int, int),返回值为void vo ...

  8. C语言 ---- 函数 结构体 iOS学习-----细碎知识点总结

    函数的定义     返回值类型 函数名(形式参数列表) {        函数的实现     } 函数不允许嵌套定义 如果函数的定义在主调函数之后,那么要进行提前声明才能使用. // 匿名结构体,结构 ...

  9. c语言的作用域、变量与结构体

    一.变量的作用域 根据变量的作用域,可以分为: 1.局部变量: 1> 定义:在函数(代码块)内部定义的变量(包括函数的形参) 2> 作用域:局部变量只有在定义它的函数内部使用,其它函数不能 ...

随机推荐

  1. c函数习记

    1,user groups 篇幅 the length of an article; fgetgrent(从指定的文件来读取组格式) 相关related functions;fgetpwent hea ...

  2. 【转】Maven实战(六)--- dependencies与dependencyManagement的区别

    原博文出自于:http://blog.csdn.net/liutengteng130/article/details/46991829   感谢! 在上一个项目中遇到一些jar包冲突的问题,之后还有很 ...

  3. 问题-XE8客户端访问Webservice时报“no selected dom vendor”

    问题现象:XE8做的客户端访问XE8做的Webservice时,客户端报“no selected dom vendor”. 问题原因:原因不明,应该是用到了XML转换等方法吧.有高手了解的,请M我. ...

  4. Gym 100507C Zhenya moves from parents (线段树)

    Zhenya moves from parents 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/C Description Z ...

  5. ASP.NET WebForm中前台代码如何绑定后台变量

    转载自 http://www.cnblogs.com/lerit/archive/2010/10/22/1858007.html 经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有& ...

  6. Spring Data JPA教程, 第四部分: JPA Criteria Queries(未翻译)

    The third part of my Spring Data JPA tutorialdescribed how you can create custom queries by using qu ...

  7. linux 下安装apache 快速教程

    最近自学linux,看鸟哥的文章.提到了apache,所以在虚拟机redhat 5下安装了一把, 结合国内外文章写下快速可行的教程: --------------------------------- ...

  8. APK的目录结构

    APK 包含以下内容: 被编译的代码文件(.dex文件) 文件资源(resources) assets. 证书(certificates) 清单文件(maifestfile) assets 文件 li ...

  9. ssl配置

    Apache SSL配置 作者: JeremyWei | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://weizhifeng.net/apache-ssl.h ...

  10. 使用WPF来创建 Metro UI程序

    本文转载:http://www.cnblogs.com/TianFang/p/3184211.html 这个是我以前网上看到的一篇文章,原文地址是:Building a Metro UI with W ...