当前位置:文档之家› ORACLE PLSQL编程详解之3 PLSQL流程控制语句

ORACLE PLSQL编程详解之3 PLSQL流程控制语句

ORACLE PLSQL编程详解之3 PLSQL流程控制语句
ORACLE PLSQL编程详解之3 PLSQL流程控制语句

ORACLE PLSQL编程详解之三:PLSQL流程控制语句(不给规则,不成方圆)

3.1条件语句

3.2CASE表达式

3.3循环

3.4标号和GOTO

3.5NULL语句

介绍PL/SQL的流程控制语句, 包括如下三类:

● 控制语句: IF 语句

● 循环语句: LOOP语句, EXIT语句

● 顺序语句: GOTO语句, NULL语句

3.1 条件语句

IF<布尔表达式>THEN

PL/SQL 和 SQL语句

ENDIF;

-----------------------

IF<布尔表达式>THEN

PL/SQL 和 SQL语句

ELSE

其它语句

ENDIF;

-----------------------

IF<布尔表达式>THEN

PL/SQL 和 SQL语句

ELSIF <其它布尔表达式>THEN

其它语句

ELSIF <其它布尔表达式>THEN

其它语句

ELSE

ENDIF;

提示: ELSIF 不能写成ELSEIF

例1:

DECLARE

v_empnoemployees.employee_id%TYPE :=&empno;

V_salaryemployees.salary%TYPE;

V_comment VARCHAR2(35);

BEGIN

SELECT salary INTO v_salary FROM employees

WHERE employee_id=v_empno;

IF v_salary<1500THEN

V_comment:='太少了,加点吧~!';

ELSIF v_salary<3000THEN

V_comment:='多了点,少点吧~!';

ELSE

V_comment:='没有薪水~!';

ENDIF;

DBMS_OUTPUT.PUT_LINE(V_comment);

exception

when no_data_found then

DBMS_OUTPUT.PUT_LINE('没有数据~!');

when others then

DBMS_OUTPUT.PUT_LINE(sqlcode||'---'||sqlerrm);

END;

例2:

DECLARE

v_first_name VARCHAR2(20);

v_salary NUMBER(7,2);

BEGIN

SELECT first_name, salary INTO v_first_name, v_salary FROM employees WHERE employee_id=&emp_id;

DBMS_OUTPUT.PUT_LINE(v_first_name||'雇员的工资是'||v_salary);

IF v_salary<10000THEN

DBMS_OUTPUT.PUT_LINE('工资低于10000');

ELSE

IF10000<=v_salary AND v_salary<20000THEN

DBMS_OUTPUT.PUT_LINE('工资在10000到20000之间');

ELSE

DBMS_OUTPUT.PUT_LINE('工资高于20000');

ENDIF;

END;

例3:

DECLARE

v_first_name VARCHAR2(20);

v_hire_date DATE;

v_bonus NUMBER(6,2);

BEGIN

SELECT first_name, hire_date INTO v_first_name, v_hire_date FROM employees WHERE employee_id=&emp_id;

IF v_hire_date> TO_DATE('01-1月-90') THEN

v_bonus :=800;

ELSIF v_hire_date> TO_DATE('01-1月-88') THEN

v_bonus :=1600;

ELSE

v_bonus :=2400;

ENDIF;

DBMS_OUTPUT.PUT_LINE(v_first_name||'雇员的雇佣日期是'||v_hire_date

||'、奖金是'||v_bonus);

END;

3.2 CASE 表达式

---------格式一---------

CASE条件表达式

WHEN条件表达式结果1 THEN

语句段1

WHEN条件表达式结果2 THEN

语句段2

......

WHEN条件表达式结果n THEN

语句段n

[ELSE 条件表达式结果]

END;

---------格式二---------

CASE

WHEN条件表达式1 THEN

语句段1

WHEN条件表达式2 THEN

语句段2

......

WHEN条件表达式n THEN

语句段n

[ELSE 语句段]

END;

例4:

DECLARE

V_grade char(1) :=UPPER('&p_grade');

V_appraisal VARCHAR2(20);

BEGIN

V_appraisal :=

CASE v_grade

WHEN'A'THEN'Excellent'

WHEN'B'THEN'Very Good'

WHEN'C'THEN'Good'

ELSE'No such grade'

END;

DBMS_OUTPUT.PUT_LINE('Grade:'||v_grade||' Appraisal: '||v_appraisal); END;

例5:

DECLARE

v_first_nameemployees.first_name%TYPE;

v_job_idemployees.job_id%TYPE;

v_salaryemployees.salary%TYPE;

v_sal_raise NUMBER(3,2);

BEGIN

SELECT first_name, job_id, salary INTO

v_first_name, v_job_id, v_salary

