PL/SQL块

PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分

结构如下:

declare​ /*声明部分,在此声明变量,类型及游标*/begin​   /*执行部分,过程及sql语句,程序主要部分*/exception​    /*执行异常部分,错误处理*/end;

变量赋值

variable :=expression

字符连接

<字符串>||<字符串>

注意:空值加数字仍是空值

可转换类型赋值

char转number

v_total :=to_number('100.0')+sal;

number转char

v_comm :=to_char('123.45')||'元';

字符转日期

v_date :=to_date('2001.07.03','yyyy.mm.dd');

日期转字符

v_to_day :=to_char(sysdate,'yyyy.mm.dd hh24:mi:ss');

使用%type 定义表字段相同类型的变量

变量名 表名.字段名%type;
v_va11 emp.column1%type

使用%rowtype定义表行相同类型的变量

变量名 表名%rowtype;
v_row emp%rowtype;

ORACLE定义符合型的类型

delcare
--声明一个记录类型
type  emp_record is record(
v_val1 emp.column1%type;
v_val3 emp.column2%type;
v_val3 emp.column3%type;
);
--定义一个记录类型的成员变量、
v_emp_record emp_record;
beginselect column1,column2,columb3 into v_emp_record from emp where emp_id = 100;
end;

流程控制

条件判断

方式一

if...then...elsif...than...else...end if;
-----------------1
if<布尔>then--logic
end if;
-----------------2
if<布尔>then--logic
else--logic
end if;
-----------------3

方式二

case... when... then... end;

循环结构

方式一

loop...exit...when...end loop;

方式二

while...loop...end...loop;

方式三

for i in ...loop...end loop;

显示游标处理

定义游标

打开游标

提取游标数据

关闭游标

declare
--1.定义游标cursor my_cursor is select * from test;v_row test%rowtype;
begin
--2.打开游标open my_cursor;
--3.提取游标fetch my_cursor into v_row;
--4.对游标进行循环操作,判断是否有下一条记录while my_cursor%found loopdbms_output.put_line('name:'||v_row.name);fetch my_cursor into v_row;end loop;
--关闭游标close my_cursor;
end;

游标属性

%FOUND 布尔型属性 当前最近一次读记录成功返回,则为true

%NOTFOUND 布尔型属性 相反

%ISOPEN 布尔型属性 当游标已打开时返回true

%ROWCOUNT 数字型属性 返回已从游标中读取的记录数

隐式游标处理

游标for循环,自动执行游标循环功能,自动打开游标,并提取第一行游标数据...

DECLARECURSOR c_dl IS   SELECT * FROM test;c_row c_dl%ROWTYPE;BEGINFOR c_row IN c_dl LOOPdbms_output.put_line ( 'SQL=' || c_row.name );END LOOP;END;

带参数游标

DECLARECURSOR c_dl( x_id number) IS   SELECT * FROM test where id= x_id;c_row c_dl%ROWTYPE;BEGINFOR c_row IN c_dl( x_id =>4000 ) LOOPdbms_output.put_line ( 'SQL=' || c_row.name );END LOOP;END;

异常处理

异常情况处理使用于处理正常执行过程中未预料的事件,程序块的异常处理

exceptionwhen first_exception then <code to handle>when second_exception then <code to handle>when third_exception then <code to handle>
end;
--异常处理注意次序排列,但others 必须放在最后
DECLARECURSOR c_dl IS   SELECT * FROM norm;c_row c_dl%ROWTYPE;BEGINFOR c_row IN c_dl LOOPBEGINdbms_output.put_line ( 'SQL=' || c_row.name );--当出现异常时,将异常插入日志表,并继续下一次循环EXCEPTIONWHEN OTHERS THENBEGINdbms_output.put_line ( 'eerrrrr');END;END;END LOOP;END;

三种类型异常错误

1.预定义错误 -大约有24个,无需在程序定义,由oracle自动

2.非预定义错误

DECLARE
--1.定义异常temp_exception exception;
--2.将定义好的异常情况,与标准oracle错误联系起来PRAGMA EXCEPTION_INIT(temp_exception,-2292);BEGINdelete from test where id=2;
exception
--3.处理异常when temp_exception then dbms_output.put_line ( '违反完整性约束' );
END;

3.用户定义错误

