Oracle数据库PL/SQL学习笔记(一)

简介: Oracle数据库PL/SQL学习笔记(一)

Oracel数据库的基本管理:

<span style="font-size:18px;">create tablespace test datafile 'E:\app\Administrator\oradata\orcl\test.dbf'             --注意:名称test不要带引号
size 100M
autoextend on next 2M maxsize 2048M
extent management local;  --默认是本地管理,本地管理表空间与字典管理(dictionary)表空间相比大大提高了管理效率和数据库性能
 alter tablespace  test rename to test2;   --改变表空间的名称
create user wanli identified by 123456 
default tablespace test    
ACCOUNT UNLOCK;  --解锁用户
ALTER USER username ACCOUNT UNLOCK; --解锁用户
grant connect,resource to wanli;  --普通用户
grant  DEBUG CONNECT SESSION to wanli;  --赋予用户断点测试的权限
grant dba to wanli;  --DBA管理用户</span>


sql语句的分类:

DDL--数据定义语言

   create,alter,drop,rename,truncate,comment


 delete和truncate关键字的区别:

   TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:

          二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE

           速度快,且使用的系统和事务日志资源少。


DML--数据操作语言

    select,insert,update,delete和merge  


merge关键字:


    merge是insert和update的合并。连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。

         这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。


DCL--数据控制语言

    grant和revoke     授权和撤销权限

 

TCL--事务控制语言

    commit,rollback和savepoint


pl/sql不区分大小写

但是通常会对命令单纯使用大写形式,而对变量、列名和存储过程调用使用小写形式。


pl/sql支持2中类型的程序:

1.匿名块程序,支持批脚本。

2.命名块程序,提供存储编程单元。


匿名程序块结构:必须有执行部分,最简单的是null

语法:

declare
      声明部分
  begin
      执行部分
   [exception
        异常处理部分
    ]
  end;

声明部分:包含变量定义和声明,用户定义的pl/sql类型定义,游标定义、引用游标定义

和局部函数或过程的定义。


执行部分:包含变量赋值、对象初始化、条件结构、迭代结构、嵌套的pl/sql匿名块,或者

是对局部或存储pl/sql命名块的调用。


异常部分:包含错误处理短语,该短语可以像执行部分一样使用所有项。


变量

包含标量和复合变量

标量变量:只保存一个指。

复合变量:可保存多个值。


赋值:

Oracle赋值使用  :=


nvl()函数:

nvl(my_var,false)

如果my_var为null,则设置my_var的值为false;


基本控制结构:

检查逻辑添加和控制分支程序执行,还有一个是迭代条件直到添加满足或被命令退出。


1.条件结构


 1》  if 条件1 then

null;
   else
      null;
    end if;


 2》多条件判断

if-then-elsif-then-else


2.case语句


  case搜索语句:

case  true
           when 条件1 then 
                执行1;
           when 条件2 then
                执行2
           when 条件3 then
                执行3
           else
                默认执行
       end case;


3.迭代结构


(1)for循环包括数值for循环和游标for循环。


通过使用显示的continue或exit语句分别跳过迭代或强制从循环中提早退出

for循环隐式管理其开始和结束(没有loop和end loop),不支持引用游标(refcursor),迭代引用游标只能使用显示循环结构,如简单循环和while循环。


数值for循环:  starting_number .. ending_number  开始值和结束值必须是整数,中间是两个".."

begin
   for i in 1..10 Loop
      dbms_output.put_line('The index value is ['||i||']');
   end loop;
end;


游标for循环:

for i in (游标名|sql语句) loop

   执行语句;

end loop;

如果用游标名调用,就是显示游标。如果用sql语句,就是使用隐式游标。

游标for循环中索引变量不是interger数字,它是游标返回的记录结构的引用。

可以通过点号将游标索引变量和列名组合。


--隐式游标for循环(i相当于一条记录,能直接通过 i.字段名获得对应的字段值)

begin
     for i in (select * from SCOTT.EMP t) loop
        dbms_output.put_line('The name is ['||i.ename||']');
     end loop;
end;


(2)简单循环

 

是显示结构,要求用户管理循环索引和退出条件。一般与局部定义的游标和引用游标(ref cursor)一起使用。

  游标的几个特性:%found,%notfound,%isopen和%rowcount

declare
  emp_name SCOTT.EMP.ENAME%type;--根据表的指定字段的数据类型定义变量
   cursor cur is select t.ename from SCOTT.EMP t;
