函数(学习笔记)

函数(存储函数)也是一种较为方便的存储结构,用户定义函数可以被SQL语句或者PL/SQL直接调,函数和过程最大的区别在于,函数可以有返回值,
而过程只能依靠OUT 或者IN OUT返回数据
定义函数语法:
CREATE [OR REPLACE] FUNCTION 函数([参数,...]])
RETURN 返回值类型
[AUTHID [DEFINER | CURRENT_USER]]
AS || IS
[PRAGMA AUTONOMOUS_TRANSACTION;]
声明部分;
BEGIN
程序部分;
[RETURN 返回值;]
EXCEPTION
导常处理;
END [函数名];
参数中定义参数模式表示过程的数据的接收操作,一般分为IN,OUT,IN OUT 3类
CREATE [OR REPLACE]:表示创建或者替换过程,如果过程存在则替换,如果不存在就创建一个新的
AUTHID子句定义了一个过程的所有者权限,DEFINER(默认)表示定义者权限执行,或者用CURRENT_USER覆盖程序的默认行为,变为使用者权限
PRAGMA AUTONOMOUS_TRANSACTION:表示过程启动一个自治事务,自治事务可以让主事挂起,在过程中执行完SQL后,由用户处理提交或者回滚自治事务,
然后恢复主事务
和过程的语法基本相似,唯一不同的是在定义函数时候需要有返回值类型(RETURN 返回值类型)声明

定义一个函数返回系统时间

CREATE OR REPLACE FUNCTION datetime_fun
RETURN VARCHAR2
AS
BEGIN
   RETURN to_char(SYSDATE,‘yyyy-mm-dd hh24:mi:ss‘);
END;
--调用
DECLARE
BEGIN
  dbms_output.put_line(datetime_fun);
END;
带出输入和输出的函数
create or replace function getinfo_fun(eno emp.empno%type, job out emp.job%type) return varchar2 is
     v_name        emp.ename%TYPE;
     v_count          NUMBER;
BEGIN
    SELECT COUNT(eno) INTO v_count FROM emp WHERE empno=eno;
    IF v_count>0 THEN
    SELECT ename,job INTO v_name,job FROM emp WHERE empno=eno;
    END IF;
  RETURN v_name;
end getinfo_fun;
--调用
DECLARE
   v_id                 emp.empno%TYPE:=&empno;
   v_name               emp.ename%TYPE;
   v_job                emp.job%TYPE;
BEGIN
  v_name:=getinfo_fun(v_id,v_job);
  dbms_output.put_line(‘员工编号是:‘||v_id||‘ 姓名:‘||v_name||‘ 职位:‘||v_job);
END;

示例一、定义函数通过员工编号来查询员工的工资

CREATE OR REPLACE FUNCTION GET_SAL_FUN(F_NO EMP.EMPNO%TYPE)
  RETURN NUMBER
  AS
  V_SAL EMP.SAL%TYPE;
BEGIN
  SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO = F_NO;
  RETURN V_SAL;
END;

--调用
DECLARE
 v_id           emp.empno%TYPE:=&empno;
 v_sal          emp.sal%TYPE;
 BEGIN
   v_sal:=get_sal_fun(v_id);
   dbms_output.put_line(‘员工编号:‘||v_id||‘ 的工资为: ‘||v_sal);
 END;

第二种

-使用过程来调用
CREATE OR REPLACE PROCEDURE invoke_proc
AS
v_id           emp.empno%TYPE:=&empno;
v_sal              emp.sal%TYPE;
BEGIN
   v_sal:=get_sal_fun(v_id);
   dbms_output.put_line(‘员工编号:‘||v_id||‘ 的工资为: ‘||v_sal);
END;

EXEC invoke_proc ;

第三种

使用sql语句来调用
 SELECT get_sal_fun(&v_id) FROM dual;

参数模式

IN模式

示例一、定义函数使用IN

CREATE OR REPLACE FUNCTION in_fun(

    f_b  VARCHAR2 DEFAULT ‘Java开发实战经典‘,                     --默认的参数模式为in
     f_a IN VARCHAR2 DEFAULT ‘好好学习‘                --明确定义IN参数模式
)
RETURN VARCHAR2
AS
BEGIN
  RETURN f_a;
END;

执行
DECLARE
    v_a VARCHAR2(50);
    v_b VARCHAR2(50);
BEGIN
   v_b:=in_fun(v_a);
   dbms_output.put_line(v_b);
   dbms_output.put_line(SQLERRM);
END;
结果:
好好学习
ORA-0000: normal, successful completion

OUT模式

示例二、定义函数使用OUT

CREATE OR REPLACE FUNCTION out_fun(
       f_a OUT Varchar2,
       f_b OUT VARCHAR2
)
RETURN VARCHAR2
AS
BEGIN
  f_a:=‘Java开发实战经典‘;
  f_b:=‘Oracle开发实战经典‘;
  RETURN f_b;
END;

--调用
DECLARE
   v_a         VARCHAR2(100);
   v_b         VARCHAR2(100);
   v_result    VARCHAR2(100);