FROM employees WHERE employee_id=&emp_id;

CASE

WHEN v_job_id='PU_CLERK'THEN

IF v_salary<3000THEN v_sal_raise := .08;

ELSE v_sal_raise := .07;

ENDIF;

WHEN v_job_id='SH_CLERK'THEN

IF v_salary<4000THEN v_sal_raise := .06;

ELSE v_sal_raise := .05;

ENDIF;

WHEN v_job_id='ST_CLERK'THEN

IF v_salary<3500THEN v_sal_raise := .04;

ELSE v_sal_raise := .03;

ENDIF;

ELSE

DBMS_OUTPUT.PUT_LINE('该岗位不涨工资: '||v_job_id);

END CASE;

DBMS_OUTPUT.PUT_LINE(v_first_name||'的岗位是'||v_job_id

||'、的工资是'||v_salary

||'、工资涨幅是'||v_sal_raise);

END;

3.3 循环

1. 简单循环

LOOP

要执行的语句;

EXITWHEN<条件语句>--条件满足,退出循环语句

END LOOP;

例6.

DECLARE

intNUMBER(2) :=0;

BEGIN

LOOP

int :=int+1;

DBMS_OUTPUT.PUT_LINE('int的当前值为:'||int);

EXITWHENint=10;

END LOOP;

END;

2. WHILE 循环

WHILE<布尔表达式> LOOP

要执行的语句;

END LOOP;

例7.

DECLARE

x NUMBER :=1;

BEGIN

WHILE x<=10 LOOP

DBMS_OUTPUT.PUT_LINE('X的当前值为:'||x);

x:= x+1;

END LOOP;

END;

3. 数字式循环

[<<循环标签>>]

FOR循环计数器IN[ REVERSE ]下限 .. 上限 LOOP

要执行的语句;

END LOOP [循环标签];

每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN

REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环。

例8.

BEGIN

FORint in1..10 LOOP

DBMS_OUTPUT.PUT_LINE('int的当前值为: '||int);

END LOOP;

END;

例9.

CREATETABLE temp_table(num_col NUMBER);

DECLARE

V_counter NUMBER :=10;

BEGIN

INSERTINTO temp_table(num_col) VALUES (v_counter );

FOR v_counter IN20 .. 25 LOOP

INSERTINTO temp_table (num_col ) VALUES ( v_counter );

END LOOP;

INSERTINTO temp_table(num_col) VALUES (v_counter );

FOR v_counter IN REVERSE20 .. 25 LOOP

INSERTINTO temp_table (num_col )VALUES ( v_counter );

END LOOP;

END ;

DROPTABLE temp_table;

例10:

DECLARE

TYPE jobids_varray IS VARRAY(12) OFVARCHAR2(10); --定义一个VARRAY数据类型

v_jobids JOBIDS_VARRAY; --声明一个具有JOBIDS_VARRAY数据类型的变量

v_howmany NUMBER; --声明一个变量来保存雇员的数量

BEGIN

--用某些job_id值初始化数组

v_jobids :=jobids_varray('FI_ACCOUNT', 'FI_MGR', 'ST_CLERK', 'ST_MAN');

--用FOR...LOOP...END LOOP循环使用每个数组成员的值

FOR i IN v_jobids.FIRST..v_https://www.doczj.com/doc/693468899.html,ST LOOP

--针对数组中的每个岗位,决定该岗位的雇员的数量

SELECT count(*) INTO v_howmany FROM employees WHERE job_id=v_jobids(i); DBMS_OUTPUT.PUT_LINE ( '岗位'||v_jobids(i)||

'总共有'|| TO_CHAR(v_howmany) ||'个雇员');

END LOOP;

END;

例11 在While循环中嵌套loop循环

/*求100至110之间的素数*/

DECLARE

v_m NUMBER :=101;

v_i NUMBER;

v_n NUMBER :=0;

BEGIN

WHILE v_m<110 LOOP

v_i :=2;

LOOP

IF mod(v_m, v_i) =0THEN

v_i :=0;

EXIT;

ENDIF;

v_i :=v_i+1;

EXITWHEN v_i>v_m-1;

END LOOP;

IF v_i>0THEN

v_n :=v_n+1;

DBMS_OUTPUT.PUT_LINE('第'||v_n||'个素数是'||v_m);

ENDIF;

v_m :=v_m+2;

END LOOP;

END;

3.4标号和GOTO

PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:GOTO label;

......

<

注意,在以下地方使用是不合法的,编译时会出错误。

◆ 跳转到非执行语句前面。

◆ 跳转到子块中。

◆ 跳转到循环语句中。

◆ 跳转到条件语句中。

◆ 从异常处理部分跳转到执行。

