使用PL/SQL&自定义函数(Oracle)

2023-10-30

    1.PL/SQL概述.

   PL/SQL是过程语言PL与结构化查询语言SQL结合而成的编程语言。
   PL/SQL是针对Oracle数据库的;
   它是过程语言 + 结构化查询语言的结合;

   过程语言PL:如变量声明,流程的控制,循环等;
   查询语言SQL:SQL语言,如增、删、改、查等;
 
   PL/SQL是SQL的扩展版,SQL能做的,PL/SQL绝大多数都能做。


2.PL/SQL的优点:
   1.支持SQL:数据操纵命令,事务控制命令,游标控制,SQL函数和SQL运算符;
   2.支持面向对象编程;
   3.可移植性,可运行在任何操作系统上;
   4.经过编译执行,性能佳;
   5.与SQL紧密集成,简化数据处理,支持SQL数据类型,支持NULL值,支持%type和%rowtype属性类型(oracle中最有意思的);
   6.安全性

PL/SQL分成三个部分:
   1. 声明部分
   2. 可执行部分
   3. 异常片理部分


语法结构:
[declare declaration]  --声明部分
begin
    executable  statements  --可执行部分
    [exception  handlers]  --异常区
end;


输出
select 'abc' from dual;
dbms_output.put_line('abc');

    --打印输出(必带begin)
    begin
        dbms_output.put_line('abc');
    end

赋值:( := )
    --变量声明赋值,并打印
    declare i number(6);
    begin
        i:=77;   //:=赋值,select...into也是赋值
        dbms_output.put_line(i);
    end;

--在emp表中将工号为7369的姓名输出
declare sid number;
sname varchar2(22);
begin
    sid:=7369;
    select ename into sname from emp where empno=sid;  --select...into赋值方式
    dbms_output.put_line(sname);
end;

提示下:在begin里面用select语句,必定要用select…into

数据类型:
1.标量类型
2.LOB类型
3.属性类型:
  %type:提供某个变量或数据库表列的数据类型
  %rowtype:提供表中一行的记录类型(非常有特色)


3.1 %type

--求7369的入职日期(在不知道该列是什么类型的情况下)
--申请一个与“入职日期”一样的

declare sid number;
shiredate emp.hiredate%type;  --声明个变量,它的类型与表中某个列的类型一样
begin
    sid:=7369;
    select hiredate into shiredate from emp where empno=sid;
    dbms_output.put_line(shiredate);
end;

--也可以sb shiredate%type;


--求某某的所有信息
declare sid number;
sname emp.ename%type;
sjob emp.job%type;
begin
    sid:=7369;
    select ename,job into sname,sjob from emp where empno=sid;
    dbms_output.put_line(sname||'   '||sjob);
end;


当然,要是表中有很多的列,还像以上这么写吗?
NO,使用行类型:%rowtype;

--查询某某的所有信息
declare sid number;
er emp%rowtype;
begin
    sid:=7369;
    select * into er from emp where empno=sid;
    dbms_output.put_line(er.ename||'   '||er.job);
end;

输入& (一般做测试用,其它情况不怎么用)

declare sid number;
er emp%rowtype;
begin
    sid:=&请输入;  --&类似scanner
    select * into er from emp where empno=sid;
    dbms_output.put_line(er.ename||'   '||er.job);
end;

  注意:sid:=&请输入;  --代表录入的是整型
    sid:='&请输入'; --代表录入的是varchar2类型

逻辑比较:
<> , !=

控制语句:
if 条件 then
……
else或者elsif…then
……
end if

--工资大于3500交税,=3500刚好,<3500努力
if语句:
begin
  if sal>3500 then
      dbms_output.put_line('交税');
  elsif sal=3500 then
    dbms_output.put_line('刚好');
  else
    dbms_output.put_line('努力');
  end if;
end;


case语句:
case 
    when   then ;
    when   then ;
    else
end case;

循环语句:有三种:
1.loop 无条件循环
2.while
3.for

--打印1~100
declare i number;
begin
    i:=1;
    loop
        dbms_output.put_line(i);
        i:=i+1;
        exit when i=100;    --退出及退出条件
    end loop;
end;

declare i number;
begin
    i:=1;
    <<b_loop>>  --loop循环的名字
    loop
        dbms_output.put_line(i);
        i:=i+1;
        exit b_loop when i=100;    --退出及退出条件
    end loop;
end;


--求1~100的和
declare i number;
mysum number;
begin
    i:=0;
    mysum:=0;
    while i<=100 loop
        mysum:=mysum+i;
        i:=i+1;
    end loop;
    dbms_output.put_line('总和:'||mysum);
end;


--循环里都会使用到loop

