oracle——基础知识(二)未完
1、select 查询
单独的一条 select 语句 可以一次查询多条记录;但是在 pl/sql 块中,select语句只能 使用INTO子句;必须并且只能返回一行
2、EXECUTE IMMEDIATE。解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块。
注:
1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交事务,如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据
2. 不支持返回多行的查询。
3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号;
4.举例:execute immediate 'select count(1) from tempA';
3、存储过程
定义在包内的存储子程序称为打包子程序;单独定义的存储子程序称为独立子程序;而在另外一个子程序或PL/SQL块内定义的存储子程序称为本地子程序,这样的子程序不能被其他应用程序调用,只供本地使用。
| in 类型参数 | out 类型参数 | in out 类型的参数 | |
| 值 | 传递给子程序 | 返回给调用环境 | 传递给子程序,返回给调用环境 |
| 参数形式 | 常量 | 未初始化的变量 | 初始化的变量 |
| 使用时 | 默认类型 | 必须明确指定 | 必须明确指定 |
4、函数
格式:
create or replace function 函数名(参数1 参数类型,……) return 返回值类型
as
返回值变量 类型;
begin
……
return 返回值变量;
end;
- 只能使用in模式参数传入参数值.
- 必须要有返回类型,并且返回值必须要使用.
5、触发器
格式:
Create [or replace] trigger 触发器名
Before|after insert|delete|(update of 列名)
On 表名
[for each row]
begin
……
end;
For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次;
触发器用到的表名 :new 、:old
| 特性 | insert | update | delete |
| :old | null | 有效 | 有效 |
| :new | 有效 | 有效 | null |
6、游标
分为 隐式游标、显式游标、动态游标;用到的属性
| 属性 | 类型 | 描述 |
| %isopen | boolean | true:游标打开;false:游标未打开 |
| %notfound | boolean | true:未提取到记录;false:提取到记录 |
| %found | boolean | true:提取到记录;false:未提取到记录 |
| %rowcount | number | 到目前为止,SQL语句通过游标提取到的总行数 |
SQL语句中 insert、delete、update 语句即是通过隐式游标完成的,它自动打开、自动关闭;
(1)显式游标:
- 格式:
DECLARE
变量 变量类型;
CURSOR 游标名 IS select语句; --1、声明游标
BEGIN
OPEN 游标名; --2、打开游标
LOOP
FETCH 游标名 INTO 变量; --3、从游标中循环提取数据
EXIT WHEN 游标名%NOTFOUND;
……
END LOOP;
CLOSE 游标名;--4、关闭游标
END;
- 通过使用For循环来读取游标中的数据
格式:
for 表示记录行的变量 IN 游标 loop
……
end loop
- 声明带参数的游标:
格式:CURSOR 游标名(参数名 类型) IS 使用参数的select语句; 打开游标 OPEN 游标名(参数值);
- 可以通过游标来更新、删除数据,只需在声明游标时按如下设置:
格式:CURSOR 游标名 IS select语句 for update; --for update 表示该游标可以用于更新、删除数据。
获取游标数据后:update 表名 set 字段名 = 变量*1.1 WHERE CURRENT OF 游标名; --WHERE CURRENT OF 游标名; 表示游标当前指向的那行记录。
例:
create or replace procedure temp_1(deptid number) is
emp_record emp%rowtype; --声明行类型
CURSOR emp_cursor IS SELECT * FROM emp where deptno = deptid for update; --声明可以修改、删除数据的游标
begin
for emp_record in emp_cursor loop
dbms_output.put_line(emp_record.sal||' '||emp_record.ename);
update emp set sal = emp_record.sal*1.1 WHERE CURRENT OF emp_cursor;--通过游标更改数据
dbms_output.put_line(emp_record.sal||' '||emp_record.ename);
end loop;
end temp_1;
(2)引用类型游标:可以向客户端返回结果集
声明类型格式: type 类型名 is ref cursor;
声明变量格式:变量名 变量类型;
7、包:是由存储在一起的相关对象组成的PL/SQL存储程序;由包头和包体两个独立的部分组成,需要分别定义;
包头与包体的关系:
- 在包头声明过的是外部可以调用的过程、函数、变量;只在包体内定义而未在包头声明的的只能在包体内可见;
- 在包中声明的时候,必须是前向声明的,也就是对象需要引用的另一个对象必须在前面首先声明;
- 包头是必须存在的,包体是可选的;
- 包头必须在包体前创建,否则创建不了包体;
- 只在包头中包括公用变量、过程、函数的声明;
- 包头:包头主要包含了包中出现的过程、函数的声明,但是不包括实际的代码部分;
格式:
CREATE [OR REPLACE] PACKAGE package_name{IS | AS}
type_definition -- 类型定义
procedure_specification -- 过程定义
function_specification --函数定义
variable_declaration --变量定义
cursor_declaration -- 游标定义
END [ package_name];
例:
第一步:创建一个包头,包含一个普通的变量和一个过程。
CREATE OR REPLACE PACKAGE mypackage_1
is
a number := 1;
procedure mypro(x number,y number,z out number);
function myfunc(x number)return number;
END mypackage_1;
第二步:使用包中定义的变量。
declare
begin
dbms_output.put_line(mypackage_1.a);
mypackage_1.a := 2;
dbms_output.put_line(mypackage_1.a);
end;
第三步:重新启动sql*plus,然后输出mypackage_1.a的值。此时会发现,仍然是1。
- 包体:是真正的过程、函数的执行部分定义
CREATE OR REPLACE PACKAGE body mypackage_1
is
b number := 2;
procedure mypro(x number,y number,z out number)
is
b number := 4;
begin
z := x*y;
end;
function myfunc(x number)return number
is
x1 number;
begin
x1 := b*x;
return x1;
end;
function myfunc1(x number)return number
is
x1 number;
begin
x1 := b*x;
return x1;
end;
END mypackage_1;
第二步:在sql*plus里面调用使用包。
分别输出包头中定义的变量,包体中定义的变量。
begin
dbms_output.put_line(mypackage_1.a);
dbms_output.put_line(mypackage_1.b);
end;
结果:不能使用b,因为b是包体中定义的,不能在外部访问。
调用myfunc/myfunc1函数。
declare
begin
dbms_output.put_line(mypackage_1.myfunc1(2));
end;
结果:无法调用myfunc1,只能使用在包头中定义好的过程,函数等,在只在包体中定义的函数或过程等相当于private 只能在包内部使用。
8、返回多条记录:
- 创建包头;
- 包头中用 type 声明引用类型游标;
- 包头中声明带有 out 关键字的引用类型;
- 在包体中用open for 打开引用游标;
第一步:创建包头
create or replace package testpage_1 is
type my_cursor is ref CURSOR;--声明引用游标类型
procedure mypro(arr out my_cursor);--声明过程
end testpage_1;
第二步:创建包体
create or replace package body testpage_1 is
procedure mypro(arr out my_cursor)
is
begin
open arr for SELECT * FROM employees;
end;
end testpage_1;
注:ref cursor是Oracle旧版本中使用的数据类型,用这种对象的缺点在于必须在包中定义;而现在用 sys_refCursor类型,可以直接使用。
oracle——基础知识(二)未完的更多相关文章
- HTML基础知识(未完待续)
一.HTML编辑工具:Sublime Text 二.HTML实体字符:1.( 空格): : 2.(<) <: 3.(>)>: 4.(&)&a ...
- oracle 基础知识(二)-表空间
一,表空间 01,表空间? Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间下可以有N张表.有了数据库,就可以创建表空间.表空间(tablespace)是数据库 ...
- spring基础知识,未完待续
https://blog.csdn.net/slow_wakler/article/details/54895508 http://www.runoob.com/design-pattern/ch ...
- 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理
菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ...
- Oracle基础知识汇总一
Oracle基础知识 以下内容为本人的学习笔记,如需要转载,请声明原文链接 https://www.cnblogs.com/lyh1024/p/16720759.html oracle工具: SQ ...
- 图说Oracle基础知识(一)
本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- Dapper基础知识二
在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 2,如何使用Dapper? 首先Dapper是支持多种数据库的 ...
- python基础知识(二)
python基础知识(二) 字符串格式化 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 print(' %s is boy'%('tom')) ----> ...
- Java基础知识二次学习--第三章 面向对象
第三章 面向对象 时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...
随机推荐
- HDU 2430 Beans (单调队列+公式化简)
题意:给你n袋豆子,每袋都有w[i]个豆子,接着任选连续任意个袋子的豆子合在一起放入容量为p的多个袋子里(每个袋子必须放满),问剩余的豆子数<=k时,能放满最多的袋子的个数 题解:个数与p都比较 ...
- SaaS架构经验总结
2B Saas系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统.很多Saas创业公司也拿了大额风投.毕竟Saas相对传统软件的优势非常明显. ...
- IOS开发--解析复杂json数据
json的自我介绍:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于人阅 ...
- 《Think in Java》(九)接口
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法: 抽象化类则是普通类与接口之间的一种中庸之道: 涨姿势了 接口也可以拥有值属性,但它们都是隐式的 static 和 final 的: 接 ...
- git 上传项目到分支
步骤 git init git add . git commit -m'代码描述' git remote add origin 远程仓库地址 git branch xxx # 创建新分支 git ch ...
- 总结一下内核DEBUG中的dump_stack, BUG, BUG_ON以及panic
有点空闲时间,让我们来总结一下内核DEBUG中的各个语句吧.随便找个内核驱动,在init函数里面加入如下代码测试: u8 a = 1, b = 0; printk("----------du ...
- 一个丰富的通知工具类 --第三方开源--NotifyUtil
把NotifyUtil Copy进自己的项目就好 实现有八种,作者在Demo里全部演示齐了,分别是 普通类型通知(单行) 普通类型通知(多行) 消息列表通知(含双图标) 含大图类型通知 自定义视图通知 ...
- redis_学习_02_redis 可视化工具 Redis Desktop Manager
二.参考资料 1.Redis可视化工具Redis Desktop Manager使用 2.超好用的Redis管理及监控工具,使用后可大大提高你的工作效率!
- XE7 UTF8Encode
之前用D7写的客户端程序升级到XE7,服务端依旧用D7.使用TIdHTTP控件 Get(URL)方法,服务端(TIdHttpServer)收到的中文字符解释成乱码. 鼓捣了一会,这么搞定的: 1. 客 ...
- 如果两个人,两台电脑同时登录同一个帐号,同时对同一个账单提交,账单同时被服务器处理,那服务器应该先处理谁的,或者怎么规避这个问题。 非单点登录,重定向,stoken拦截器的问题
方法一:给用户设置个状态 服务器端坐标记,比如数据库中增加一列,标识是否登陆,登录时先判断这个就行了,不过要考虑非正常退出的情况 http 方法二:在用户表里面 多加一个状态字段,登录成功 改变状态 ...