DECLAREe_too_high_excep exception;v_val test.ID%type;BEGINselect id into v_val from test where id=2;if v_val>1 thenraise e_too_high_excep;end if;
exceptionwhen e_too_high_excep then dbms_output.put_line ( 'to high' );
END;

存储函数和过程

过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据

--创建存储过程调用
--输入参数 IN OR OUT
CREATE OR REPLACE PROCEDURE BAK_TEST(table_name in varchar)
return numberASBEGINEND;--需要单独选中执行存储过程调用(下面只是调用存储过程语法)
--参数为 需要备份的表名
BEGINBAK_TEST('norm');
END;

利用存储函数备份表案例

--创建存储过程调用
CREATE OR REPLACE PROCEDURE BAK_TEST(table_name in varchar)
ASs_table_name VARCHAR(100);s_date VARCHAR(20);str_sql VARCHAR2(500);
BEGINfor cryptic_rec in (SELECT * FROM norm)loopBEGINselect to_char(sysdate,'yyyymmdd') INTO s_date from dual;s_table_name := cryptic_rec.name ||  '_' ||s_date;dbms_output.put_line ( '-- s_table_name=' || s_table_name );str_sql :='CREATE TABLE '|| s_table_name || ' AS SELECT * FROM '|| cryptic_rec.name;EXECUTE IMMEDIATE str_sql;dbms_output.put_line ( '--SQL=' || str_sql );--当出现异常时,将异常插入日志表,并继续下一次循环EXCEPTIONWHEN OTHERS THENBEGINdbms_output.put_line ( 'error-SQL=' || str_sql );END;END;end loop;
END;--需要单独选中执行存储过程调用(下面只是调用存储过程语法)
--参数为 需要备份的表名
BEGINBAK_TEST('norm');
END;

触发器

create [or replace] trigger trigger_name
{before|after}
{insert|delete|update [of column]}
on [schema.]table_name
[for each row]
[when condition]
trigger_body;
--分为行触发和语句触发

案例

create or replace trigger hell_trigger
after
update on employees
--for each row
begin dbms_output.put_line('hello');
end;
-- old,new
create or replace trigger del_trigger
after
delete on employees
for each row
begin insert into my_emp_bakvalues(:old.emp_id,:old.salary);
end;

Oracle常用函数

大写小写函数

Oracle 大小写转换函数

转大写UPPER

转小写LOWER

测试:

select UPPER('Test') as u from dual;--TEST
select LOWER('Test') as l from dual;--test

注意:

1.sys用数据库的超级用户,数据库内很多重要的东西(数据字典表、内置包、静态数据字典视图等)都属于这个用户,sys用户必须以sysdba身份登录。

2.提示 ORA-01031: 权限不足

执行DDL报错
在oracle存储过程中,默认是可以直接执行DML和DQL的,但是执行CREATE这种的DDL则需要借助EXECUTE IMMEDIATE ···了,如下备份表语句--抄表表备份SELECT TO_CHAR(SYSDATE,'YYMMDD') INTO V_DQRQ FROM DUAL;V_CREATESQL := 'CREATE TABLE SF_EBZCB'||V_DQRQ||'_T AS SELECT * FROM SF_EBZCB_T'; EXECUTE IMMEDIATE V_CREATESQL;
当执行该语句时,提示 ORA-01031: 权限不足。该用户已赋予DBA权限。原因:CREATE TABLE想使用CREATE ANY TABLE权限,而CREATE ANY TABLE权限来自DBA角色,默认情况下,虽然在会话环境中可见,但在存储过程中不可见(无效)。即:ORACLE默认为定义者权限,定义者权限在存储过程中ROLE无效,需要显式授权。GRANT CREATE ANY TABLE TO charge_liny;
执行上面sql显式授权后,在该用户下通过 EXECUTE IMMEDIATE 执行CREATE语句即可成功创建表。
授权其他DML权限GRANT INSERT ANY TABLE TO CHARGE_LINY;
GRANT UPDATE ANY TABLE TO CHARGE_LINY;
GRANT DELETE ANY TABLE TO CHARGE_LINY;