--for循环的写法:
declare
mysum number;
begin
    mysum:=0;
    for i in 1..100 loop
        mysum:=mysum+i;
    end loop;
    dbms_output.put_line(mysum);
end;


--求奇数之和
declare
mysum number;
begin
    mysum:=0;
    for i in 1..100 loop
        if mod(i,2)=1 then
        mysum:=mysum+i;
        end if;
    end loop;
    dbms_output.put_line(mysum);
end;


--顺序语句:goto 标名……<<标名>>
 


异常:
1.系统自带的异常---预定义异常
2.我们写代码报的异常---自定义异常

1.预定义异常
  too_many_rows :  行太多
  no_data_found :  数据未找到

例示:预定义异常:
declare sid number;
shiredate emp.hiredate%type;
sb shiredate%type;
begin
    sid:=7369;
    select hiredate into shiredate from emp;
    dbms_output.put_line(shiredate);
--异常
    exception  --发生异常就会报错
    when too_many_rows then
    dbms_output.put_line('行太多');
end;

例示:自定义异常
三步:声明,判断,捕捉

iee exception;

raise iee;

exception when iee then
    dbms_output.put_line('错误信息');
    when too_many_rows then
    dbms_output.put_line('错误信息');
    ……

    可以带多个异常体

===============================================

函数:
create or replace function  f_name [(参数1,参数2..)]
return 类型
is/as  
     
[local declarations]  --函数体里面的变量声明全放该位置

begin
    --执行体
    return 
    --异常
end; 


--案例:给编号,返回工资'交税'还是'刚好',还是'努力'
create or replace function f_n126(sid number)
return varchar2
is

    ssal number(8,2);
    str varchar2(22); --注意,该处不用declare定义

begin
    select sal into ssal from emp where empno=sid;
    if ssal>3500 then
        str:='交税';
    elsif ssal=3500 then
        str:='刚好';
    else 
        str:='努力';
    end if;
    return str;
end;

--如何调用函数?
--oracle调用方式:
select f_n126(7369) from dual; 
 
--pl/sql调用方式:
declare str varchar2(22);
begin
    str:=f_n126(7369);
    dbms_output.put_line(str);
end;

======自定义异常=========================================

declare

  异常变量 exception;

  begin

    if(触发异常条件) then

       raise 异常变量;    

    else

      未触发异常执行的代码块

    end if;

    exception when 异常变量 then

             触发异常执行的代码块

  end;


declare n_s number(5);
e_my exception;
pragma exception_init(e_my,-20001);
begin
    select count(stuname) into n_s from stuinfo where stuname like '赵%';
    if n_s=0 then
        raise e_my;
    end if;
    dbms_output.put_line('数量是'||n_s);

    exception 
        when e_my then
        dbms_output.put_line('人员为空');
end;


=====函数=================================================

create [or replace] function 函数名 (参数1,参数2)

return 返回值类型  is|as   

定义返回变量(要取长度);

begin

  函数要执行的sql语句

  return 变量名;          

end;

create or replace function my_temp(n_s in varchar2, n_max in out number)
  return number is
  n_tavg number(5, 2);
begin
  select avg(stuage),max(stuage) into n_tavg,n_max from stuinfo where stuname like n_s||'%';
  return n_tavg;
end;

create or replace function my_sum(n_a in  number)
return number
is
n_sum number(5):=0;
begin