BEGIN
  v_result:=out_fun(v_a,v_b);
  dbms_output.put_line(v_result);
   dbms_output.put_line(SQLERRM);
END;

示例三、通过函数完成部门增加

CREATE OR REPLACE FUNCTION dept_inser_fun(
  f_dno             dept.deptno%TYPE,
  f_dname           dept.dname%TYPE,
  f_loc             dept.loc%TYPE
)
RETURN NUMBER
AS
v_count            NUMBER;
BEGIN
  SELECT COUNT(deptno) INTO v_count FROM dept WHERE deptno=f_dno;

  IF v_count>0 THEN
    RETURN -1;                --返回失败
    ELSE
      INSERT INTO dept(deptno,dname,loc)VALUES(f_dno,f_dname,f_loc);
      COMMIT;
      RETURN 0;
      END IF;
END;

--调用
DECLARE
      v_result     NUMBER;
BEGIN
  v_result:=dept_inser_fun(&deptno,‘&dname‘,‘&loc‘);
   IF V_RESULT = 0 THEN
    DBMS_OUTPUT.PUT_LINE(‘新部门增加成功‘);
  ELSE
    DBMS_OUTPUT.PUT_LINE(‘新部门增加失败‘);
  END IF;
END;

 VAR v_sal NUMBER;
 CALL get_sal_fun(&v_id) INTO v-sal;
 print v_sal;
时间: 2024-12-19 19:14:36

函数(学习笔记)的相关文章

C++运算符重载为友元函数学习笔记

初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 下面的两种情况发生,则我们需要将运算符重载为类的友元函数 <1>成员函数不能满足要求 <2>普通函数又不能访问类的私有成员时 举例说明: class Complex{ double real, imag; public: Complex(double r, double i):real(r), imag(i){ }; Complex operator+(double r); };

contiki-main.c 中的process系列函数学习笔记 &lt;contiki学习笔记之六&gt;

说明:本文依然依赖于 contiki/platform/native/contiki-main.c 文件. ------------------------------------------------------------------------------------------------------------------------------------- 根据上一个笔记里面添加的printf()语句的打印信息提示,hello world 打印是在执行了 1 autostart_

Swift2.0 函数学习笔记

最近又有点忙,忙着找工作,忙着适应这个新环境.现在好了,上班两周周了,也适应过来了,又有时间安安静静的就行我们前面的学习了.今天这篇笔记,记录的就是函数的使用.下面这些代码基本上是理清楚了函数的额使用,但还有一块“闭包”的内容,后面我们单独写一块出来. // 形参传递的过程中,由于没有写外部形参名称,第一个形参的外部形参名字可以省略,第二的的不可以省略 let zxtest = testString(1, zc: 2) print(zxtest) // 返回值是一个元组的形式返回到,参数的传递和

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

pythonの函数学习笔记(一)

函数是可以实现一些特定功能的小方法或小程序定义函数function的方法:def function_name(arg1,arg2[,...]): statement [return value]注意事项:1.def开头,代表定义函数,def和函数名中间要敲一个空格:2.返回值不是必须的,如果没有renturn语句,则默认返回值None:3.函数名必须以下划线或字母开头,可以包含任意字母.数字或下划线的组合,区分大小写且不能是保留字: py使用名称空间的概念存储对象,这个名称空间就是对象作用的区域

generator函数学习笔记

一.基本概念 Generator函数是一种可以暂停执行,返回iterator对象的函数,yield是暂停标识 function* gen(){ yield 1; yield 2; } Generator函数在function后面有一个*,内部有yield语句 function* gen(){ yield 1; yield 2; return '1' } let g = gen(); //调用Generator函数返回遍历器对象 console.log(g.next())//{"value&quo

C++11 virtual函数学习笔记

#include<iostream> #include<string> using namespace std; class Base { public: Base(){} ~Base(){} public: virtual void f1(int x){ cout << "baseclass: f1() " << x << endl; } virtual void f2()final{ cout << "

PHP 函数学习笔记

一. 什么是函数为什么要用函数 函数是一段被命名的,完成特定的任务的代码.函数可以节省编译时间,无论调用多少次 都仅在所在页面编译一次,同时易维护,在易维护的同时也提高了代码的可读性. 二. 调用函数 1 $somevalue = function_name( [parameter, ...]); 三. 定义函数 1 function [&] function_name( [parameter[, ...]]){ 2 statment list 3 } 语句里面可以是HTML内容,甚至可以是一个

C++多态和虚函数学习笔记

1.从实现的角度看,多态可以划分为两种情况:编译期多态和运行时多态. 前者是在编译过程中,确定同名操作的具体操作对象,从而确定同名函数的具体实现: 后者是在程序运行过程中,动态确定具体的操作对象,从而确定同名函数的具体实现. 这种确定操作具体对象的过程成为联编或联合.联编就是将一个标识符和一个存储地址联系在一起的过程,是计算机程序自身彼此相关联的过程. 从联编进行的不同阶段,可以将联编分为静态联编和动态联编. (1)静态联编是指联编工作在程序编译和连接阶段完成的联编过程.静态联编是程序编译之前进