`

oracle 存储过程学习总结

 
阅读更多


dbms_output.put_line('CONCAT 方法 '||CONCAT('123','456'));
dbms_output.put_line('CHR 方法 '||CHR(ascii('string')));
dbms_output.put_line('INITCAP 方法 '||INITCAP('string'));
--把字符串 str 从左边开始截取 先从 s 开始直到 g string 是表示要截取的字符
dbms_output.put_line('LTRIM 方法 '||LTRIM('str','string'));
dbms_output.put_line('REPLACE 方法 '||REPLACE('string','str','t'));
--把字符串 string 从右边开始截取 先从 i 开始直到 g ing 是表示要截取的字符
dbms_output.put_line('RTRIM 方法 '||RTRIM('string','ing'));
--substr 方法不会从零开始 都是从 1 开始 后面的 3 表示个数 从第一个开始后的三个
dbms_output.put_line('SUBSTR 方法 '||SUBSTR('string',1,3));
dbms_output.put_line('INSTR 方法 '||INSTR('string','ing'));
dbms_output.put_line('LENGTH 方法 '||LENGTH('康复'));
dbms_output.put_line('LENGTHB 方法 '||LENGTHB('康复'));
dbms_output.put_line('ASCII 方法 '||ASCII('string'));



//绑定变量
SQL> variable i number;
SQL> exec :i :=1;
PL/SQL 过程已成功完成。
SQL> select *from tt where id=:i;
declare
namemeg varchar2(255) ;
begin
//不能用:namemeg 因为上面已经定义了。
namemeg :='lan' ;
for i in 1..1000
loop
execute immediate 'insert into t(name,score) values(:n,:s)' using in namemeg,i ;
end loop ;
dbms_output.put_line('****执行成功****');
end ;
--游标加参数
declare
cursor taskname(tn varchar2) is
select taskname from gps_task where taskname=tn;
taskname2 varchar2(200) ;
begin
open taskname('DDDD') ;
loop
FETCH taskname INTO taskname2;
EXIT WHEN taskname%NOTFOUND;
dbms_output.put_line(taskname2);
end loop;
END;
-- 声明游标; CURSOR cursor_name IS select_statement
--For 循环游标
--( 1)定义游标
--( 2)定义游标变量
--( 3)使用 for 循环来使用这个游标
declare
--类型定义
cursor c_job
is
select empno,ename,job,sal
from emp
where job='MANAGER';
--定义一个游标变量 v_cinfo c_emp%ROWTYPE ,该类型为游标 c_emp 中的一行数据类

c_row c_job%rowtype;
begin
for c_row in c_job loop
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
end;
--Fetch 游标
--使用的时候必须要明确的打开和关闭
declare
--类型定义
cursor c_job
is
select empno,ename,job,sal
from emp
where job='MANAGER';
--定义一个游标变量
c_row c_job%rowtype;
begin
open c_job;
loop
--提取一行数据到 c_row
fetch c_job into c_row;
--判读是否提取到值,没取到值就退出
--取到值 c_job%notfound 是 false
--取不到值 c_job%notfound 是 true
exit when c_job%notfound;
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end loop;
--关闭游标
close c_job;
end;
--1:任意执行一个 update 操作,用隐式游标 sql 的属性%
found,%notfound,%rowcount,%isopen 观察 update 语句的执行情况。
begin
update emp set ENAME='ALEARK' WHERE EMPNO=7469;
if sql%isopen then
dbms_output.put_line('Openging');
else
dbms_output.put_line('closing');
end if;
if sql%found then
dbms_output.put_line('游标指向了有效行');--判断游标是否指向有效行
else
dbms_output.put_line('Sorry');
end if;
if sql%notfound then
dbms_output.put_line('Also Sorry');
else
dbms_output.put_line('Haha');
end if;
dbms_output.put_line(sql%rowcount);
exception
when no_data_found then
dbms_output.put_line('Sorry No data');
when too_many_rows then
dbms_output.put_line('Too Many rows');
end;
declare
empNumber emp.EMPNO%TYPE;
empName emp.ENAME%TYPE;
begin
if sql%isopen then
dbms_output.put_line('Cursor is opinging');
else
dbms_output.put_line('Cursor is Close');
end if;
if sql%notfound then
dbms_output.put_line('No Value');
else
dbms_output.put_line(empNumber);
end if;
dbms_output.put_line(sql%rowcount);
dbms_output.put_line('-------------');
select EMPNO,ENAME into empNumber,empName from emp where EMPNO=7499;
dbms_output.put_line(sql%rowcount);
if sql%isopen then
dbms_output.put_line('Cursor is opinging');
else
dbms_output.put_line('Cursor is Closing');
end if;
if sql%notfound then
dbms_output.put_line('No Value');
else
dbms_output.put_line(empNumber);
end if;
exception
when no_data_found then
dbms_output.put_line('No Value');
when too_many_rows then
dbms_output.put_line('too many rows');
end;
--2,使用游标和 loop 循环来显示所有部门的名称
--游标声明
declare
cursor csr_dept
is
--select 语句
select DNAME
from Depth;
--指定行指针,这句话应该是指定和 csr_dept 行类型相同的变量
row_dept csr_dept%rowtype;
begin
--for 循环
for row_dept in csr_dept loop
dbms_output.put_line('部门名称:'||row_dept.DNAME);
end loop;
end;
--3,使用游标和 while 循环来显示所有部门的的地理位置(用%found 属性)
declare
--游标声明
cursor csr_TestWhile
is
--select 语句
select LOC
from Depth;
--指定行指针
row_loc csr_TestWhile%rowtype;
begin
--打开游标
open csr_TestWhile;
--给第一行喂数据
fetch csr_TestWhile into row_loc;
--测试是否有数据,并执行循环
while csr_TestWhile%found loop
dbms_output.put_line('部门地点: '||row_loc.LOC);
--给下一行喂数据
fetch csr_TestWhile into row_loc;
end loop;
close csr_TestWhile;
end;
select * from emp
--4,接收用户输入的部门编号,用 for 循环和游标,打印出此部门的所有雇员的所有信息(使
用循环游标)
--CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;
--定义参数的语法如下:Parameter_name [IN] data_type[{:=|DEFAULT} value]
declare
CURSOR
c_dept(p_deptNo number)
is
select * from emp where emp.depno=p_deptNo;
r_emp emp%rowtype;
begin
for r_emp in c_dept(20) loop
dbms_output.put_line('员工号: '||r_emp.EMPNO||'员工名: '||r_emp.ENAME||'工资:
'||r_emp.SAL);
end loop;
end;
select * from emp
--5:向游标传递一个工种,显示此工种的所有雇员的所有信息(使用参数游标)
declare
cursor
c_job(p_job nvarchar2)
is
select * from emp where JOB=p_job;
r_job emp%rowtype;
begin
for r_job in c_job('CLERK') loop
dbms_output.put_line('员工号'||r_job.EMPNO||' '||'员工姓名'||r_job.ENAME);
end loop;
end;
SELECT * FROM EMP
--6:用更新游标来为雇员加佣金: (用 if 实现,创建一个与 emp 表一摸一样的 emp1 表,对
emp1 表进行修改操作),并将更新前后的数据输出出来
--http://zheng12tian.iteye.com/blog/815770
create table emp1 as select * from emp;
declare
cursor
csr_Update
is
select * from emp1 for update OF SAL;
empInfo csr_Update%rowtype;
saleInfo emp1.SAL%TYPE;
begin
FOR empInfo IN csr_Update LOOP
IF empInfo.SAL<1500 THEN
saleInfo:=empInfo.SAL*1.2;
elsif empInfo.SAL<2000 THEN
saleInfo:=empInfo.SAL*1.5;
elsif empInfo.SAL<3000 THEN
saleInfo:=empInfo.SAL*2;
END IF;
UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_Update;
END LOOP;
END;
--7:编写一个 PL/SQL 程序块,对名字以‘ A’或‘ S’开始的所有雇员按他们的基本薪水
(sal)的 10%给他们加薪(对 emp1 表进行修改操作)
declare
cursor
csr_AddSal
is
select * from emp1 where ENAME LIKE 'A%' OR ENAME LIKE 'S%' for update OF SAL;
r_AddSal csr_AddSal%rowtype;
saleInfo emp1.SAL%TYPE;
begin
for r_AddSal in csr_AddSal loop
dbms_output.put_line(r_AddSal.ENAME||'原来的工资:'||r_AddSal.SAL);
saleInfo:=r_AddSal.SAL*1.1;
UPDATE emp1 SET SAL=saleInfo WHERE CURRENT OF csr_AddSal;
end loop;
end;
--8:编写一个 PL/SQL 程序块,对所有的 salesman 增加佣金(comm)500
declare
cursor
csr_AddComm(p_job nvarchar2)
is
select * from emp1 where JOB=p_job FOR UPDATE OF COMM;
r_AddComm emp1%rowtype;
commInfo emp1.comm%type;
begin
for r_AddComm in csr_AddComm('SALESMAN') LOOP
commInfo:=r_AddComm.COMM+500;
UPDATE EMP1 SET COMM=commInfo where CURRENT OF csr_AddComm;
END LOOP;
END;
--9:编写一个 PL/SQL 程序块,以提升 2 个资格最老的职员为 MANAGER(工作时间越长,
资格越老)
--(提示:可以定义一个变量作为计数器控制游标只提取两条数据;也可以在声明游标的
时候把雇员中资格最老的两个人查出来放到游标中。)
declare
cursor crs_testComput
is
select * from emp1 order by HIREDATE asc;
--计数器
top_two number:=2;
r_testComput crs_testComput%rowtype;
begin
open crs_testComput;
FETCH crs_testComput INTO r_testComput;
while top_two>0 loop
dbms_output.put_line('员工姓名: '||r_testComput.ENAME||' 工作时间:
'||r_testComput.HIREDATE);
--计速器减一
top_two:=top_two-1;
FETCH crs_testComput INTO r_testComput;
end loop;
close crs_testComput;
end;
--10:编写一个 PL/SQL 程序块,对所有雇员按他们的基本薪水(sal)的 20%为他们加薪,
--如果增加的薪水大于 300 就取消加薪(对 emp1 表进行修改操作,并将更新前后的数据输
出出来)
declare
cursor
crs_UpadateSal
is
select * from emp1 for update of SAL;
r_UpdateSal crs_UpadateSal%rowtype;
salAdd emp1.sal%type;
salInfo emp1.sal%type;
begin
for r_UpdateSal in crs_UpadateSal loop
salAdd:= r_UpdateSal.SAL*0.2;
if salAdd>300 then
salInfo:=r_UpdateSal.SAL;
dbms_output.put_line(r_UpdateSal.ENAME||': 加薪失败。 '||'薪水维持在:
'||r_UpdateSal.SAL);
else
salInfo:=r_UpdateSal.SAL+salAdd;
dbms_output.put_line(r_UpdateSal.ENAME||': 加薪成功.'||'薪水变为: '||salInfo);
end if;
update emp1 set SAL=salInfo where current of crs_UpadateSal;
end loop;
end;
--11:将每位员工工作了多少年零多少月零多少天输出出来
--近似
--CEIL(n)函数:取大于等于数值 n 的最小整数
--FLOOR(n)函数:取小于等于数值 n 的最大整数
--truc 的用法 http://publish.it168.com/2005/1028/20051028034101.shtml
declare
cursor
crs_WorkDay
is
select ENAME,HIREDATE, trunc(months_between(sysdate, hiredate) / 12) AS SPANDYEARS,
trunc(mod(months_between(sysdate, hiredate), 12)) AS months,
trunc(mod(mod(sysdate - hiredate, 365), 12)) as days
from emp1;
r_WorkDay crs_WorkDay%rowtype;
begin
for r_WorkDay in crs_WorkDay loop
dbms_output.put_line(r_WorkDay.ENAME||'已经工作了'||r_WorkDay.SPANDYEARS||'年,零
'||r_WorkDay.months||'月,零'||r_WorkDay.days||'天');
end loop;
end;
--12:输入部门编号,按照下列加薪比例执行(用 CASE 实现,创建一个 emp1 表,修改
emp1 表的数据),并将更新前后的数据输出出来
-- deptno raise(%)
-- 10 5%
-- 20 10%
-- 30 15%
-- 40 20%
-- 加薪比例以现有的 sal 为标准
--CASE expr WHEN comparison_expr THEN return_expr
--[, WHEN comparison_expr THEN return_expr]... [ELSE else_expr] END
declare
cursor
crs_caseTest
is
select * from emp1 for update of SAL;
r_caseTest crs_caseTest%rowtype;
salInfo emp1.sal%type;
begin
for r_caseTest in crs_caseTest loop
case
when r_caseTest.DEPNO=10
THEN salInfo:=r_caseTest.SAL*1.05;
when r_caseTest.DEPNO=20
THEN salInfo:=r_caseTest.SAL*1.1;
when r_caseTest.DEPNO=30
THEN salInfo:=r_caseTest.SAL*1.15;
when r_caseTest.DEPNO=40
THEN salInfo:=r_caseTest.SAL*1.2;
end case;
update emp1 set SAL=salInfo where current of crs_caseTest;
end loop;
end;
--13:对每位员工的薪水进行判断,如果该员工薪水高于其所在部门的平均薪水,则将其薪
水减 50 元,输出更新前后的薪水,员工姓名,所在部门编号。
--AVG([distinct|all] expr) over (analytic_clause)
---作用:
--按照 analytic_clause 中的规则求分组平均值。
--分析函数语法:
--FUNCTION_NAME(<argument>,<argument>...)
--OVER
--(<Partition-Clause><Order-by-Clause><Windowing Clause>)
--PARTITION 子句
--按照表达式分区(就是分组),如果省略了分区子句,则全部的结果集被看作是一个单一的

select * from emp1
DECLARE
CURSOR
crs_testAvg
IS
select EMPNO,ENAME,JOB,SAL,DEPNO,AVG(SAL) OVER (PARTITION BY DEPNO ) AS DEP_AVG
FROM EMP1 for update of SAL;
r_testAvg crs_testAvg%rowtype;
salInfo emp1.sal%type;
begin
for r_testAvg in crs_testAvg loop
if r_testAvg.SAL>r_testAvg.DEP_AVG then
salInfo:=r_testAvg.SAL-50;
end if;
update emp1 set SAL=salInfo where current of crs_testAvg;
end loop;
end;

分享到:
评论

相关推荐

    Oracle存储过程学习经典[语法+实例+调用].

    Oracle存储过程基础知识 Oracle存储过程的基本语法 Oracle存储过程的若干问题备忘 用Java调用Oracle存储过程总结 在存储过程中做简单动态查询 Oracle存储过程调用Java方法

    Oracle存储过程超详细使用手册

    Oracle 存储过程超详细使用手册 Oracle 存储过程是一种强大的数据库工具,它可以将...通过本手册,读者可以学习到 Oracle 存储过程的使用方法,包括创建存储过程、变量赋值、判断语句、循环语句、数组等多方面的内容。

    oracle存储过程函数和程序包.ppt

    Oracle 存储过程函数和程序包 Oracle 存储过程函数和程序包是 Oracle 数据库中的一种核心组件,用于实现复杂的...通过学习 Oracle 存储过程函数和程序包,可以提高代码的可维护性和重用性,提高开发效率和产品质量。

    oracle存储过程总结-函数-语法-大全-详解.docx

    学习永无止境:oracle存储过程总结_函数_语法_大全_详解

    Oracle 存储过程

    做项目时候最实用的总结,能帮助初级学习Oracle的同学学习、最全的Oracle存储过程总结!

    Oracle 存储过程总结(一、基本应用)

    Oracle 存储过程总结 基本应用技巧,大家可以学习下oracle存储过程最基本的东西。

    oracle学习日志总结

    1. 采用共享sql(带占位符或者参数sql). 2. 使用表别名. 3. 尽量避免反复访问同一张表或者几张表,尤其是数据量大的表可考虑提取数据到临时表,然后做链接. ...注意存储过程中参数和数据类型的关系 。

    java 调用存储过程列子

    学生在学习jdbc的时候,会问到怎么调用存储过程,现在将java调用oracle存储过程的示例总结如下

    oralce学习笔记总结(包含存储过程触发器)

    本文件是本人学习oracle的一些总结资料,值得大家借鉴,可以互相交流

    练习利用PLSQL Developer编写和管理存储过程、存储函数和触发器等

    PLSQL Developer中存储过程、存储...在本实验中,我们学习了如何使用PLSQL Developer编写和管理存储过程、存储函数和触发器,并掌握了这些对象的基本作用和操作。这些知识点将有助于我们更好地理解和应用Oracle数据库。

    oracle所有知识点笔记(全)

    基本的sql语法,触发器,存储过程,存储函数, 流程控制,游标,异常处理,记录类型,视图, 控制用户权限,高级子查询,set运算符, 基本的sql_Select语句 运算符,多表联查,排序,组函数,序列,索引,同义词, ...

    oracle pl的学习笔记

    自己总结的oracle pl学习代码。有游标,存储过程,触发器,集合等。 初步学习pl的话会有一些帮助,也提供了相关的练习。

    oracle学习总结

    oracle入门知识总结:用户与权限,表与表空间,数据库对象,数据与数据完整性,函数,事务与存储过程,游标与触发器,pl/sql流程控制

    Oracle个人学习笔记

    个人总结Oracle技术,从建表,表空间,系列,存储过程,包,函数,数据库导入导出

    Oracle调优总结收藏.docx

    Oracle 调优总结收藏 本文总结了 Oracle 数据库的调优方法,涵盖了数据库结构、索引、SQL 优化、执行计划、绑定变量等方面的知识点。通过学习这些内容,可以帮助读者更好地理解 Oracle 数据库的工作机理,并提高...

    Oracle11g从入门到精通2

    7.3.4 存储过程检查 7.3.5 使用触发器 7.4 避免更改引起的大量改动 7.4.1 使用视图 7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3...

    oracle学习资料

    关于 oracle学习的基础知识的总结,其中包含了存储过程等例子

    oracle经常用到的知识总结文档

    oracle经常用到的知识总结文档,对于学习oracle来说非常有用!包括常用命令,常用表,数据类型,表操作基础,约束,运算符,查询,程序块,事务处理,流程控制,游标,存储过程,日期函数,字符串函数等等....

    Oracle培训PPT教案.pptx

    本文档是一个 Oracle 培训 PPT 教案,旨在为读者提供 Oracle 培训的知识点总结。该教案涵盖了 Oracle 体系结构、Oracle SQL 优化及编写规范、Oracle 高可用性、性能优化等方面的内容。 一、Oracle 体系结构 Oracle...

Global site tag (gtag.js) - Google Analytics