for int_s in 1..n_a loop
n_sum:=n_sum+int_s;
end loop;
return n_sum;
end;


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用PL/SQL&自定义函数(Oracle) 的相关文章

  • java.lang.unsatisfiedlinkerror 无法加载 amd 64 位 .dll ia 32 位

    当我尝试在 Eclipse 上运行我的项目时 出现以下错误 它在我开发它的计算机上运行良好 但当我将其导入我的笔记本电脑时 它不起作用 这个问题已经在本网站的其他地方提出过 这个问题的主要原因似乎是环境变量设置不正确 但我检查过 它们似乎是
  • 在 Java 中使用 Apache POI XWPF 在同一个 Word 文档中横向和纵向页面

    我正在尝试使用 Java 和 Apache POI 库创建一个包含一些横向页面和一些纵向页面的 Word 文档 我可以更改所有页面的方向 但有没有办法只更改其中某些页面的方向 我尝试过使用不同的部分和主体 但无济于事 目前我已经编写了一个函
  • 如何解析比 Java 中 NumberFormat 更严格的数字?

    我正在验证表单中的用户输入 我解析输入NumberFormat http docs oracle com javase 7 docs api java text NumberFormat html 但它是邪恶的 几乎允许任何事情 有没有办法
  • 使 TreeMap 比较器容忍 null

    这个定制的 Valuecomarator 按其值对 TreeMap 进行排序 但在搜索 TreeMap 是否具有某个键时 它不能容忍 nullpointException 如何修改比较器来处理零点 import java io IOExce
  • 使用 Java NIO 直接访问 Windows 磁盘

    我正在使用一个使用 Java NIO 的库来直接将文件映射到内存 但我在直接读取磁盘时遇到问题 I can直接使用读取磁盘FileInputStream与 UNC 合作 例如 File disk new File PhysicalDrive
  • Eclipse 说“更新 Android Developer Toolkit”

    我不知何故弄乱了我的 Eclipse 和 Android 设置 我不知道如何修复它 问题症状如下 在 首选项 gt Android 中 我尝试选择 android sdk linux 的位置 选择时出现错误 此 Android SDK 需要
  • MySql 复合索引

    我们使用 MySql 作为我们的数据库 以下查询在 mysql 表 大约 2500 万条记录 上运行 我在这里粘贴了两个查询 查询运行得太慢 我想知道更好的复合索引是否可以改善这种情况 你知道最好的综合指数是什么吗 并建议我这些查询是否需要
  • com.google.gwt.dev.jjs.InternalCompilerException:访问期间出现意外错误

    我在使用版本 2 6 0 编译 gwt 应用程序时遇到以下错误 最初我用 gwt 版本 2 6 1 的 maven 编译它 然后尝试通过版本 2 6 0 的 eclipse 编译它 跟版本兼容有关系吗 com google gwt dev
  • 使用java在mysql中插入带有\\的文件路径

    我正在使用java制作一个独立的应用程序 并且我需要插入用户从文件选择器中选择的图像的路径 我正在获取文件的路径 但是当我将其存储在数据库 mysql 中时 它不会存储 所以当我检索该路径时 该文件不会显示 如何存储文件的路径 这样就可以使
  • Selenium Webdriver 中显式等待 findElements

    登录后 页面重定向到一个页面 我想等待页面加载 我在其中按 tagName 查找元素 By inputArea By tagName input List
  • 使用 viewModel 从 ChildFragment 访问 ParentFragment 中的 ViewModel

    我正在尝试访问ParentViewModel for ParentFragment from ChildFragment using viewModels 这是我的代码 In ParentFragment class ParentFragm
  • 用dagger 2查看依赖注入

    我有一个自定义视图扩展TextView 我应该在哪里调用我的组件来注入视图 component inject customTextView 因此 我发现我需要在自定义视图的构造函数中添加注入 在所有视图中 或者使一个调用另一个 Exampl
  • 如何告诉 Java SAX 解析器忽略无效字符引用?

    当尝试使用字符引用解析不正确的 XML 时 例如 x1 Java 的 SAX 解析器因致命错误而惨死 例如 org xml sax SAXParseException Character reference x1 is an invalid
  • 为什么 Libgdx 的 Table 不接受缩放操作?

    我在 libgdx 库中使用 scene2d 在游戏中创建一些 UI 我使用了一个表格 我想在用户触摸时采取一些缩放操作以使按钮触摸有意义 当我使用任何其他 Actor 类型 例如 Group 并为其提供缩放操作时 它可以工作 但不能工作表
  • Java可以进行进程监控吗?

    是否可以用Java编写一个在托盘中运行的应用程序 并且当启动某个应用程序时 它可以检测到它 我想对某些程序执行此操作 以了解我每周使用它们多长时间 我是 Java 新手 所以我不知道 Java 是否是最适合此操作的语言 或者它是否具有对操作
  • 在 Java Web 应用程序中获取 DataSource 资源

    我的 context xml 文件中有以下资源标记
  • Access 2013 SQL 中的转换和透视

    如何使用 TRANSFORM 和 PIVOT 函数从第一个表获取第二个表 TABLE 01 Config ID ConfigField ConfigValue 11 Name Basic 11 Version 1 01 11 Owner J
  • Selenium Webdriver 中的 IF 语句

    我想知道是否有人可以帮助我解决我正在尝试解决的问题以及 Java 中 Webdriver 的 If 语句 当登录到我正在测试的应用程序时 可以在主页之前进入安全问题页面 如果是新用户等 我希望测试中的代码做的是 如果出现安全问题页面 请填写
  • 确保对象实现 Comparable

    我有一个小问题 想知道如何解决它 我有一个通用类Tuple
  • 如何更改MultipartFile的originalFilename

    我在服务器端有一个 MultipartFile 文件 我想更改该文件的原始文件名 但该类仅支持 getOriginalFilename 谁能帮我这个 PS 上传的是图片文件 多谢 您可以使用 MockMultipartFile 类更改名称

随机推荐