begin
   open cur;
   loop
      fetch cur into emp_name;
          dbms_output.put_line('The name is ['||emp_name||']'); 
       exit when cur%notfound;
   end loop;
   close cur;
end;


 (3)while循环


要先检查循环进入条件

declare 
   emp_name SCOTT.EMP.ENAME%type;
   cursor cur is select t.ename from SCOTT.EMP t;
begin
    open cur;
    while cur%isopen loop
        fetch cur into emp_name;
        if cur%notfound then
           close cur;   --关闭游标,不能通过while循环的条件判断,自然结束循环
        end if;
         dbms_output.put_line('The name is ['||emp_name||']'); 
    end loop;
end;


PL/SQL存储编程单元:

 函数,过程,包和触发器,存储对象类型

在Oracle中,

 函数、过程、包和对象都存在同一个命名空间中。

 

 触发器存储在另一个命名空间。


函数

基本结构:

create or replace function 函数名
  (参数名  数据类型)
    return 返回结果类型
declare
   变量定义
begin
   执行sql语句
  return 结果值;
exception
   异常处理
end;


因为函数返回的是sql数据类型,所以可以左右pl/sql赋值中的右操作数,也可以直接从sql语句中调用、

如:

select greatest(12,34) from dual;  --在sql中调用greatest函数
declare
   var2 number(10);
begin 
   var2 := greatest(11,10,50,69);  --在
   dbms_output.put_line('The name is ['||var2||']'); 
end;


在命令窗口,可以使用call  函数  给会话级绑定变量赋值

SQL> variable var3 varchar2(30);
SQL>  call join_strings('hello','word') into :var3;
SQL>  select :var3 from dual;


--注意,所有的参数都要声明后再使用

create or replace function getName(userid number) return varchar2 is
  name_value varchar2(30);
  id number(10);
begin
  id := userid;
  select t.name  into name_value from tb_user t where t.userid = id;
  return(name_value);
end getName;


存储过程:

不能作为右操作数,也不能用于sql语句。

语法:

create procedure 存储过程名
     [参数名   in|out类型   数据类型]  is
  begin
     执行sql语句
    [异常处理]
  end;


事务控制和异常捕捉:

begin
   savepoint new_member;--设置回滚点
    insert into tb_user t values(51,'wanli',22,'123');
    insert into tb_user t values(51,'wanli',22,'123');    
    dbms_output.put_line('both succeeded');
    commit;  --提交
    exception
       when others then   --when others 能够截取所有的异常,一般放在异常处理的最后。
          rollback to new_member;  --回滚到设置的回滚点
          dbms_output.put_line(Sqlerrm);--输出错误信息
end;


触发器:

正因为触发器实在某个时刻运行,因此不能在触发器中使用sql dcl语句:

savepoint,rollback,或commit。


Oracle中的特殊字符:

:=            赋值

:变量名       指定标识符为会话级变量

&变量名       指定标识符为替换变量(可接受输入值)

=             比较运算符


日期格式的赋值:

字符串格式化为时间,最好使用to_date();

不支持隐式转化。即不能直接给  字符串格式的字符给    日期类型的变量。

relative_date := '01-jun-07';
date_1 := to_date('20140912','yyyy-mm-dd');
date_2 := cast('01-jun-07','mon-dd-yy') XXXXX  ----经验证,已不能使用。
extract()

内置函数可以从date值中获取数值型年月日。


复合数据类型:

主要有两种复合数据类型:记录和集合。


记录,也称结构体,包含相关元素的集合。相当于java的bean,或者类。

集合,事物集,相当于java的集合。


定义记录的语法:

type 记录名 is record

  (变量1   数据类型1,

   变量2   数据类型2,

 )

例:

declare
 type demo_record_type is record(
   id number default 1,
   value varchar2(10) := 'one'
 );
  demo demo_record_type;
begin
  dbms_output.put_line('['||demo.id||']['||demo.value||']');
end;


集合:

 是数组和列表。

1.varray数据类型   --类似java中的数组


--自定义数组(varray)

declare
   type number_varray is varray(10) of number;   --类型number_varray是包含10个数字的number类型的varray数组
   list number_varray := number_varray(1,2,3,4,5,6,7,8,null,null);    --变量list的类型是number_varray,并初始化
begin
  for i in 1..list.limit loop            --limit返回最大尺寸
     dbms_output.put('['||list(i)||']');
  end loop;
  dbms_output.new_line;
end;


--嵌套表数据类型(索引列表或java类),list集合,  特点:有序,密集填充 ,大小不固定