Oracle数据库PL/SQL块-存储函数和过程相关推荐

  1. oracle写SQL快捷键,Oracle数据库PL/SQL快捷键设置详解

    Oracle数据库中,PL/SQL设置快捷键的方法是本文我们主要要介绍的内容,了解了这些设置可以是我们更效率地使用Oracle数据库,接下来就让我们一起来了解一下这部分内容吧. 1.登录后默认自动选中 ...

  2. Oracle(四):PL/SQL、存储函数、存储过程、触发器

    一.PL/SQL (一)什么是 PL/SQL PL/SQL(Procedure Language/SQL)是 Oracle 对 sql 语言的过程化扩展,指 在 SQL 命令语言中增加了过程处理语句( ...

  3. oracle if函数变量,Oracle数据库——PL/SQL编程

    PL/SQL块基本结构 declare -- 声明部分 begin -- 执行部分 exception -- 异常处理部分 end; 声明部分:包含变量.常量定义,由 declare 关键字开始,如果 ...

  4. Oracle数据库PL SQL开发、Oracle-SQL开发习题答案

    第2章 编写简单的查询语句 练习1 1.使用两种方式查询所有员工(EMP)信息. SELECT *FROM emp;SELECT empno,ename,job,mgr,hiredate,sal,co ...

  5. oracle查询数据都是问号,Oracle数据库PL/SQL Developer查询结果显示问号乱码的解决方法...

    PL SQL Developer,查询结果中的中文变成了一堆问号,SQL语句中的中文被提示invalid character,不能识别. 解决方法: 执行,select userenv('langua ...

  6. Oracle的学习心得和知识总结(八)|Oracle数据库PL/SQL语言GOTO语句技术详解

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.参考书籍:<Oracle Database SQL Language Reference> 2.参考书籍:& ...

  7. Oracle数据库——PL/SQL程序设计综合案例

    一.程序设计方法 1.瀑布模型 2.SQL 语句 3.变量: 初始值是多少 最终值如何得到 二.综合案例 1.综合案例1 统计每年入职的员工人数 /*SQL语句select to_char(hired ...

  8. Oracle数据库PL/SQL中执行存储过程

    有时生产线上问题,或者调试需要手动在pl/sql中执行存储过程,但一般不建议这么做(影响线上交易). 一.直接测试执行 在pl/sql中找到对应需要测试的存储过程,左边菜单栏:Procedures下. ...

  9. Oracle入门(十四.3)之创建PL / SQL块

    一.PL / SQL块结构 一个PL / SQL块由三部分组成. PL / SQL块结构部分 二.PL / SQL编译器 用高级编程语言(C,Java,PL / SQL等)编写的每个程序都必须经过检查 ...

最新文章

  1. Python机器学习——Agglomerative层次聚类
  2. 汽车车灯灯具系统(上)
  3. python 字符编码问题
  4. python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc
  5. IDEA 系列安装资料及教程
  6. java core日志在哪里_java-如何在未启用日志记录功能的情况下在...
  7. Redis 键(key) 命令
  8. 阻止事件冒泡两种方式:event.stopPropagation();和return false;
  9. pep8 python 编码规范_实用的python编码规范
  10. python serial 发送ctl+c_[已解决]shell 脚本 给命令发送 Ctrl+C信号
  11. ubuntu安装python百度经验_如何在Ubuntu 20.04上安装Python 3.9(含python编译安装和使用Apt命令安装)...
  12. WCF学习之旅(一)---Hello World.
  13. 在京东如何查找计算机的销量,京东商品真实销量数据怎么看?教你一键查询
  14. MOS管防倒灌电路设计及其过程分析
  15. c语言编程创意表白,C语言和图形界面编程打造——浪漫的表白程序
  16. python 读写pcd
  17. html5网页特效-水墨动画
  18. 更加安全便捷的印章管理——区块链电子印章
  19. 计算机原理说课教案,《计算机系统及工作原理说课稿》
  20. 小米6手机投屏到wins 8.1电脑上的软件——scrcpy的安装与使用教程

热门文章

  1. Socks代理是什么意思?有什么用?
  2. 自然语言处理实战——巧用 Amazon Comprehend 分析社交媒体数据
  3. rss订阅 android,是的!我用这些软件订阅 RSS
  4. 生命密码是几适合学计算机,生命密码学
  5. 怎样识别app网站服务器在国外,APP服务器你了解多少?什么是海外app服务器
  6. Dilated Convolution + Receptive Field
  7. android遥控杆控件,Android自定义滑杆控件SeekBar多功能版本
  8. python pandas 实现Excel自动填充功能
  9. iview在table中添加图片
  10. angularjs2大漠穷秋视频笔记整理