`
lihong11
  • 浏览: 450458 次
  • 性别: Icon_minigender_2
  • 来自: 湖南
社区版块
存档分类
最新评论

PL/SQL基础、变量及游标

阅读更多
一、PL/SQL基础及变量
1、PL/SQL是一种语言,相当于把sql语句与java语言的结合运用。
2、注意写SQL语句时,它的前面最好不要有注释的语句。
3、PL/SQL由声明、执行体、异常处理三部分组成。如:
	SQL>DECLARE	/*声明*/
	 v_job varchar2(20);
	BEGIN	/*执行体*/
	 SELECT job INTO v_job
	 FROM emp
	 WHERE ename='SCOTT';
	 dbms_output.put_line('SCOTT'||' job is '||v_job);	/*输出语句,PL/SQL中是用||作为连接符*/
	EXCEPTION	/*异常处理*/
	 WHEN NO_DATA_FOUND THEN	/*数据不存在时的异常*/
	 dbms_output.put_line('没有这个员工!');
	 WHEN TOO_MANY_ROWS THEN	/*数据过多时的异常*/
	 dbms_output.put_line('有多个员工叫SCOTT!');
	END;
4、输出操作结果语句为:"dbms_output.put_line('a'||'b')"等同于System.out.println("a"+"b"),只是在使用此语句之前要先执行"set serveroutput on"。
5、PL/SQL语句和SQL语句是分别进行解析和执行的,PL/SQL块被数据库内部的PL/SQL引擎提取,将SQL语句取出送给oracle的SQl引擎处理。
6、PL/SQL语法:语句可以写在多行;语句中的关键字、字段名称等,用空格分隔;每条语句必须以分号结束,END关键字后面出需要分号;在PL/SQL程序中出现的字符值和日期值
必须用单引号括起来。
7、标识符需要遵循相应的命名规定:第一个字符必须以字母开始;若使用保留字需用双引号括起来;名称最多包含30个字符;不要与数据库的表或者列名称相同。
8、注释有两种方式:/*...*/和--作为前缀。
9、varchar2(最大长度值)用来定义变长字符串,必须要指定最大长度值;char用来定义定长字符串,不指定长度时默认为1;number(总位数,小数点位数)可以表示整数和浮点数;
date类型长度固定为7个字节;timestamp类型用于定义日期和时间的,只是会显示上下午的数据;long用来定义变长字符串,long raw用来可变长的二进制数据,这两种类型不常
用,可用clob/blob替代;binary_float和binary_double这两种类型需要加后缀,用来定义浮点数;以下类型只能在PL/SQL中用,不能定义表中列的数据类型:boolean布尔类型有有效值为true/false/null,此类型的值不能输出;binary_integer用来定义整数;
10、PL/SQL中是通过:=来表示赋值,变量以v开始,常量以c开始,每行只能声明一个标识符。
11、用%TYPE定义简单变量更灵活,如:
v_name emp.ename%TYPE;
v_balance NUMBER(7,2);
v_min_balance v_balance%TYPE:=10;
其中变量v_name的数据类型与emp表的ename列相同并保持同步,emp.ename的类型改变则v_name的也会变。
12、复合数据类型有PL/SQL TABLES(表类型)、PL/SQL RECORDS(记录类型)。复合类型被创建后,可以被多次使用以便定义多个复合变量。
13、表类型:定义一组相同类型的数据,类似数组,但没有长度限制,可以动态增长(INDEX BY 简单类型)。语法:TYPE 类型名 IS TABLE OF 数据的类型 INDEX BY BINARY_INTEGER; 变量名 类型名;
14、复合变量在声明类型之前首先要先创建使用到的复合类型,再将变量声明为复合类型。
15、记录类型:由多个组件组成的类型,每个组件称为一个域,数据类型可以是简单变量、另一个记录类型或表类型。每个域可以是不同的数据类型,存放不同类型的数据。
16、记录类型变量通过“记录变量.域名”的方式来赋值或者引用。常用于存储从表中取出查询到的行数据。
17、通过%ROWTYPE声明记录类型变量,作用与%TYPE类似,主要用于定义不确定的变量类型,前缀通常是数据库的表名,语法:表名%ROWTYPE而%TYPE是字段名%TYPE。
二、PL/SQL基本语法
1、在PL/SQL中等号是比较运算符,转换函数有三种:TO_CHAR、TO_DATE、TO_NUMBER。
2、替代变量:"&变量名",如"select job into v_job from emp where empno=&no;" 输入no的值:1122,其中&no表示把输入的1122值赋给变量no。
3、绑定变量:":变量名",如"select avg(sal) into v_sal from emp; :avg_sal:=v_sal;" 其中:avg_sal表示把v_sal的值赋给avg_sal,即让avg_sal与v_sal变量绑定。
4、PL/SQL中的select语句,如:"select 指定选择的列 into 接收的变量",查询列表后必须使用into子句,用于将查询出的字段值传递给变量。
5、当PL/SQL中的select语句的查询结果返回多行或者一行都没有返回时,会产生TOO_MANY_ROWS和NO_DATA_FOUND异常。
6、DQL: SELECT;DML: DELETE, INSERT, UPDATE;DDL: CREATE, DROP, TRUNCATE, ALTER;TCL: COMMIT, ROLLBACK, SAVEPOINT;DCL: GRANT, REVOKE。
7、通过EXECUTE IMMEDIATE可以在PL/SQL中直接执行DDL和DCL语句,只是EXECUTE IMMEDIATE后面的语句要用单引号引起来,如:
	SQL>DECLARE	
	 v_count number;
	BEGIN	
	--查询数据字典,看是否有TEMP这个表
	 SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name='TEMP';
	 --如果有TEMP表,执行DDL操作删除这个表
	 IF v_count=1 THEN EXECUTE IMMEDIATE 'DROP TABLE temp';
	END IF; 
	END;
8、条件判断语句:if……then……;elsif……then……; else……; end if;二重分支:if……then……else……;end if;多重分支:if……then……elsif……;CASE语句:case……when……then……;when……then……;else……;end case;
9、多个条件可以用连接操作符与、或、非三种(AND/OR/NOT)。对于空值的判断用IS NULL或者IS NOT NULL。
10、循环语句:"LOOP 循环体 EXIT[WHEN 条件]"相当于"do……while()"。for循环: FOR index in [REVERSE] lower_bound……upper_bound LOOP……;end LOOP;其中REVERSE表示递减,不写REVERSE表示默认递增
lower_bound……upper_bound表示从最小值到最大值循环。
11、外部循环<<outer>>,内部循环<<inner>>,相当于用两层for循环时,通过{}来区别外循环与内循环的情况。
12、PL/SQL程序块作用域:相当于全局变量与局部变量的用法,如:
	SQL>set serveroutput on
	SQL>DECLARE	
	 v_weight number(3):=100;
	 v_msg varchar2(255):='outer value';
	BEGIN	
		DECLARE
			v_msg varchar2(255):='inner value';
			BEGIN
				DBMS_OUTPUT.PUT_LINE(v_weight||':'||v_msg);
			END;
		DBMS_OUTPUT.PUT_LINE(v_weight||':'||v_msg);
	END;
	输出结果为100:inner value
			  100:outer value
	只能引用当前BEGING外面的变量。
三、游标
 1、游标是指向一段私有的内存区域,用于暂时保存SQL语句影响到的数据的指针。 
 2、游标分隐式游标和显式游标,游标属性包括四种:%ROWCOUNT、%FOUND、%NOTFOUND、%ISOPEN。
 3、隐式游标以SQL为前缀,SQL%ROWCOUNT(受SQL影响的行数)、SQL%FOUND(Boolean值,是否还有数据)、SQL%NOTFOUND(Boolean值,是否已无数据)、SQL%ISOPEN(总是为FALSE)。
 4、显式游标%ISOPEN(Boolean类型,如果游标打开,则为TRUE)、%NOTFOUND(Boolean类型,如果最近的提取没有返回记录,则为TRUE)、%FOUND(Boolean类型,只要有记录能提取到就一直为TRUE,直到提取不到)、
 %ROWCOUNT(Number类型,到当前时间为止,提取的总行数)。
 5、声明游标:CURSOR 游标名 IS select语句;打开游标:OPEN 游标名;取游标中的数据:FETCH 游标名 INTO 变量;其中注意游标只有在打开时,才可以执行取(FETCH)操作,
用%ISOPEN来测试游标是否打开。 另外,INTO后面的变量要与游标中的字段个数相同,并且顺序要一一对应。
 6、通过游标属性来判断取操作是否完成,%NOTFOUND操作判断上一次的取操作是否成功取到数据,返回TRUE表示游标已为取空。通过%FOUND来控制循环取操作。
 7、游标一旦被关闭,游标的内存空间就被释放,不可以再提取数据了。
 8、用记录接收游标中的数据,如:
	SQL>DECLARE	
	--定义游标后可以不用再创建记录类型,便可直接引用游标作为记录类型
	  CURSOR  emp_cursor IS
			 SELECT ename,sal FROM emp WHERE deptno=10;
	  emp_record emp_cursor%ROWTYPE; /*声明记录类型变量时不是创建记录类型变量,而是通过游标名%ROWTYPE的方式声明,这能让记录类型变量与游标结构保持一致*/
	BEGIN	
		OPEN emp_cursor;
		Loop
			FETCH emp_cursor INTO emp_record;	/*将游标中的字段的值fetch到变量中*/
			EXIT WHEN emp_cursor%NOTFOUND;	/*当游标中没有数据时跳出循环*/
			--注意游标变量中域的获取方式为记录名.域名
			DBMS_OUTPUT.PUT_LINE(emp_record.ename||'的薪水是'||emp_record.sal);
			END LOOP;
		DBMS_OUTPUT.PUT_LINE('共取出了'||emp_cursor%ROWCOUNT||'条记录');
		CLOSE emp_cursor;
	END;
 9、带参数的游标:如果需要执行多个查询语句,而多个查询的区别在于WHERE条件中的值不同,这时就可以通过传递参数来实现。如把上个例子稍做改变:
	SQL>DECLARE	
	--定义带参数的游标
	  CURSOR  emp_cursor(v_deptno NUMBER) IS
			 SELECT ename,sal FROM emp WHERE deptno=v_deptno;	--参数变量
	  emp_record emp_cursor%ROWTYPE;
	BEGIN	
		OPEN emp_cursor(10);	/*打开游标,在此处给定参数值*/
 10、定义游标变量:"TYPE 游标类型名 IS REF CURSOR RETURN 变量名%ROWTYPE",如:
	SQL>DECLARE	
	  TYPE dept_cursor_type IS REF CURSOR RETURN dept%ROWTYPE;		/*定义游标变量类型*/
		dept_cursor dept_cursor_type;		/*定义游标变量*/
		dept_record dept%ROWTYPE;		/*定义记录变量*/
 11、UPPER('&input'):表示取输入的字符串的首字母大写。
 12、游标的标准过程需经过声明游标、打开、循环取操作、关闭游标几个步骤。但是用游标中的for循环就可以不需OPEN、FETCH、CLOSE操作。
 13、游标中的for循环:"for 下标变量 in 游标名 Loop",如:
	--遍历部门号为20的所有员工的薪水
	SQL>DECLARE	
	  CURSOR  emp_cursor(v_deptno NUMBER) IS
			 SELECT ename,sal FROM emp WHERE deptno=v_deptno;
	BEGIN	
		FOR  emp_record IN emp_cursor(20) LOOP
		DBMS_OUTPUT.PUT_LINE(emp_record.ename||'的薪水是'||emp_record.sal);
		END LOOP;
	END;
 14、为了修改或者删除当前的游标记录,必须在打开游标时锁定游标取出的数据,锁定表示只有游标可以修改这些数据,其他的数据库连接都不可以修改。
 15、锁定游标用for update,如"CURSOR 游标名 IS SELECT语句 FOR UPDATE [OF 特定的表]"。
 16、更新游标中的行:"UPDATE 表名 SET 字段名=.. WHERE CURRENT OF 游标名";删除游标中的行:"DELETE FROM 表名 WHERE CURRENT OF 游标名"。
 

  

0
1
分享到:
评论

相关推荐

    PL/SQL 程序设计

    PL/SQL 程序设计 本章主要重点:  PL/SQL概述  PL/SQL块结构  PL/SQL流程  运算符和表达式  游标  异常处理  数据库存储过程和函数  包  触发器

    Oracle_PLSQL语言基础

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL...

    PL/SQL 基础.doc

    PL/SQL 基础,一个不错的 PL/SQL 参考手册。内容预览: ---- 第一章 PL/SQL 简介 ---- 1. Oracle应用编辑方法概览 1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和...

    oracle存储过程、游标、函数、PL/SQL块

    包含oracle存储过程的增、删、查、改 %type、%rowtype的使用 自定义函数 PL/SQL块

    PL/SQL Developer8.04官网程序_keygen_汉化

    PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,...执行完后,PL/SQL变量curStudentNo,curStudentName中已经有了值。

    Oracle PL/SQL语言初级教程

    1.PL/SQL语言基础 3 过程 5 包(package) 6 变量和常量 6 执行部分 10 控制结构 12 小结 17 2.PL/SQL的复合数据类型 17 使用记录 19 PL/SQL集合 23 嵌套表 24 使用集合 25 集合的方法 28 关于集合之间的比较 29 3.PL...

    PLSQL基础word

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL...

    全面对比T-SQL与PL/SQL

    全面对比T-SQL与PL/SQL 查询的函数,语句的写法,变量声明、赋值与引用,游标,触发器,过程等。值得一看。

    pl/sql入门教程

    plsql入门 游标变量 Oracle EXTRACT()函数 用Java调用存储过程 ORACLE用户常用数据字典的查询使用方法

    PL_SQL模块学习之十、游标

    文章目录游标1.1 显式游标1.1.1 创建游标1.1.2 打开游标1.1.3 获取数据1.1.4 关闭游标1.1.5 使用实例1.2 隐式游标1.2.2 游标属性1.3 FOR游标1.4 游标变量1.4 游标表达式1.5 动态游标 游标 游标是一个指针,指向一块...

    Oracle 入门文档

    Oracle笔记 六、PL/SQL简单语句块、变量定义 Oracle笔记 七、PL/SQL 异常处理 Oracle笔记 八、PL/SQL跳转/判断/循环语句块 Oracle笔记 九、PL/SQL 游标的使用 Oracle笔记 十、PL/SQL存储过程 Oracle笔记 十一、...

    Oracle 入门文档2

    Oracle笔记 六、PL/SQL简单语句块、变量定义 Oracle笔记 七、PL/SQL 异常处理 Oracle笔记 八、PL/SQL跳转/判断/循环语句块 Oracle笔记 九、PL/SQL 游标的使用 Oracle笔记 十、PL/SQL存储过程 Oracle笔记 十一、...

    pl-sql.rar

    PL/SQL基本概念 PL/SQL的变量 PL/SQL的基本语法 Oracle各种程序单元 使用游标取出多条数据 异常处理 等相关内容介绍,适合初学者此文件为ppt格式

    精通Oracle.10g.PLSQL编程

    PUSQL基础 3.1 PL/SQL块简介 3.1.1 PL/SQL块结构 3.1.2 PL/SQL块分类 3.2 定义并使用变量 3.2.1 标量变量 3.2.2 复合变量 3.2.3 参照变量 3.2.4 LOB变量 3.2.5 非PL...

    PLSQLDeveloper下载

     PL/SQL使用的数据库操作语言还是基于SQL的,所以熟悉SQL是进行PL/SQL编程的基础。SQL语言的分类情况大致如下: 1) 数据定义语言(DDL):Create,Drop,Grant,Revoke,… 2) 数据操纵语言(DML):Update,Insert,...

    Oracle 游标的使用

    在PL/SQL中可以使用游标处理数据。通过使用游标可以大大提高PL/SQL程序对数据处理的能力。在Oracle 9i及其以后的版本中,还增加了使用BULK COLLECT子句批量绑定数据和使用CURSOR表达式实现嵌套游标的功能。本章将...

    PLSQL基础教程

    §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 ...

    ORACLE 数据库开发_PLSQL基础.doc

    大量源码案例,手把手教你PLSQL数据库开发。...---- 第五章 PL/SQL游标 ---- ---- 第六章 HANDLE EXCEPTION ---- ---- 第七章 SUB PROGRAM ---- ---- 第八章 PACKAGE ---- ---- 第九章 TRIGGER ----

    PLSQL程序设计

    §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和...

    oracle学习资料

    §2.4 PL/SQL 变量类型 7 §2.4.1 变量类型 7 §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和...

Global site tag (gtag.js) - Google Analytics