declare
   type number_table is table of number;    --类型是table,包含的是number,不用声明长度    
   list number_table := number_table(1,90,3,4,5,6,7,8);
begin
    list.delete(2);    --删除第二个元素,但不删除已分配的空间
     dbms_output.put_line(list.count);
     dbms_output.put_line(list.limit);  --table没有limit属性,只有varray数组才有limit属性
    for i in 1..list.count loop     
       if list.exists(i) then
           dbms_output.put('['||list(i)||']');
       end if;
    end loop;
    dbms_output.new_line;  
end;


--联合数组数据类型   (类似set集合)               特点:无序 稀疏,大小不固定

--和嵌套表定义非常相似,主要不同点:指定了如何进行索引  index by Pls_Integer 或者 index by varchar2(10)

declare
  type number_table is table of number index by Pls_Integer;
  list number_table;
begin
   for i in 1..8 Loop
      dbms_output.put_line('The index value is ['||i||']');
     list(i):= i;
   end loop;
    dbms_output.put_line(list.count);
   list.delete(2);   --和varray和嵌套表中不同,删除元素时也会删除已分配的空间
    dbms_output.put_line(list.count);
    for i in 1..list.count loop      --由于count变小,所有最后一个值8查不到
      if list.exists(i) then       
       dbms_output.put('['||list(i)||']');
      end if;
    end loop;
    dbms_output.new_line;
end;


游标

类型:隐式游标和显示游标


显示游标:在声明块中定义的游标,都属于显示游标。

隐式游标:任何执行块或异常块中的DML语句都是隐式游标。(包括insert,update,delete)


--引用游标

--弱类型的引用游标没有返回类型,强类型的引用游标有返回类型

--主要作用:  实现在程序间传递结果集的功能,在同一过程中使用引用游标没有意义。

declare
 type weakly_typed is ref cursor;
 quick weakly_typed;
 v_a1 varchar2(30);
 v_b1 number(10);
begin
   open quick for
     select t.name,t.age from tb_user t;
/*    loop 
       fetch quick into v_a1,v_b1;
        dbms_output.put_line(v_a1||'今年'||v_b1||'岁');
       exit when quick%notfound;
    end loop;*/
end;
目录
相关文章
|
4天前
|
SQL Oracle 关系型数据库
sql语句创建数据库
在创建数据库之前,请确保你有足够的权限,并且已经考虑了数据库的安全性和性能需求。此外,不同的DBMS可能有特定的最佳实践和配置要求,因此建议查阅相关DBMS的官方文档以获取更详细和准确的信息。
|
7天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
4天前
|
SQL 缓存 数据库
sql 数据库优化
SQL数据库优化是一个复杂且关键的过程,涉及多个层面的技术和策略。以下是一些主要的优化建议: 查询语句优化: 避免全表扫描:在查询时,尽量使用索引来减少全表扫描,提高查询速度。 使用合适的子查询方式:子查询可能降低查询效率,但可以通过优化子查询的结构或使用连接(JOIN)替代子查询来提高性能。 简化查询语句:避免不必要的复杂查询,尽量使SQL语句简单明了。 使用EXISTS替代IN:在查询数据是否存在时,使用EXISTS通常比IN更快。 索引优化: 建立合适的索引:对于经常查询的列,如主键和外键,应创建相应的索引。同时,考虑使用覆盖索引来进一步提高性能。 避免过多的索引:虽然索引可以提高查询
|
4天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
7天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
7天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
7天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
7天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL表达式:数据的魔法公式
【4月更文挑战第19天】探索Oracle PL/SQL表达式,体验数据的魔法公式。表达式结合常量、变量、运算符和函数,用于数据运算与转换。算术运算符处理数值计算,比较运算符执行数据比较,内置函数如TO_CHAR、ROUND和SUBSTR提供多样化操作。条件表达式如CASE和NULLIF实现灵活逻辑判断。广泛应用于SQL查询和PL/SQL程序,助你驾驭数据,揭示其背后的规律与秘密,成为数据魔法师。
|
7天前
|
存储 Oracle 关系型数据库
Oracle的模式与模式对象:数据库的“城市规划师”
【4月更文挑战第19天】在Oracle数据库中,模式是用户对象的集合,相当于数据库的城市规划,包含表、视图、索引等模式对象。模式对象是数据存储结构,如表用于存储数据,视图提供不同查看角度,索引加速数据定位。良好的模式与模式对象设计关乎数据效率、安全和稳定性。规划时需考虑业务需求、性能、安全和可扩展性,以构建高效数据库环境,支持企业业务发展。

推荐镜像

更多