热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

java从零开始,学习笔记之基础入门<Oracle_函数_触发器_游标_

Oracle_函数_触发器_游标_存储过程_视图---PLSQL语言部分--PL.SQL基本格式:--declare--声明部分--一切变量和常量在此声明--begin----主体,执行语句--end;declareinumber(3);begin--给变量赋值i:1;dbms_output.put_line(i的值是:||i);end;

Oracle_函数_触发器_游标_存储过程_视图 ---PL/SQL语言部分 --PL.SQL基本格式: --declare --声明部分--一切变量和常量在此声明 --begin -- --主体,执行语句 --end; declare i number(3); begin --给变量赋值 i:=1; dbms_output.put_line(i的值是:||i); end;

Oracle_函数_触发器_游标_存储过程_视图

---PL/SQL语言部分

--PL.SQL基本格式:

--declare --声明部分--一切变量和常量在此声明

--begin

-- --主体,执行语句

--end;

declare

i number(3);

begin

--给变量赋值

i:=1;

dbms_output.put_line('i的值是:'||i);

end;

--声明常量

declare

i constant varchar2(20):='我是摩纳哥鞑子';

begin

dbms_output.put_line(i);

end;

select * from scott.emp;

--删除一条记录

declare

eno varchar2(5);

begin

eno:=7369;

delete scott.emp where empno=eno;

end;

--新增一条记录

declare

eno varchar2(5):=110;

ena varchar2(20):='周星星';

ejob varchar2(30):='影帝';

mgr number(4):=7369;

hir date:='3-1月-2011';

sals number(10):=10000;

com number(20):=100;

dep number:=10;

begin

insert into scott.emp values(eno,ena,ejob,mgr,hir,sals,com,dep);

end;

--查询数据

declare

eno number(3);

ena varchar2(10);

begin

eno:=110;

select ename into ena from scott.emp where empno=eno;

dbms_output.put_line('ena的值是:'||ena);

end;

--显示所有的记录

declare

eno varchar2(5):=110;

ena varchar2(20);

ejob varchar2(30);

mgr number(10);

hir date;

sals number(10);

com number(20);

dep number(10);

begin

select empno,ename,job,mgr,hiredate,sal,comm,deptno

into eno,ena,ejob,mgr,hir,sals,com,dep

from scott.emp

where empno=eno;

dbms_output.put_line(eno||','||ena||','||ejob||','||mgr||','||hir||','||sals||','||com||','||dep);

end;

--使用一行简化我们的查询操作

--%rowtype,返回行的数据类型

declare

emps scott.emp% rowtype;

begin

select * into emps from scott.emp where empno=110;

dbms_output.put_line(emps.ename||','||emps.job);

end;

--%type

declare

enames scott.emp.ename% type;

begin

select ename into enames from scott.emp where empno=110;

dbms_output.put_line(enames);

end;

--条件控制语言

--if--then--else

--if--then--else if--else if --else--

--有多少个if就给多少end if 结束

declare

i number:=2;

begin

if(i>4)

then

dbms_output.put_line('逻辑正确');

else

dbms_output.put_line('逻辑不正确');

endif;

end;

--查询scott.emp 表中的数据,如果工资低于3000就加2000

--如果低于4000就只加500

--如果高于5000就扣除200

declare

emp number(5):=110;

esal number(10);

begin

select sal into esal from scott.emp where empno=emp;

if(esal<3000) then

update scott.emp set sal=sal+2000;

else if(esal>5000) then

update scott.emp set sal=sal-200;

end if;

end if;

select sal into esal from scott.emp where empno=emp;

dbms_output.put_line(esal);

end;

--case

declare

i number(2):=1;

begin

case i

when1 then

