函数

实例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. EmEditor正则表达式例子

    正则表达式中 单词指的是由字母.数字.下划线组合而成的字符串,用符号表示为\w(小写). 空白符包括单字节空格.双字节空格.制表符,用符号表示为\s(小写). 1.匹配被双引号包含的所有字符串(str ...

  2. 【Spark学习】Apache Spark监控与测量

    Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4137952.html

  3. GUI、模块化与结对编程(homework-03)

    摘要: 在本次作业博客里,我将主要阐述作业3的收获.作业3表面是将之前的程序转换为图形界面(之前程序见http://www.cnblogs.com/shone/p/3348372.html),然而本质 ...

  4. HDU 5680 zxa and set (数学 推导结论)

    zxa and set 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/G Description zxa has a set , ...

  5. stm32f407 定时器 用的APB1 APB2 及 定时器频率

    上午想要用Timer10做相对精确的延时功能,但是用示波器发现实际延时数值总是只有一半,百思不得其解.仔细查阅各处资料结合实际研究后对stm32f407的14个定时器的时钟做一个总结: 下面来源: h ...

  6. word2003公式编辑器公式显示不完整问题

    在段落里设置行距为:单倍行距.

  7. XML操作:1.XML类(http://blog.csdn.net/happy09li/article/details/7460521)

    XML绑定TreeView private void XmlOperation_Load(object sender, EventArgs e) { path = AppDomain.CurrentD ...

  8. C#编程简短总结

    封装 field一般为private,定义的时候可以不赋值.不赋值的时候一般被构造函数初始化赋值,其值用来保存类实例的数据,可以被内部方法使用作为计算的数据来源.当需要继承类继承本类的时候,field ...

  9. [刷题codeforces]650A.637A

    650A Watchmen 637A Voting for Photos 点击查看原题 650A又是一个排序去重的问题,一定要注意数据范围用long long ,而且在写计算组合函数的时候注意也要用l ...

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

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