【PL/SQL编程基础】

【PL/SQL编程基础】 语法: declare 声明部分,例如定义变量、常量、游标 begin 程序编写,SQL语句 exception 处理异常 end; / 正斜杠表示执行程序快 范例 -- Created on 2016/8/22 by VITAS declare 定义变量 v_num number; v_eno number; v_ename varchar2(10); begin v_num:=234; v_eno:=&empno; 接收输入变量 select ename into v_ename from emp where empno=v_eno; DBMS_OUTPUT.put_line(v_ename); end; /

变量的声明和使用

PLSQL是一种强类型的编程语言,变量名前加v表示变量 语法: 所有的变量都要求在declare部分之中进行,可以在定义的时候赋默认值,变量声明语法如下: 变量名[constant] 类型 [not null][:=value] declare v_resultA number; v_resultB number :=100; v_resultC constant number:=14; begin v_resultA:=10; dbms_output.put_line('result 的值是:'||(v_resultB+v_resultA+v_resultC));

end; / 使用%type定义变量 使用%rowtype声明变量,可以定义表中一行记录的类型 运算符: 掌握变量的声明和使用 掌握%type和%rowtype的使用

PL/SQL分支语句 if/else 循环: loop: 语法: loop exit when 循环结束条件 end loop while() loop

end loop; for: for 循环索引 in 循环区域下线..循环区域上线 loop end loop; goto语句: goto endpoint <<endpoint>>

异常处理: 1、编译时异常,无法处理 2、运行时异常:用户可以处理的只有运行时异常 异常处理要使用EXCEPTION子句处理,通过when子句对异常处理 when 异常类型|用户自定义异常|异常代码|other then 异常处理 产生异常后继续执行其他代码