dbms_output.put_line(&#39;i的值是1&#39;);

when 2 then

dbms_output.put_line(&#39;i的值是2&#39;);

when 3 then

dbms_output.put_line(&#39;i的值是3&#39;);

else

dbms_output.put_line(&#39;没有匹配的值&#39;);

end case;

end;

--循环语句

--loop,for.while

--简单的loop循环

declare

i number(2):=1;

begin

loop

if(i>10) then

exit; --终止程序

end if;

dbms_output.put_line(i);

i:=i+1;

end loop;

end;

--for循环

declare

j number(2):=10;

begin

for i in1..j loop --for循环,不需要声明此处的变量i,范围采用".."

dbms_output.put_line(i);

end loop;

end;

--while 循环

declare

k number(2):=1;

begin

while (k<=10) loop

dbms_output.put_line(k);

k:=k+1;

end loop;

end;

--异常的处理

--预定义异常

--用户自定义异常

declare

invalied EXCEPTION;

categroy varchar2(10);

begin

categroy :=&#39;tt&#39;;

if categroy not in(&#39;沈水&#39;,&#39;林下&#39;,&#39;石小孟&#39;) then

raise invalied;

else

dbms_output.put_line(&#39;你是:&#39;||categroy);

end if;

exception

when invalied then

dbms_output.put_line(&#39;你输入的不匹配&#39;);

end;

declare

j number(2):=10;

begin

for i in1..j loop --for循环,不需要声明此处的变量i,范围采用".."

dbms_output.put_line(i);

end loop;

end;

/*

*

**

***

****

*****

*/

declare

begin

for i in0..5 loop

for j in0..i loop

dbms_output.put(&#39;*&#39;);

end loop;

dbms_output.new_line;

end loop;

end;

select * from scott.emp

存储过程

--存储过程

create or replace procedure test_pro

as

begin

declare

i number(3):=1;

begin

dbms_output.put_line(i);

end;

end;

execute test_pro;--在sqlplus里执行

--在sql里执行存储过程

begin

test_pro;

end;

--带参数的存储过程

create or replace procedure get_par(i innumber)

as

begin

dbms_output.put_line(i);

end;

begin

get_par(2012);

end;

--根据学生id查询某学生名

create or replace procedure get_stu(stu_id innumber)

is

stuname varchar2(28);

begin

select s_name into stuname from student where s_id =stu_id;

dbms_output.put_line(stuname);

exception

when no_data_found then

dbms_output.put_line(&#39;查无此人&#39;);

end;

begin

get_stu(1);

end;

--带有输入输出参数的存储过程

--根据学生id来查询学生姓名

create or replace procedure get_stu(stu_id in number,stuname in out varchar2)

as

begin

select username into stuname from user_tb where userid =stu_id;

dbms_output.put_line(stuname);

exception

when no_data_found then

dbms_output.put_line(&#39;查无此人&#39;);

end;

declare

stuname varchar2(30);

begin

get_stu(1,stuname);

end;

*******************************************************

--模拟登录与注册

create table usertb(

userid number primary key,

username varchar2(30),

userpwd varchar2(30)

)

create or replace procedure login_pros(uname in out varchar2,pwd in out varchar2,islogin in out boolean)

as

begin

select username,userpwd into uname,pwd from usertb where username=uname and userpwd=pwd;

islogin:=true;

exception

when no_data_found then

dbms_output.put_line(&#39;用户没有注册&#39;);

islogin:=false;

end;

--执行登录的存储过程

declare

uname varchar2(30):=&#39;李冰冰&#39;;

pwd varchar2(30):=&#39;abc&#39;;

islogin boolean;

begin

login_pros(uname,pwd,islogin);

if(islogin) then

dbms_output.put_line(&#39;登录成功,&#39;||&#39;登录的用户是&#39;||uname);

else

dbms_output.put_line(&#39;登录失败&#39;||&#39;请重新注册&#39;);

end if;

end;

--注册

create or replace procedure regist_pros(uname in out varchar2,pwd in out varchar2,userid in number,isregist out boolean)

as

begin

insert into usertb values(userid,uname,pwd);

isregist:=true;

dbms_output.put_line(&#39;注册成功&#39;||&#39;注册用户是:&#39;||uname);

exception

when no_data_found then

dbms_output.put_line(&#39;您输入的用户信息是否正确&#39;);

isregist:=false;

end;

--注册的存储过程的调用

declare

uname varchar2(30):=&#39;李冰冰&#39;;

pwd varchar2(30):=&#39;abc&#39;;

userid number(10):=3;

isregist boolean;

begin

regist_pros(uname,pwd,userid,isregist);

if(isregist) then

dbms_output.put_line(&#39;注册的用户是:&#39;||uname);

else

dbms_output.put_line(&#39;是否重新注册&#39;);

end if;

end;

视图

--视图

create view emp_view

as

select * from usertb;

--删除视图中的字段,会影响到住表中的数据

delete from emp_view where userid=2;

--对视图进行更新

update emp_view set username=&#39;李斯&#39; where userid=2;

触发器

--触发器

--触发器对select不起作用

create or replace trigger delete_tir after delete on scott.emp

begin

dbms_output.put_line(&#39;删除一条语句&#39;);

end;

alter trigger delete_tir disable;

delete from scott.emp where empno=110;

create or replace trigger update_tri before update on scott.emp

begin

dbms_output.put_line(&#39;更新一条语句&#39;);

end;

update scott.emp set sal=9000 where empno=7499;

--对scott.emp表进行插入数据的时候,也同时将此数据插入到

create table emptest(

eno number(20) primary key,

enames varchar2(30),

jobs varchar2(30),

mgrs number(10),

hiretime date,

sals number(10),

comms number(10),

dept_no number(10)

)

--在删除之前执行,在删除之前打印即将删除学生的信息

--删除之前执行用":old",更新之前执行用":new";

create or replace trigger stu_delete_prinStu

before deleteon tb_stu for each row

begin

dbms_output.put_line(&#39;即将删除的学生学号是:&#39;||:old.stu_no);

dbms_output.put_line(&#39;即将删除的学生姓名是:&#39;||:old.stu_name);

end;

delete from tb_stu where stu_no=6;

create or replace trigger new_tri before insert on scott.emp

for each row

begin

insert into emptest values(:new.empno,:new.ename,:new.job,:new.mgr,:new.hiredate,:new.sal,:new.comm,:new.deptno);

end;

insert into scott.emp values(11,&#39;OFFICELADY&#39;,&#39;SALE&#39;,7698,&#39;1-5月-2011&#39;,29000,3000,20);

--对表进行删除操作后的记录

create or replace trigger old_tri after delete on scott.emp

for each row

begin

dbms_output.put_line(&#39;删除的用户是:&#39;||:old.ename);

end;

delete from scott.emp where empno=11;

--before和after

--行级触发器,语句级触发器 (for each row)

--行级触发器对DML语句影响每一行的操作,例如update语句,有多少条语句,触发器就会被执行多少次

--语句级触发器对我们的DML语句只执行一次操作,例如insert语句,即使有多条,触发器只被执行一次

--before表示在语句执行之前出发

--after表示在语句执行之后进行出发

--实际看到的效果没有什么区别

--禁用触发器,启用触发器

alter trigger new_tri disable;

alter trigger old_tri enable;

--禁用一个表中所有触发器

alter table tb_stu disable all triggers;

--删除触发器

drop trigger new_tri;

select * from scott.emp;

select * from lu.emptest

函数

--定义一个函数实现加法运算

create or replace function myAdd(num1 number,num2 number)

return number--在规则说明中需要return

--只能够返回一个值(和声明的返回类型匹配)

--需要return关键字来返回值

--函数不能单独的被调用,只能作为sql代码的一部分来执行

as

num3 number;

begin

num3:=num1+num2;

return num3;

end;

--调用函数:函数不能单独的被调用,需要作为sql一部分来调用

declare

n number;

begin

n:=myAdd(12,34);

dbms_output.put_line(n);

end;

--定义一个函数,查询emp 将所有的信息打印到output

--并且计算出所有员工的工资总和,返回工资总和

--函数和存储过程一样,在定义的时候如果没有参数就不需要"()"

create or replace function getMsg

return number

as

cursor emp_msg is select * from scott.emp;

totalSal number;

begin

for e in emp_msg

loop

dbms_output.put_line(e.ename||&#39;-&#39;||e.sal);

end loop;

select sum(sal) into totalSal from scott.emp;

return totalSal;

end;

--调用函数

select getMsg() from dual;

--定义一个包的说明部分 (类似接口)

create or replace package my_package is

procedure myProc;

function myAdd(m number,n number)return number;

end my_package;

--定义一个人包的主题部分(类似程序体DAO)

create or replace package body my_package is

procedure myProc

is

cursor emp_msg isselect * from scott.emp;

begin

for e in emp_msg

loop

dbms_output.put_line(e.ename);

endloop;

end;

function myAdd(m number,n number)

return number

as

num number;

begin

num:=n+m;

return num;

end;

end my_package;

call my_package.myProc();

select my_package.myAdd(1,2) 结果 from dual;


推荐阅读
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 如何在PostgreSQL中查看数据表
    本文将指导您使用pgAdmin工具连接到PostgreSQL数据库,并展示如何浏览和查找其中的数据表。通过简单的步骤,您可以轻松访问所需的表结构和数据。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 在使用SQL Server进行动态SQL查询时,如果遇到LIKE语句无法正确返回预期结果的情况,通常是因为参数传递方式不当。本文将详细探讨这一问题,并提供解决方案及相关的技术背景。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 精选30本C# ASP.NET SQL中文PDF电子书合集
    欢迎订阅我们的技术博客,获取更多关于C#、ASP.NET和SQL的最新资讯和资源。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文介绍如何在 FireDAC 环境下实现 FDMEMTable 字段的自动获取,为开发人员提供便捷的数据处理方式。 ... [详细]
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社区 版权所有