Oracle 原理: 过程和函数
一、存储过程
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 原理: 过程和函数相关推荐
- oracle =和is,oracle 创建过程、函数中as, is区别 ?
在过程或函数中, is, as没什么区别,现在一般使用is 测试如下: --is create or replace procedure sp_is_as_test( v_ret out number ...
- Oracle 11g_过程、函数、触发器和包(6)
1.存储过程 存储过程是一种命名的PL/SQL块,它既可以没有参数,也可以有若干参数输入,输出参数,甚至可以有多个既作为输入又作为输出的参数,但它通常没有返回值. 存储过程被保存在数据库中,它不可以被 ...
- Oracle编程入门经典 第11章 过程、函数和程序包
目录 11.1 优势和利益... 1 11.2 过程... 1 11.2.1 语法... 2 11.2.2 建立或者替换... 2 11.2 ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...
- oracle实验使用游标,Oracle数据库实验-PLSQL游标、过程、函数、包的使用
Oracle数据库基础 实验5 PL/SQL游标.过程.函数.包的使用 [实验学时] 2学时 [实验目的] 1.了解PL/SQL语言中显式游标和隐式游标的概念和属性. 2.了解显式游标和隐式游标的差异 ...
- oracle dplsql.bsq,Oracle PLSQL语言初级教程之过程和函数
Oracle PL/SQL语言初级教程之过程和函数 过程和函数 过程和函数都以编译后的形式存放在数据库中,函数可以没有参数也可以有多个参数并有一个返回值.过程有零个或多个参数,没有返回值.函数和过程都 ...
- oracle 函数 实现重载_Oracle 过程、函数、包、重载、自主事务
子程序包的优点有如下: 模块化:通过子程序,可以将程序分解为可管理的,明确的逻辑模块. 可重用性:子程序在创建并执行后,就可以在任意数目的应用程序中使用. 可维持性:子程序可以简化维护操作,因为如果一 ...
- oracle lookup函数,关于Oracle过程,函数的经典例子及解析
存储过程在调用时,不管有无参数,都需要加(),存储过程为pro_test(); call pro_test(); exec pro_test(); 在调用时不加括号,如call pro_test;则会 ...
- 视频教程-赵强老师:Oracle数据库从10g到11g(5)过程、函数和触发器-Oracle
赵强老师:Oracle数据库从10g到11g(5)过程.函数和触发器 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblog ...
- [架构之路-61]:目标系统 - 平台软件 - 基础中间件 - 远程过程(函数)调用RPC原理与其网络架构
目录 第1章 远程过程/函数调用RPC概述 1.1 什么是编程语言原生的函数调用 1.2 IPC:(Inter Process Communication )跨进程通信 1.4 什么是本地过程(函数) ...
最新文章
- Java深入了解String对象
- 数组中子数组的最大累乘积
- 掌握Java编码规范
- 牛客网 java刷题_牛客网刷题(纯java题型 1~30题)
- 【Git】GitHub for Windows使用(1)
- Android GSON解析JSON数据
- java多线程小游戏_java控制台贪吃蛇小游戏(多线程版)
- ACM大佬算法课程福利分享
- 海康威视rtsp转rtmp(java稳定版)
- datagird无法deleteRow
- 校招面试问到Linux CPU不用怕,来看看这份宝典
- 关于我学习线代的那些事
- nl-mean程序下载_将MEAN应用程序部署到Amazon EC2(第1部分)
- 网站需要服务器密码登录密码忘记了怎么办,云服务器登录需要密码忘记了怎么办...
- Java基础篇--多线程之第一个线程用来计算2~100000之间的素数的个数,第二个线程用来计算100000~200000之间的素数的个数
- 服务器Linux系统安装 制作CentOS 7.6 U盘启动
- 使用ThreeJs从零开始构建3D智能仓库——第二章(创建地面与门窗)
- 如何使用Createjs来编写HTML5游戏(八) 通过继承扩展EaselJS中的基础元素
- 傅里叶变换与拉普拉斯变换的概念理解
- 倍分法DID:一组参考文献
热门文章
- Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块...
- vs2010 常见问题处理
- 直接让浏览器下载文件而不打开
- MongoDB查询(上)
- VC++动态链接库(DLL)编程深入浅出(zz)
- 看完这份MySQL 性能调优文档,我把面试问我数据库调优的面试官虐哭了
- 解决go项目报错:fatal: could not read Username for ‘https://gitee.com‘: terminal prompts disabled
- goland配置GOPATH入口
- Jenkins添加从节点相关配置
- maven快照版本机制详解