Oracle数据库开发
介绍使用oralce进行开发的基础知识,包括标准SQL语句和PLSQL的编写方法。。
HymanLiuTS
年过而立,又酸又臭,忙时敲代码,闲时读书写文章。
展开
-
36.动态SQL
一、引言 前面介绍的所有内容,所操作的数据库表必须存在,否则执行子程序时就会出现问题,这种方法叫做静态SQL。PLSQL中有一种能够定义程序时不指定具体的操作对象,在执行时动态传入对象的技术,叫做动态SQL。二、动态的创建表格并返回表格行数 下面的代码,我们定义了一个名叫get_table_count_fun的function,该函数接收一个字符串格式的表名作为原创 2017-04-06 09:53:21 · 1280 阅读 · 1 评论 -
35.表级和行级DML触发器
一、引言 触发器类似于过程和函数,都有程序主题部分(声明段、可执行段、异常处理段),但是调用其和函数不同,触发器为依靠事件执行的,且由于其是隐式调用的,触发器没有参数。 本文主要介绍oracle中的DML触发器,顾名思义就是执行DML语句对表进行增、改、查时执行的触发器。 我们先创建如下的表myemp:create table myemp原创 2017-03-30 10:51:13 · 1480 阅读 · 0 评论 -
34.C#调用Oracle中的包
在上一文中我们介绍了PLSQL中包创建方法,本文介绍在C#中调用包中存储函数和存储过程的方法,以上一文中我们封装到emp_pack包中的get_emp_func函数为例,我们介绍C#中调用该函数的方法。 首先,emp_pack包体的定义如下:create or replace package body emp_packas function get_emp_func(原创 2017-03-29 16:04:40 · 2427 阅读 · 0 评论 -
33.PLSQL中的包
一、引言 PLSQL中的包类似于C++中的类,在包中我们可以定义变量、游标、存储过程、存储函数等等。它实现了将上述类型统一创建和管理,同时在不同包之间这个PLSQL的对象不会存在命名冲突问题。包的定义包含两部分,包头和包体,有点类似于C++中的类的头文件和cpp文件。在包头中我们对变量、存储过程等等进行声明,而在包体中是对他们的实现。下面,我们在emp表的基础之上介绍包的用法。如原创 2017-03-29 09:49:49 · 1231 阅读 · 0 评论 -
32.C#调用Oracle的存储过程和函数
一、引言 在前面的文章中我们分别讲解了Oracle中存储过程和存储函数创建的方法,本文主要介绍在C#中调用之前创建的存储过程和函数的方法。二、C#调用带参的存储过程 首先,假设我们有以下数据表emp: 并创建了存储过程insert_emp:create or replace procedure insert_emp原创 2017-03-28 16:39:13 · 4154 阅读 · 0 评论 -
31.PLSQL中的函数
一、存储函数的定义 函数是PLSQL中另一种子程序,与存储过程不同的是,存储函数具有返回值,就像C/C++中的函数一样,可以通过函数返回某些值,我们先来看下下面定义的一个返回雇员薪资的函数:create or replace function get_income(v_empno emp.empno%type)return numberas v_income emp.s原创 2017-03-28 11:14:47 · 1243 阅读 · 0 评论 -
30.PLSQL中的过程
一、引言 过程,是对一组PLSQL语句的封装,以达到代码复用的目的。创建一个过程之后,它便存储在了数据库中,我们随时随地可在其他PLSQL的数据块中进行引用。二、创建一个简单的存储过程 接下来,我们先创建一个简单的显示“Hello World”的存储过程,代码如下:create procedure print_procasbegin dbms_o原创 2017-03-28 10:15:53 · 1111 阅读 · 0 评论 -
29.PLSQL中的参考游标
在上一文中,我们介绍了使用PLSQL的显式游标,该类游标在声明之初已经和sql语句进行了绑定,属于静态的游标。而本文中我们介绍的参考游标,属于动态游标,在其声明时未绑定sql语句,而我们在使用时可以动态的绑定sql语句。 如下,假设存在下表emp: 现在我们利用参考游标来实现打印输出deptno为20的所有雇员的信息:declare type c原创 2017-03-27 16:35:35 · 1171 阅读 · 0 评论 -
28.PLSQL中的显式游标
在上一文中,介绍了PLSQL中的隐式游标的用法,本文主要介绍另外一种游标的使用——显式游标。一、显式游标声明和属性1.1 显式游标的声明 所谓显式游标,就是我们在PLSQL的声明区,显式的去声明的游标,它在声明时已经绑定的SQL语句,将会管理该SQL语句返回的结果集,其声明格式如下:cursor 游标名称 is SQL语句 如果声明一个管理emp表查询原创 2017-03-27 15:47:16 · 1419 阅读 · 0 评论 -
27.PLSQL中的隐式游标
一、什么是游标 简单来理解,在PLSQL中,无论我们查询数据库还是向数据库插入、修改和删除的DML操作,凡是对数据库产生了影响,执行的sql语句都会返回一个由受影响的数据行组成的结果集,而游标就是管理这个结果集的对象。 Oracle中游标分为两种——隐式游标和显式游标,每个sql语句返回的结果集都会默认受‘SQL’这个隐式游标的管理;而显式游标是我们自定义的游标,原创 2017-03-24 17:01:06 · 1956 阅读 · 0 评论 -
26.PLSQL中使用forall和bulk collect批量操作数据库
假设有以下数据表emp:一、使用forall批量修改数据库 如果有以下需求:要求修改EMPNO为7499、7566、和7654的成员的sal值为5000,如果我们在Plsql中使用for循环,如下:declare type empno_varray is varray(8) of emp.empno%type; v_empno empno_varray :=em原创 2017-03-23 17:53:52 · 3140 阅读 · 1 评论 -
25.PLSQL中的数组
在上一文24.PLSQL中的索引表>>中,我们介绍了oracle中的索引表的使用,之前提到过索引表类似C语言中的数组,本文介绍一种PLSQL中真正的数组---Varray。Varray具有以下特点: 1、Varray是固定长度的数组,在创建时需要制定数组的长度和类型。 2、Varray可以放置重复的元素。 3、Varray是一种可以在PLSQL原创 2017-03-22 10:26:03 · 8914 阅读 · 1 评论 -
24.PLSQL中的索引表
索引表类似于C语言中的数组,它允许我们以下标的形式去存储和访问表中的数据,但是和数组不同的是,索引表中的索引是可以不连续的,获取下标指定的数据时用’()’而非‘[]’,且不能用循环语句来遍历索引表。 索引表的下标支持的类型有以下三种:PLS_INTEGER、BINARY_INTEGER、VARCHAR2。存在其中的数据类型包括基本的NUMBER、VARCHAR2等基本的PLSQL原创 2017-03-20 18:53:46 · 2942 阅读 · 0 评论 -
23.PLSQL中的记录类型
PLSQL中的记录类型Record类似于C语言中的结构体,无非就是将若干相关联的字段组合成一个整体,假设有如下的表格,使用自定义的Record类型将其读取,它的使用方法归纳如下:一、使用普通的数据类型定义Recorddeclare TYPE mydept_type IS RECORD( dnum number, dname varchar2(20) ); v_de原创 2017-03-17 18:59:07 · 3086 阅读 · 1 评论 -
22.PLSQL中的程序结构语法
假设有下表emp:一、条件分支1.1 找到empno为7499的员工,如果其sal小于2000,就直接加到2000declare v_sal number;begin select sal into v_sal from emp where empno=7499; if v_sal<2000 then update emp set sal=2000 wher原创 2017-03-08 11:03:16 · 723 阅读 · 1 评论 -
21.PLSQL中的变量声明
一、在声明区只声明不赋值declare v_num number;begin v_num:=30; dbms_output.put_line('v_num变量的内容是:'||v_num);end;/二、在声明区声明时同时赋值declare v_num number :=40;begin dbms_output.put_line('v_num变量的内容是:原创 2017-03-06 13:52:59 · 5139 阅读 · 0 评论 -
20.索引
假设有以下emp表格: 现在我们要查询所有sal值大于2000的人员的信息,对应的sql语句如下:select * from emp where sal>2000; 在正常情况下,数据库引擎会自上而下逐条检查记录,如果sal大于2000,该条记录就会被保留。在数据量较小的情况下,这个过程耗费时间可能不会很长,但是如果数据条数过多,有几万条或者几十万原创 2017-03-01 14:00:07 · 702 阅读 · 0 评论 -
19.oracle伪列
一、ROWID伪列 数据表中每一行所保存的记录,Oracle都会默认为每条记录分配一个唯一的地址编号,这个地址编号就是ROWID。1.1 查询ROWID select rowid,deptno,dname,loc from dept; ROWID保存着该条数据数据对象号(表空间)、相对文件号(文件)、数据块号(数据块)和数据行号(行)信息,原创 2017-02-28 15:10:42 · 947 阅读 · 0 评论 -
18.序列
一、创建默认序列create sequence myseq;二、创建含有步长和起始值的序列create sequence myseq increment by 1 start with 0;三、使用序列的nextval属性insert into mydept values(myseq.nextval,'系统软件部');四、删除序列drop sequence myse原创 2017-02-27 19:06:37 · 811 阅读 · 0 评论 -
17.视图
假设有以下表:1、创建视图create or replace view myview as select * from emp where deptno=30;2、查看视图select * from myview;3、向视图里面插入数据insert into myview values(8888,'SOFT','developer',7839,sysdate原创 2017-02-24 11:09:32 · 913 阅读 · 0 评论 -
16.约束关系
一、主键约束1.1 表级创建create table mydept(id number, dept_name varchar2(20),constraint pk_id primary key(id));1.2 列级创建create table mydept(id number constraint id_pk primary key,dept_name varchar2(20原创 2017-02-23 17:08:50 · 1617 阅读 · 0 评论 -
15.创建、删除和修改表的DDL语句
一、新建表1.1 新建表增加列级主键约束create table mydept(dept_id number constraint pk_dept_id primary key,dept_name varchar2(20));1.2 新建表增加表级主键约束create table mydept(dept_id number,dept_name varchar2(20),constr原创 2017-02-21 17:52:53 · 2867 阅读 · 0 评论 -
14.管理表中的数据DML语句
dept表数据如下:一、在表中插入数据insert into dept values(50,'SOFT','SHENZHEN');或者:insert into dept (deptno,dname,loc) values(50,'SOFT','SHENZHEN');二、修改表中的数据update dept set dname='soft2',loc='shangha原创 2017-02-20 11:23:22 · 825 阅读 · 0 评论 -
13.子查询返回多行多列的数据
假设有下面两张表:部门表dept雇员表emp 列出公司各个部门的经理的姓名、薪金、部门名称、部门人数、部门平均工资。步骤1:查找每个部门经理的姓名和薪金。select ename,sal from emp where job='MANAGER';步骤2:连接dept表,查询部门名称。select e.ename,e.sal,原创 2017-02-17 11:27:15 · 14276 阅读 · 0 评论 -
12.在where中使用子查询-子查询返回单行单列和单行多列的数据
子查询:子查询简单来理解就是用查询的结果在内存中构建一个数据表,而我们可以使用普通sql语句来操控这个内存中的数据表,这个数据表就叫做子查询。一、返回单行单列数据的子查询。select ename from myemp;返回结果:ENAMEBLAKE返回的这个名称即在内存中构建了一个单行单列的数据的表,‘ENAME’是列名称,'BLACK'是单行单列的值,我们可原创 2016-05-22 17:26:47 · 6188 阅读 · 0 评论 -
11.统计函数
人员表s_emp:empno ename deptno sex1 Tom 10 man2 Hyman null man3 Jarry 10 woman4 Pully 20 woman4 Jan 10 woman部门表s_dept:deptno dname10 soft20 administration1、count()求出全部记录数,如下:求出每原创 2016-05-08 18:12:09 · 968 阅读 · 0 评论 -
10.HAVING子句
人员表s_emp:empno ename deptno sex1 Tom 10 man2 Hyman null man3 Jarry 10 woman4 Pully 20 woman4 Jan 10 woman部门表s_dept:deptno dname10 soft20 administrationHAVING子句将分组之后的数据进行过滤,原创 2016-05-08 17:58:51 · 882 阅读 · 0 评论 -
9.单字段分组和多字段分组
人员表s_emp:empno ename deptno sex1 Tom 10 man2 Hyman null man3 Jarry 10 woman4 Pully 20 woman4原创 2016-04-30 18:05:43 · 3892 阅读 · 0 评论 -
8.多表查询-外连接
还是假设有两个表:人员表:empno ename deptno1 Tom 102 Jarry 103 Pully 204 Hyman null部门表:deptno dname10 研发20 行政30 总部现在有个需求,要找到所有员工对应的工号/姓名/部门号以及部门名称,我们看员工表,此时存在一个不存在部门号的员工Hyman,此时要怎么把所有员工的原创 2016-04-30 17:21:48 · 840 阅读 · 0 评论 -
7.多表查询-内连接
有下面两个表emp表empno ename deptno 1 Tom 10 2 Jerry 10 3 Pully 20dept表:deptno deptname 10 开发 20 行政 一、笛卡尔积 概念:连接原创 2016-04-21 00:19:03 · 832 阅读 · 0 评论 -
6.单行函数-通用函数
1、使用NVL()将判断操作数是不是null,若是null返回后面的值,若不是null返回该值select NVL(sal,0) from emp;--若sal是null,返回0;若sal不是null,返回sal2、使用NVL2()判断是不是nullselect NVL2(comm,sal+comm,sal) from emp;--若comm是null,返回sal;若comm不是nul原创 2016-04-15 23:26:33 · 771 阅读 · 0 评论 -
5.单行函数-转换函数
1、TO_CHAR格式化当前的时间日期SELECT TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS') FROM dual;2、TO_CHAR格式化数字显示SELECT TO_CHAR (987654321.789,'L999,999,999,999.99999') FROM dual;3、TO_DATE,转换成日期SELECT TO_DATE('原创 2016-04-10 23:21:26 · 863 阅读 · 0 评论 -
4.单行函数-日期函数
1、获取系统当前时间SELECT sysdate FROM dual;2、查询当前时间三天后的时间SELECT sysdate+3 FROM dual;3、查询三个月后的日期SELECT ADD_MONTHS(sysdate,3) FROM DUAL;4、查询下一个星期日是哪天SELECT NEXT_DAY(sysdate,'星期日') FROM DUAL;5、查询原创 2016-04-05 23:03:08 · 611 阅读 · 0 评论 -
3.单行函数-数值函数
1、ROUND四舍五入,如下结果保留小数点后面三位,为3.142SELECT ROUND(3.1415,3) FROM dual;2、TRUNC截取,如下结果截取小数点后面三位,为3.141SELECT TRUNC(3.1415,3) FROM DUAL;3、MOD取余,以下结果为1SELECT MOD(5,2) FROM DUAL;原创 2016-03-30 00:02:22 · 639 阅读 · 0 评论 -
2.单行函数-字符函数
1、将字符串内容全部转成大写SELECT UPPER(name) FROM emp;2、将字符串内容全部转成小写SELECT LOWER(name) FROM emp;3、将字符串的开头首字母大写SELECT INITCAP(name) FROM emp;4、用新的字符串替换旧的字符串SELECT 'new_name' REPLACE name FROM emp;5原创 2016-03-27 11:57:57 · 741 阅读 · 0 评论 -
1.查询语句
1、查询emp表中所有数据:SELECT * FROM emp;2、排重查询emp表中数据:SELECT DISTINCT id,name,job FROM emp;3、查询时对字段进行数学运算:SELECT name,sal*12 FROM emp;4、查询时设置字段显示的别名SELECT name 名字,sal*12 年薪 FROM emp;5、直接输出数字原创 2016-03-21 23:04:14 · 782 阅读 · 0 评论 -
oracle入门之 其他对象
一、序列sequence作用:用来产生主键的值,保证主键的唯一性创建序列:create sequence 序列名; -- 序列名一般是"表名_主键名"形式,如,create sequence test_id;使用序列:insert into 表名 values(序列.nextval,序列.currval);如,insert into test values(test_id.nextva原创 2015-05-04 10:39:50 · 1056 阅读 · 0 评论 -
oracle入门之 DML&DCL&TCL语句
一、DML数据操作语句(1)insert into向表中插入数据插入所有字段:insert into 表名 values(值1,值2,值3,...);插入部分字段:insert into 表名 (字段1,字段2,...) values (值1,值2,...);(2)delete 从表中删除数据delete from 表名 where 查找条件(3)update 修改表中的数原创 2015-05-04 09:57:27 · 2772 阅读 · 0 评论 -
oracle入门之 DDL数据定义语句(二)
四、约束:对数据库的字段加的限制(1)主键约束(primary key)特点:值唯一,且为非空,一个表智能有一个主键列级实现:在创建列时同时创建主键由系统提供主键名:create table s_emp(id number primary key,name varchar2(20));指定主键名:create table s_emp (id constraint s_emp_id_pk prima原创 2015-04-28 10:10:27 · 687 阅读 · 0 评论 -
oracle入门之 DDL数据定义语句(一)
还是假设有以下表雇员表s_emp id name(员工名字) mid(上级领导的id) deptid(部门的id) start_time(入职时间) 1 tom原创 2015-04-27 18:22:58 · 1037 阅读 · 0 评论