`
lihong11
  • 浏览: 457010 次
  • 性别: 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最新中文手册

    1. **PL/SQL基础**:手册可能会从基础开始,介绍PL/SQL的基本结构,包括声明变量、常量、游标、记录类型等。还会讲解如何编写存储过程、函数和触发器。 2. **控制流程语句**:这包括条件判断(IF-THEN-ELSIF-ELSE)...

    oracle10g_pl/sql

    - **游标变量**:用于存储游标状态,可以在PL/SQL中传递和操作。 - **包**:将相关的过程、函数和变量打包在一起,便于管理和重用。 6. **PL/SQL性能优化** - **绑定变量**:减少解析次数,提高执行效率。 - **...

    一个对数据库的操作工具PL/SQLpl/sqL工具

    3. **游标**:PL/SQL支持游标,允许用户逐行处理查询结果,这对于处理大量数据时非常有用。 4. **事务管理**:PL/SQL提供BEGIN、COMMIT、ROLLBACK等语句来管理事务,确保数据的一致性和完整性。 5. **异常处理**:...

    oracle pl/sql从入门到精通 配套源代码

    PL/SQL支持变量、常量、条件语句(如IF-THEN-ELSIF-ELSE)、循环(如FOR、WHILE)、异常处理(如EXCEPTION)等基本编程元素。 在Oracle PL/SQL中,我们可以通过使用SQL语句来与数据库进行交互,例如SELECT用于查询...

    Oracle资料学习PL/SQL必备

    PL/SQL的基础部分是了解和使用Oracle数据库的关键,它包括以下几个主要方面: 1. **基本语法**:PL/SQL由声明部分、执行部分和异常处理部分组成。声明部分用于定义变量、游标、常量等;执行部分包含SQL语句和PL/SQL...

    PL/SQL编程基础知识

    **2.4 PL/SQL变量类型** PL/SQL支持多种变量类型,包括但不限于: - **NUMBER**:用于存储数字。 - **VARCHAR2**:用于存储变长字符串。 - **DATE**:用于存储日期和时间。 - **BLOB**:用于存储二进制大对象。 - ...

    Oracle PL/SQL实战(待续)

    PL/SQL中的游标是处理单行或多行结果集的重要工具。它们允许我们逐行处理查询结果,非常适合在循环中进行数据操作。声明游标的基本语法是`DECLARE cursor_name CURSOR FOR select_statement;`,然后通过`OPEN`, `...

    ORACLE PL/SQL从入门到精通

    PL/SQL变量的声明和使用是编程的基础,涉及到变量的声明、初始化、数据类型、%type属性等。变量的赋值和使用也是需要掌握的内容。 此外,书中还涉及到了ORACLE数据库的安装、存储过程的编写、序列操作、数据类型...

    PL/SQL基础

    **PL/SQL基础** PL/SQL,全称是Procedural Language/Structured Query Language,是Oracle数据库中的一个重要组成部分,它结合了SQL的查询能力与结构化编程语言的控制结构,用于开发在Oracle环境中运行的数据库应用...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    1. **PL/SQL基础**:PL/SQL的基础语法,如变量声明、数据类型、流程控制语句(如IF-THEN-ELSIF,FOR循环,WHILE循环)、异常处理(BEGIN-EXCEPTION-END结构)等。 2. **函数与过程**:如何定义和调用用户自定义的...

    PL/SQL基础编程,实例自写

    ### PL/SQL基础编程知识点详解 #### 一、PL/SQL概述 PL/SQL,全称为Procedural Language for SQL,是Oracle数据库特有的高级程序设计语言。它结合了SQL的数据处理能力和传统编程语言的控制结构,使开发者能够在...

    Oracle PL/SQL程序设计(第5版)(上下册)

    #### 一、PL/SQL编程基础 - **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL查询的基础上添加控制流语句、变量定义、错误处理等特性...

    pl/sql 学习资料

    - SELECT INTO语句:从查询结果中提取数据到PL/SQL变量。 -游标:使用游标处理多行结果集,进行逐行操作。 3. **异常处理**: - 异常类型:理解预定义的异常和用户自定义异常。 - WHEN OTHERS THEN:如何捕获未...

    PL/SQL 基本知识

    这篇博客主要探讨了PL/SQL的基础知识,包括其语法特性、使用场景以及在数据库管理中的重要性。 首先,PL/SQL是一种过程化语言,它允许用户定义变量、控制流程(如循环、条件语句)、处理异常,并且可以嵌入SQL查询...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    1. **基础语法**:PL/SQL是过程化SQL,它包含声明部分、执行部分和异常处理部分。声明部分用于定义变量、常量和游标;执行部分包含了SQL语句和流程控制结构,如循环、条件判断等;异常处理部分则用于捕获和处理运行...

    PL/SQL入门到精通书的源代码

    12. **游标变量**:游标变量是PL/SQL中的一种特殊变量,可以直接存储查询结果,用于在程序中传递查询结果。 13. **PL/SQL与Oracle数据库对象**:学习如何在PL/SQL中创建、修改和删除数据库对象,如表、视图、索引等...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    1. **PL/SQL基础**:涵盖PL/SQL的基本语法,包括变量声明、常量定义、条件语句(IF-THEN-ELSIF-ELSE)、循环结构(WHILE, FOR)、异常处理(BEGIN-EXCEPTION-END)以及子程序(PROCEDURE和FUNCTION)的创建与调用。...

    PL/SQL安装包

    6. **游标**:PL/SQL中的游标允许逐行处理查询结果,是处理复杂数据操作的重要工具。 7. **记录类型和变量**:PL/SQL支持自定义记录类型和变量,使得可以创建更贴近业务需求的数据结构。 这个"PL/SQL安装包"可能...

    PL/SQL下载

    1. **基础语法**:理解PL/SQL的基本数据类型、变量声明、流程控制结构等。 2. **函数和过程**:掌握如何定义和调用自定义函数和过程。 3. **游标**:了解如何使用游标处理结果集。 4. **异常处理**:学习如何编写...

    Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

    本章节主要介绍了 PL/SQL 程序设计的基础知识,包括 PL/SQL 的优点、运行 PL/SQL 程序、PL/SQL 块结构、PL/SQL 基本语法、PL/SQL 处理流程、异常处理、游标、存储过程和函数、触发器等。 PL/SQL 的优点包括: * ...

Global site tag (gtag.js) - Google Analytics