◆ 从条件语句的一部分跳转到另一部分。

例12:

DECLARE

V_counter NUMBER :=1;

LOOP

DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);

V_counter :=v_counter+1;

IF v_counter>10THEN

GOTO labelOffLOOP;

ENDIF;

END LOOP;

<>

DBMS_OUTPUT.PUT_LINE('V_counter的当前值为:'||V_counter);

END;

例13:

DECLARE

v_i NUMBER :=0;

v_s NUMBER :=0;

BEGIN

<>

v_i :=v_i+1;

IF v_i<=1000THEN

v_s :=v_s+v_i;

GOTO label_1;

ENDIF;

DBMS_OUTPUT.PUT_LINE(v_s);

END;

3.5 NULL 语句

在PL/SQL 程序中,NULL语句是一个可执行语句,可以用null 语句来说明“不用做任何事情”的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:

例14:

DECLARE

...

BEGIN

...

IF v_num ISNULLTHEN

GOTO labelPrint;

ENDIF;

<>

NULL; --不需要处理任何数据。

END;

例15:

v_emp_idemployees.employee_id%TYPE;

v_first_nameemployees.first_name%TYPE;

v_salaryemployees.salary%TYPE;

v_sal_raise NUMBER(3,2);

BEGIN

v_emp_id :=&emp_id;

SELECT first_name, salary INTO v_first_name, v_salary FROM employees WHERE employee_id=v_emp_id;

IF v_salary<=3000THEN

v_sal_raise := .10;

DBMS_OUTPUT.PUT_LINE(v_first_name||'的工资是'||v_salary ||'、工资涨幅是'||v_sal_raise);

ELSE

NULL;

ENDIF;

END;

ORACLE常用SQL语句大全

ORACLE常用SQL语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not nul l],..) 根据已有的表创建新表: A:select * into table_new from table_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only<仅适用于Oracle> 5、说明:删除表 drop table tablename

6、说明:增加一个列,删除一个列 A:alter table tabname add column col type B:alter table tabname drop column colname 注:DB2DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、添加主键: Alter table tabname add primary key(col) 删除主键: Alter table tabname drop primary key(col) 8、创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、创建视图:create view viewname as select statement 删除视图:drop view viewname 10、几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1 11、几个高级查询运算词 A:UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B:EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 C:INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 12、使用外连接

oracle中常用函数大全

oracle中常用函数大全 1、数值型常用函数 函数返回值样例显示 ceil(n) 大于或等于数值n的最小整数select ceil(10.6) from dual; 11 floor(n) 小于等于数值n的最大整数select ceil(10.6) from dual; 10 mod(m,n) m除以n的余数,若n=0,则返回m select mod(7,5) from dual; 2 power(m,n) m的n次方select power(3,2) from dual; 9 round(n,m) 将n四舍五入,保留小数点后m位select round(1234.5678,2) from dual; 1234.57 sign(n) 若n=0,则返回0,否则,n>0,则返回1,n<0,则返回-1 select sign(12) from dual; 1 sqrt(n) n的平方根select sqrt(25) from dual ; 5 2、常用字符函数 initcap(char) 把每个字符串的第一个字符换成大写select initicap('mr.ecop') from dual; Mr.Ecop lower(char) 整个字符串换成小写select lower('MR.ecop') from dual; mr.ecop replace(char,str1,str2) 字符串中所有str1换成str2 select replace('Scott','s','Boy') from dual; Boycott substr(char,m,n) 取出从m字符开始的n个字符的子串select substr('ABCDEF',2,2) from dual; CD length(char) 求字符串的长度select length('ACD') from dual; 3 || 并置运算符select 'ABCD'||'EFGH' from dual; ABCDEFGH 3、日期型函数 sysdate当前日期和时间select sysdate from dual;

Oracle基本语法

Oracle的历史 ?Oracle 公司( 甲骨文) 创始人: Larry Ellison 32岁,公司提供数据库服务. ?公司成立于1977 年, 83 年公司更名为Oracle ,原名为”软件开发实验室”. ?Oracle 数据库适用于大型企业 ?竞争对手 –微软的SQLServer –IBM 的DB2 ?目前的版本 – 2.0~7.0 , 8.0 , 8i , 9i , 10g Oracle的服务: 我的电脑右键选择管理--服务和应用程序—服务 -----是数据库或例程的系统标识符 ------是Oracle主目录名称 这几个服务之间的关系: 启动顺序:1、OracleTNSListener必须启动 2、OracleServer必须启动 3、OracleDBConsole启动依赖于OracleServer SqlPlus SqlPlus是Oracle任何版本都自带的数据库操作工具,使用它可以完成大部分的数据库操作。 SqlPlus可以“开始→程序→Oracle”启动,也可以命令行启动(互动) 1.命令行启动sqlPlus sqlplus 用户名/密码@orcl

