【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 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

ES6学习笔记

本文作者:IMWeb coolriver 原文出处:IMWeb社区 未经同意,禁止转载 本文为初步阅读ECMAScript6入门后的一些记录与感想。 ...

19010
来自专栏Android 研究

Android JNI学习(四)——JNI的常用方法的中文API

本文主要是结合JNI的常用接口文档进行的翻译主要是帮助我们更好的理解JNI中常用的API。具体如下:

591
来自专栏前端儿

了解 JS 作用域与作用域链

不在任何函数内声明的变量(函数内省略var的也算全局)称作全局变量(global scope)

601
来自专栏Celebi的专栏

C/C++ 学习笔记八(断言与异常处理)

工作中经常使用到C/C++,为对C有个比较深刻的了解,重新拾起学习C的任务。在看书的同时,记录下思考的过程,也记录下重要的知识点。

1550
来自专栏Coding迪斯尼

自制Monkey语言编译器:实现函数闭包功能和为语言增加复杂数据结构

922
来自专栏何俊林

NDK开发才是有精华和特色的部分

通常有特色的应用都会涉及NDK开发,而NDK开发基本是C/C++开发,核心和精华也是在这块。像滤镜、美颜、美肤、人脸识别,编解码,这些出了问项目问题外,首先要过...

2643
来自专栏马涛涛的专栏

JS题目总结:原型链/new/json/MVC/Promise

解读: 上图中,Object,Function,Array,Boolean都是构造函数

822
来自专栏华章科技

Python 3 入门,看这篇就够了

链接:https://shockerli.net/post/python-study-note/

1316
来自专栏Coding迪斯尼

自制Monkey语言编译器:解释执行return语句和错误处理控制

955
来自专栏web前端教室

5分钟学会javascript闭包(二)

昨天说了闭包很牛逼,很有用,今天来讲一下,它有什么用处。 它的用处主要有二个, 1,读取函数内部的变量; 2,可以让这些变量的值一直保存在内存中,(内存泄露就是...

1789

扫码关注云+社区