一、存储过程

PL/SQL分为三个部分,声明部分、可执行部分、异常处理部分,其中可执行部分是必须要有的。

创建过程的语法:

Create [or replace]  procedure 过程名  [(参数list)]As|Is
--声明变量在这里写
BEGIN
--过程程序在这里写
EXCEPTION
--异常处理在这里写
END;

PL/SQL 子程序有点:

模块化:将程序分解为逻辑模块

可重用性:可以被任意数目的程序使用

可维护性:简化维护操作

安全性:通过权限设置,是数据更加安全

create or replace procedure insertBlob(ifilepath in  varchar2,ifilename  in varchar2  )
authid current_user isimg_file bfile;img_blob blob;lob_length number;sqlcommand  varchar2(500); isexit number;
begin----动态SQL,需要相应权限 create table  read,write on directory等 -----设置虚拟路径sqlcommand :='create or replace directory PHOTOPATH as ''' ||ifilepath ||'''' ;dbms_output.put_line(ifilepath || ifilename);execute immediate sqlcommand;--获取bfile文件img_file := bfilename('PHOTOPATH',ifilename);--打开文件dbms_lob.open(img_file);--获取文件长度lob_length := dbms_lob.getlength(img_file);--判断文件是否存在,先把blob设成empty_blob()select count(1) into isexit from file_lobtest t1 where t1.filepath = ifilepath;dbms_output.put_line('isexit'|| isexit);if isexit = 0 then insert into file_lobtest values(ifilepath,null,empty_blob(),img_file);dbms_output.put_line('-------1');else update file_lobtest t1 set bfile_content=img_file,blob_content=empty_blob() where t1.filepath = ifilepath;dbms_output.put_line('-------2');end if ;--然后赋值blob变量select blob_content into img_blob from file_lobtest t1 where t1.filepath = ifilepath;--加载blobdbms_lob.loadfromfile(img_blob,img_file,lob_length);--关闭文件dbms_lob.close(img_file);commit;
end;

存储过程和 PL/SQL语法很接近。 存储过程和函数的区别就是存储过程不需要return ,可以通过out来返回多个值,而函数需要return 。存储过程 要在过程语句中才能被调用,而函数可以在过程语句中调用也可以在SQL语句中被调用。

create or replace procedure coutP(i in number,ret out  varchar2)
authid current_user as a varchar2(50);
begina :='';ret :='';for j in 1..i loopa := a|| '*';ret := ret||a||chr(10);end loop;end;
/
--------调用存储过程-------
declare arg1 varchar(100);
begincoutP(5,arg1);dbms_output.put_line(arg1);
end;

输出结果:

二、函数写法和过程差不多,只不过函数需要return 不能out,函数可以在过程语句中调用也可以在SQL语句中被调用。


create or replace function coutP_fun(i  number) return varchar2
authid current_user as a varchar2(50);ret   varchar2(50);
begina :='';ret :='';for j in 1..i loopa := a|| '*';ret := ret||a||chr(10);end loop;return ret;
end;
/
-----调用函数----select coutP_fun(6) from dual;

输出结果:

三、自主事物处理

当调用过程时,子过程如果发生回滚则会影响到,调用过程的最终结果:要想避免子过程的事物影响到父过程,需要在子过程中添加:PRAGMA AUTONOMOUS_TRANSACTION;  --写在  is 和 begin 之间


create or replace procedure proc(i in number,ret out  varchar2)
authid current_user as a varchar2(50);--PRAGMA AUTONOMOUS_TRANSACTION;
beginupdate salary_tbl s set s.salary=-100 where s.employer_nm='雇佣者2'; a :='';ret :='';for j in 1..i loopa := a|| '*';ret := ret||a||chr(10);end loop;rollback;
end;
/
declare arg1 varchar(100);
beginupdate salary_tbl s set s.salary=-1200 where s.employer_nm='雇佣者1'; proc(5,arg1);dbms_output.put_line(arg1);commit;
end;
/
select * from salary_tbl where employer_nm in('雇佣者1','雇佣者2');

把PRAGMA AUTONOMOUS_TRANSACTION;注释掉的结果就是数据保留了原样,因为proc的回滚不仅把 update salary_tbl s set s.salary=-100 where s.employer_nm='雇佣者1'; 而且把父程序的 update salary_tbl s set s.salary=-1200 where s.employer_nm='雇佣者1'; 也回滚掉了;

output结果:   select 的结果  保留了原样。

把PRAGMA AUTONOMOUS_TRANSACTION;注释打开后的结果

在自主事物处理中:主程序按顺序执行,当执行到自主事物的子程序时,主程序事物暂停,对应的数据上锁,子程序的事物开启顺序执行子程序,子程序执行完后,主程序继续执行。

自主事物处理特征: 1)与主事物处理的状态无关 ;2) 提交或回滚都不影响主事物;3)自主事物处理的结果是对其他事物是可见的;4)能够启动其他自主事物处理

Oracle 原理: 过程和函数相关推荐

  1. oracle =和is,oracle 创建过程、函数中as, is区别 ?

    在过程或函数中, is, as没什么区别,现在一般使用is 测试如下: --is create or replace procedure sp_is_as_test( v_ret out number ...

  2. Oracle 11g_过程、函数、触发器和包(6)

    1.存储过程 存储过程是一种命名的PL/SQL块,它既可以没有参数,也可以有若干参数输入,输出参数,甚至可以有多个既作为输入又作为输出的参数,但它通常没有返回值. 存储过程被保存在数据库中,它不可以被 ...

  3. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  4. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  5. oracle实验使用游标,Oracle数据库实验-PLSQL游标、过程、函数、包的使用

    Oracle数据库基础 实验5 PL/SQL游标.过程.函数.包的使用 [实验学时] 2学时 [实验目的] 1.了解PL/SQL语言中显式游标和隐式游标的概念和属性. 2.了解显式游标和隐式游标的差异 ...

  6. oracle dplsql.bsq,Oracle PLSQL语言初级教程之过程和函数

    Oracle PL/SQL语言初级教程之过程和函数 过程和函数 过程和函数都以编译后的形式存放在数据库中,函数可以没有参数也可以有多个参数并有一个返回值.过程有零个或多个参数,没有返回值.函数和过程都 ...

  7. oracle 函数 实现重载_Oracle 过程、函数、包、重载、自主事务

    子程序包的优点有如下: 模块化:通过子程序,可以将程序分解为可管理的,明确的逻辑模块. 可重用性:子程序在创建并执行后,就可以在任意数目的应用程序中使用. 可维持性:子程序可以简化维护操作,因为如果一 ...

  8. oracle lookup函数,关于Oracle过程,函数的经典例子及解析

    存储过程在调用时,不管有无参数,都需要加(),存储过程为pro_test(); call pro_test(); exec pro_test(); 在调用时不加括号,如call pro_test;则会 ...

  9. 视频教程-赵强老师:Oracle数据库从10g到11g(5)过程、函数和触发器-Oracle

    赵强老师:Oracle数据库从10g到11g(5)过程.函数和触发器 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblog ...

  10. [架构之路-61]:目标系统 - 平台软件 - 基础中间件 - 远程过程(函数)调用RPC原理与其网络架构

    目录 第1章 远程过程/函数调用RPC概述 1.1 什么是编程语言原生的函数调用 1.2 IPC:(Inter Process Communication )跨进程通信 1.4 什么是本地过程(函数) ...

最新文章

  1. Java深入了解String对象
  2. 数组中子数组的最大累乘积
  3. 掌握Java编码规范
  4. 牛客网 java刷题_牛客网刷题(纯java题型 1~30题)
  5. 【Git】GitHub for Windows使用(1)
  6. Android GSON解析JSON数据
  7. java多线程小游戏_java控制台贪吃蛇小游戏(多线程版)
  8. ACM大佬算法课程福利分享
  9. 海康威视rtsp转rtmp(java稳定版)
  10. datagird无法deleteRow
  11. 校招面试问到Linux CPU不用怕,来看看这份宝典
  12. 关于我学习线代的那些事
  13. nl-mean程序下载_将MEAN应用程序部署到Amazon EC2(第1部分)
  14. 网站需要服务器密码登录密码忘记了怎么办,云服务器登录需要密码忘记了怎么办...
  15. Java基础篇--多线程之第一个线程用来计算2~100000之间的素数的个数,第二个线程用来计算100000~200000之间的素数的个数
  16. 服务器Linux系统安装 制作CentOS 7.6 U盘启动
  17. 使用ThreeJs从零开始构建3D智能仓库——第二章(创建地面与门窗)
  18. 如何使用Createjs来编写HTML5游戏(八) 通过继承扩展EaselJS中的基础元素
  19. 傅里叶变换与拉普拉斯变换的概念理解
  20. 倍分法DID:一组参考文献

热门文章

  1. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块...
  2. vs2010 常见问题处理
  3. 直接让浏览器下载文件而不打开
  4. MongoDB查询(上)
  5. VC++动态链接库(DLL)编程深入浅出(zz)
  6. 看完这份MySQL 性能调优文档,我把面试问我数据库调优的面试官虐哭了
  7. 解决go项目报错:fatal: could not read Username for ‘https://gitee.com‘: terminal prompts disabled
  8. goland配置GOPATH入口
  9. Jenkins添加从节点相关配置
  10. maven快照版本机制详解