记录类型: 定义记录类型语法: type 类型名 is record( 成员名 数据类型 [[not null][:=默认值] 表达式], ...... 成员名 数据类型 [[not null][:=默认值] 表达式]

嵌套记录类型 雇员中包含部门信息 插入复合数据类型 insert into dept values v_dept

更新复合数据类型 update dept set ROW=v_dept where deptno=v_dept_deptno;

索引表的概念(数组) 索引表类似于程序语言中的数组,可以保存多个数据 区别:不需要初始化 索引:数字或者字符串,下标可以设置为负数 语法: type 类型名称 is table of 数据类型【not null】 index by [pls_integer|binary_interger|varchar2] 访问没有定义的索引,会出现数据找不到的异常,但是索引的下标不是顺序的,所以索引值可能不存在,一次提供exists(index)判断是否存在 范例:使用字符串作为字符索引 范例:使用rowtype数组 范例:使用记录类型数组 嵌套表:(跳过)start 1、定义简单类型的嵌套表 CREATE [OR REPLACE] TYPE 类型名称 AS|IS TABLE OF 数据类型 [not null];/ create or replace type project as table of varchar2(20); 集合运算符:

集合函数:count、first last 集合异常处理: 跳过 end 使用forall批量处理: 使用for in:(更新n次) for xx in 集合 first..last loop end loop 2、使用forall:(批处理更新数据) 语法: forall x in 集合 first..last update.....

批量接收数据: bulk collect into

子程序:

目标 1、掌握子程序的分类 包含存储过程和函数 定义过程: 专门定义一组sql语句集 语法: 过程=声明+plsql快 CREATE [OR REPLACE] PROCEDURE 过程名 (参数名[模式in/out/in out] nocopy 数据类型,....) as|is [pragma autonomous_transaction] 声明部分: begin exception when others then rollback end 过程名

过程没有返回值 create or replace procedure ChangePassword(userName in out varchar2, password in out varchar2) is pragma autonomous_transaction; v_result boolean; begin

v_result := login(userName, password); end ChangePassword;

范例:定义一个过程 过程定义完之后要通过exec 过程名 执行过程 范例: 定义过程根据雇员编号找到姓名和工资

函数: 用户定义的sql语句或者plssql直接调用,函数和过程的最大区别在于函数可以返回值,而过程智能通过in和out来返回数据, 语法如下:类型为numnber或者varchar时不需要定义长度否则编译不能通过 CREATE [OR REPLACE] FUNCTION 过程名 (参数名[模式] nocopy 数据类型,....)

return 返回值类型 as|is [pragma autonomous_transaction] 声明部分 begin return 返回值; exception when others then rollback end 函数名 create or replace function LOGIN(userName in out varchar2, password in varchar2) return boolean is v_isLogin boolean; --定义rowtype userrow T_USER%ROWTYPE; --定义元素为rowtype类型的集合 type UserInfo is table of T_USER%ROWTYPE index by binary_integer; --定义类型后需要对定义类型变量 users UserInfo; --定义记录类型 type userRecord is record( id number(10), userName varchar2(32), password varchar2(32), roleId number(10)); userR userRecord; --定义自定义事务,此事务的rollback和commit不会影响到主事务 pragma autonomous_transaction; begin

--使用bulk collect into批量查询赋值 select * into userR from T_USER where userName = 'YWP'; userR.userName := 'zp'; insert into T_USER VALUES userR; commit; select * BULK COLLECT INTO users from T_USER where username = userName and password = password; if users.count != 0 then dbms_output.put_line('welcome login my system!'); else dbms_output.put_line('用户名或密码错误'); end if; exception when others then dbms_output.put_line('313'); /* --使用for in遍历集合 for i in users.first .. users.last loop --输出变量时先判断下标是否存在 if users.exists(i) then dbms_output.put_line('welcome login my system!'); end if; end loop;*/ userName := 'ywp'; return(v_isLogin); end LOGIN;

2、掌握子程序的定义和区别 子程序的参数模式 形参定义有三种 in:(默认值),子程序中所做的修改不会影响原始参数(基本数据类型的传递)

out:不带任何数值的子程序中,子程序可以通过此变量将数值传到调用处(引用数据类型的传递) inout,可以将值传到子程序中,兵将子程序对变量的修改返回到调用处

nocopy子选项:将参数变为引用传递,in和out为复制传递参数 自治事务: 在oracle中每个session都有独立的事务, 启动子事务 利用java调用子程序

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏曾大稳的博客

c基础

771
来自专栏数据小魔方

NoSQL学习笔记之——Redis基础

之前练习过一篇NoSQL之Mongodb基础的笔记,这一篇开始练习NoSQL系列的又一重要利器——Redis。 Redis是一个开源的,基于内存并可持久化的日志...

2666
来自专栏C/C++基础

2018腾讯内部调岗面试试题1——使用C/C++但不能用sizeof判断操作系统是32位还是64位

2018上半年折腾了一回,想换个后台开发岗尝试锻炼一下自己,面了三个部门,将有关有意思的题目汇总记录下来,供大家参考。

701
来自专栏Java帮帮-微信公众号-技术文章全总结

24(02)多线程锁,线程通讯,线程组,线程池,多线程三种方式,匿名内部类,定时器,设计模式,单例模式,Runtime

(6)多线程实现的第三种方案 package cn.itcast_09;(1) import java.util.concurrent.Callable; //...

4104
来自专栏沈唁志

深入解析PHP中array_merge函数的用法

942
来自专栏北京马哥教育

可能是最全面的 Python 字符串拼接总结

在 Python 中字符串连接有多种方式,这里简单做个总结,应该是比较全面的了,方便以后查阅。

810
来自专栏ios 技术积累

ios Category

category是Objective-C 2.0之后添加的语言特性,category的主要作用是为已经存在的类添加方法。除此之外,apple还推荐了catego...

611
来自专栏mukekeheart的iOS之旅

Java程序员面试宝典——重要习题整理

1、下面程序的输出结果是() public class Test { public static void main(String[] arg...

2299
来自专栏debugeeker的专栏

《coredump问题原理探究》Linux x86版5.3节C风格数据结构内存布局之数组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

481
来自专栏北京马哥教育

Awk是什么?一文带运维小白快速掌握Linux Awk用法

作者:a8 Awk、sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和aw...

3426

扫码关注云+社区