热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PLSQL中的各种SQL语句实例讲解

plsql中的sql语句##selectinto语句:用于把从中查询出的内容存入变量declarev_hire_dateemployees.hire_date%type;v_sal
plsql中的sql语句

## select into 语句:用于把从中查询出的内容存入变量


declare
v_hire_date employees.hire_date%type;
v_salary empployees.salary%type;
begin
select hire_date,salary
into v_hire_date,v_salary
from employees
where department_id = 100;
...
end;


set serveroutput on
declare
v_sum_sal number(10,2);
v_deptno number not null := 60;
begin
select sum(salary) --group function
into v_sum_sal
from employees
where department_id = v_deptno;
dbms_output.put_line('the sum salary is ' || to_char(v_sum_sal));
end;

注意:该语句支持单行的查询结果,如果where条件控制的不好,导致多行查询结果,则会引发to manay rows的例外

## insert,update,delete,merge语句:在plsql中执行这些语句和直接执行这些语句差不多,只不过可以在sql语句中使用plsqls声明变量。


begin
insert into employees
(employee_id, first_name, last_name, email, hire_date, job_id, salary)
values
((employees_seq.nextval, 'ruth', 'cores', 'rcores',sysdate, 'ad_asst', 4000)
end;


declare
v_sal_increase employees.salary%type;
begin
update employees
set salary = salary + v_sal_increase;
where job_id = 'st_clerk';
end;


declare
v_deptno employees.department_id%type := 10;
begin
delete from employees
where department_id = v_ deptno;
end;


declare
v_empno employees.employee_id%type := 100;
begin
merge into copy_emp c
using employees e
on (e.employee_id = v_empno)
when matched then
update set c.first_name = e.first_name,
c.last_name = e.last_name,
c.email = e.email,
...
when not matched then
insert values(e.employee_id, e.first_name, e.last_name,..., e.department_id);
end;

plsql中的控制语句

和其他语言一样,控制主要包括判断和循环;


判断语句的语法与其他语言类似:


if condition then
statements;
[elsif condition then
statements;]
[else
statements;]
end if;


case selector
when expression1 then result1;
when expression2 then result2;
...
when expressionn then resultn;
[else resultn + 1]
end;

### 循环语句的语法与其他语言类似:有基本循环、for循环、wihle循环三种 :


loop
statement1;
...
exit [when condition];
end loop


while condition loop
statement1;
statement1;
...
end loop


for counter in [reverse] lower_bound .. upper_bound loop
statement1;
statement2;
...
end loop;

举例:


declare
v_country_id locations.country_id%type := 'ca'; v_location_id locations.location_id%type;
v_city locations.city%type := 'montreal';
begin
select max(location_id) into v_location_id
from locations
where country_id = v_country_id;
for i in 1 .. 3 loop
insert into locations(location_id, city, country_id) values((v_location_id + i), v_city, v_country_id );
end loop;
end;

嵌套循环和label:


...
begin
<>
loop
v_counter := v_counter+1;
exit when v_counter > 10;
<>
loop
...
exit outer_loop when total_dOne= &#039;yes&#039;;
-- leave both loops
exit when inner_dOne= &#039;yes&#039;;
-- leave inner loop only
...
end loop inner_loop;
...
end loop outer_loop;
end;
...

## plsql中的复杂自定义数据类型

概述:

plsql中常用的自定义类型就两种: 记录类型、plsql内存表类型(根据表中的数据字段的简单和复杂 程度又可分别实现类似于简单数组和记录数组的功能)

记录类型的定义举例:


type emp_record_type is record
(last_name varchar2(25),
job_id varchar2(10),
salary number(8,2));
emp_record emp_record_type;


%rowtype属性:在plsql中 %rowtype 表示某张表的记录类型或者是用户指定以的记录类型,使用此属性可以很方便的定义一个变量,其类型与某张表的记录或者自定义的记录类型保持一致。极大的方便了select * into ….的语句使用。


declare
emp_rec employees%rowtype
begin
select * into emp_rec
from employees
where employee_id = &employee_number;
insert into retired_emps(empno, ename, job, mgr, hiredate, leavedate, sal, comm, deptno) ;
values (emp_rec.employee_id, emp_rec.last_name, emp_rec.job_id, emp_rec.manager_id, emp_rec.hire_date, sysdate, emp_rec.salary, emp_rec.commission_pct, emp_rec.department_id);
commit;
end;

plsql内存表即index by table ,这种结构类似于数组,使用主键提供类似于数组那样的元素访问。这种类必须包含两个部分:

使用binary integerl类型构成的索引主键; 另外一个简单类型 或者用户自定义类型的字段作为具体的数组元素。 这种类型可以自动增长,所以也类似于可变长数组。


...
type ename_table_type is table of employees.last_name%type
index by binary_integer;
ename_table ename_table_type;
...

plsql内存表应用举例:

下面定义的两个内存表中的元素都是简单的数据类型,所以相当于定义了两个简单数组:


declare
type ename_table_type is table of employees.last_name%type
index by binary_integer;
type hiredate_table type is table of date
index by binary_integer;
ename_table ename_table_type;
hiredate_table hiredate_table_type;
begin
ename_table(1) := &#039;cameron&#039;;
hiredate_table := sysdate + 7;
if ename_table.exists(1) then
insert into ...
...
end;

备注:对plsql内存表中某个元素的访问类似于数组,可以使用下表,因为binary_integer这种数据类型 的值在-2147483647 … 2147483647范围内,所以下表也可以在这个范围内。


plsql内存表的应用举例:

下面定义的两个内存表中的元素都是记录类型,所以相当于定义了真正的内存表:


declare
type emp_table_type is table of employees%rowtype
index by binary_integer;
my_emp_table emp_table_type;
v_count number(3) := 104;
begin
for i in 100 .. v_count
loop
select *
into my_emp_table(i)
from employees
where employee_id = i;
end loop;
for i in my_emp_table.first .. my_emp_table.last
loop
dbms_output.put_line(my_emp_table(i).last_name);
end loop;
end;

推荐阅读
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
author-avatar
湘刘涛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有