或 sqlplus 用户名@orcl 如果用户是管理员要在sqlplus 用户名/密码@主机字符串as sysdba “/”是用户名和密码分隔符号 “@”是密码和数据库的分隔符号 “orcl”是数据库的名称,在安装时指定 常用命令(互动) connect 切换用户 show user 显示当前用户 set linesize 1000 设置行显示长度 set pagesize 1000 设置分页长度 desc dept 查看表结构 select table_name from user_tables 查询当前用户的表 / 运行上一条SQL语句 clear screen 清除屏幕 edit 编辑 spool d:/a 保存输出结果到某个位置 spool off 保存结束 quit 退出 list 查看最后一条语句 @ 文件名.sql 运行外部文件中的SQL语句

Oracle-基本建表语句

--创建用户 create user han identified by han default tablespace users Temporary TABLESPACE Temp; grant connect,resource,dba to han; //授予用户han开发人员的权利 --------------------对表的操作-------------------------- 创建表格语法: create table 表名( 字段名1 字段类型(长度) 是否为空, 字段名2 字段类型是否为空 ); -增加主键 alter table 表名 add constraint 主键名 primary key (字段名1); -增加外键: alter table 表名 add constraint 外键名 foreign key (字段名1) references 关联表 (字段名2); 在建立表格时就指定主键和外键 create table T_STU ( STU_ID char(5) not null, STU_NAME varchar2(8) not null, constraint PK_T_STU primary key (STU_ID) ); 主键和外键一起建立: create table T_SCORE ( EXAM_SCORE number(5,2),

EXAM_DATE date, AUTOID number(10) not null, STU_ID char(5), SUB_ID char(3), constraint PK_T_SCORE primary key (AUTOID), constraint FK_T_SCORE_REFE foreign key (STU_ID) references T_STU (STU_ID) ) --创建表 create table classes( id number(9) not null primary key, classname varchar2(40) not null ) --查询表 select * from classes; --删除表 drop table students; --修改表的名称 rename alist_table_copy to alist_table; --显示表结构 describe test --不对没查到 -----------------------对字段的操作 ----------------------------------- --增加列 alter table test add address varchar2(40); --删除列 alter table test drop column address; --修改列的名称 alter table test modify address addresses varchar(40; --修改列的属性 alter table test modi

oracle 经典SQL语句大全

一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1. dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键:Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1

Oracle查询语句基本命令一

oracle查询语句大全--基本命令大全一 1.create user username identified by password;//建用户名和密码oracle ,oracle 2.grant connect,resource,dba to username;//授权grant connect,resource,dba,sysdba to username; 3.connect username/password//进入。 4.select table_name,column_name from user_tab_columns where table_name='mview_log';//查询表中的表名,字段名等等。 5. 如何执行脚本SQL文件? SQL>@PATH/filename.sql; 6.Oracle oledb 提供者在command中执行多条SQL语句与SQL SERVER有少许差别,SQL Server只需使用";"分割多条SQL语句,而Oracle需要遵守ORACLE调用规范,即除分号分割外,还需以begin /end;包围语句体. 使用C#描述应如下所示: https://www.doczj.com/doc/693468899.html,mandText = "begin INSERT INTO GROUP_INFO (GROUP_ID, GROUP_NAME) V ALUES (1, \'2\'); INSERT INTO GROUP_INFO(GROUP_ID, GROUP_NAME) V ALUES (2, \'2\'); end;"; 7.查询用户下的表的信息select distinct table_name from user_tab_columns; 8.如何搜索出前N条记录?Select a.*,rownum from (select * from cardkind order by cardkind ) a where rownum show user 3、查看系统拥有哪些用户SQL> select * from all_users; 4、新建用户并授权 SQL> create user a identified by a;(默认建在SYSTEM表空间下) SQL> grant connect,resource to a; 5、连接到新用户SQL> conn a/a

ORACLE 11g SELECT 语句基础语法

一、SELECT语句基础语法 SELECT [ALL |DISTINCT TOP N [PERCENT] WITH TIES SELECT_LIST #SELECT 子句,用于指定由查询返回的列。 [INTO [new_table_name]] #INTO子句,将检索结果存储到新表或视图中。 FROM {table_name|view_name} [(optimizer_hints)],... #FROM子句,用于指定引用的表或视图,需指定多个表或视图,用“,”分开即可。[WHERE search_condition] #WHERE子句,用于指定限制返回的行的搜索条件,若无此子句,则默认表中的所有行都满足条件。 [GROUP BY group_by_expression] #GROUP BY子句,指定用来放置输出行的组,并且如果SELECT子句中