2019独角兽企业重金招聘Python工程师标准>>>

一、输出信息设置
1.设置sql前缀
a.当前会话
    SET SQLPROMPT "_USER@ _CONNECT_IDENTIFIER>"
b.永久设置
    $ORACLE_HOME/sqlplus/admin/glogin.sql 文件中增加 SET SQLPROMPT "_USER@ _CONNECT_IDENTIFIER>"
2.常用set命令
    set timing on                   --设置显示“已用时间:XXXX”
    set serveroutput on size 10000  --设置允许显示输出类似dbms_output
    set feedback on                 --设置显示“已选择XX行”
    set pagesize 10                 --设置每一页的行数
    set time on                     --设置显示当前时间(sql前缀上加时间)
    set linesize 4000               --输出一行字符个数,缺省为80
    set termout off;                --必须写在.sql文件中进行。--显示脚本中的命令的执行结果,缺省为on
    set echo off                    --显示start启动的脚本中的每个sql命令,缺省为on
3.程序中使用替代变量
   &parameter  编译到该变量则让输入一次值,数值时直接加&,字符串放入引号内;
   &&parameter 第一个用,后边都用&则只用输入一次值;
4.oracle的语句
    DML:数据操纵语句
    DDL: 对象定义语句
    DCL:数据控制语句,权限授予和回收    
二、程序加密,获取源脚本
1.加密
    Wrap命令行工具,可以在命令行中实现源代码文件的加密;
    wrap iname=p_wrap_test_nc.sql oname=p_res_nc.plb
    Dbms_ddl包,其中包括的方法也可以实现在PL/SQL中进行代码的加密;
    DBMS_DDL.WRAP(VC_SQL)
    DBMS_DDL.CREATE_WRAPPED(VC_SQL)
2.获取定义脚本
    exec dbms_output.put_line(dbms_metadata.get_ddl('PROCEDURE','P_WRAP_TEST_NC'));  --所有对象的定义
    SELECT LINE, TEXT FROM USER_SOURCE WHERE NAME = 'P_WRAP_TEST_NC';  --用户自己定义的程序对象
三、PL/SQL定义
1.PL/SQL实现本地编译,在服务器上使用底层语言,执行效率高,SQL引擎和PL/SQL引擎协同配合执行PL/SQL程序单元,并
将执行结果返给客户端。集中发送SQL语句,一次编译多次使用,对用户共享;不受操作系统限制,只要运行oracle即可
支持面向对象OOP,支持WEB应用程序。
2.PL/SQL程序定义
    块头区: Program_Type[ procedure,function,package] program_name (parameter_name in/out parameter_type,….) 
            [Return  datatype];
    AS/IS
    声明区:var_name type specs;
           declare可以在任意位置声明变量
    变量辅助说明:Specs:Not null,default value,:=value,
    常量定义:Var_name constant datatype :=value;
    BEGIN
    执行区:至少包含一条执行语句,甚至可以是null,但不能为空
    EXCEPTION
    异常区:when…   then….
    END;
    注:
        变量声明区不能分开给变量赋值,可以定义时赋初值;
        不允许给输入参数重新赋值;
        输入参数不能定义长度,变量声明必须定义长度;
3.数据类型
    a.char(n):定长字符数据,最大2000个字节,默认为1,指定长度后会用空格填充;
    b.varchar2(n):n必须得有,4000字节,变长字符型;
    c.number(m,n):m有效数字位数,n处理位number(3,-3)  4567.258 5000
    d.long:存2G数据,该类型字段不能用于表达式,where,order by,group by等特定字句中
    e.boolean:不能用于创建表的字段描述,可用于存储过程;
    f.PLS_integer:带符号的整数数据类型,比number计算快,硬件存储
      simple_integer: 非空约束,声明时要赋初值,中间赋值也不能为空
    g.date:定长的日期值
      timestamp:精确到小数点后6位的
    h.anchored:%type类型, var_var1  表.字段%type;定义
    i.可以使用自定义数据类型来约束变量值的范围
    j.游标变量类型v_cur_col  cur_one%rowtype;
4.PL/SQL程序块调试错误信息
    show error
四、PL/SQL流程控制
1.IF语句:是一种条件判断语句,首先执行一个条件判断,根据条件的结果走不同的程序流程,过程化控制。
    a.IF…THEN:一旦条件满足,顺序执行1到n语句,条件不满足,则跳到END IF之后。
    IF  条件1 THEN
        执行语句1
        …….
        执行语句n
    END IF;
    b.IF…THEN….ELSE:else用来对不满足条件的情况下进行友好处理。条件满足执行THEN后的语句,完成后调至END IF,
      条件不满足,则执行ELSE后的语句,完了到END IF。
    IF  条件1 THEN
       执行语句1;
       执行语句n;
    ELSE 
       执行语句1;
       执行语句2;
    END IF;
    c.ELSIF:存在复杂的多个互斥的条件使用,依次判断条件是否满足,满足执行该条件下的语句,然后跳到END IF;
      一般条件按顺序进行。
    IF 条件1  THEN
        执行语句1;
    ELSIF  条件2  THEN
        执行语句2;
    ….
    ELSIF  条件n   THEN
        执行语句n;
    ELSE
        执行语句;
    END IF;
    d.嵌套IF:在其他语句块中使用条件控制语句块。
2、CASE语句:条件判断语句,通过选择器来判断条件是否满足
    a.简单CASE语句:带选择器
    CASE 选择器
         WHEN 选择器值1 THEN 执行语句1;
         WHEN 选择器值2 THEN 执行语句2;
         …..
         WHEN 选择器值n THEN 执行语句n;
         ELSE   执行语句
         END CASE; --case必须要写
    b.搜索式CASE语句:没有选择器,直接CASE WHEN 条件 THEN
    CASE 
         WHEN 条件1  THEN  执行语句1;
         WHEN 条件2  THEN  执行语句2;
         …..
         WHEN 条件n  THEN  执行语句n;
         ELSE   执行语句;
         END CASE;
3、循环控制语句:在一定的周期执行同样的事情,周期为循环的次数。
    a.简单循环:loop 需要一个条件来停止循环,用exit 来退出循环。用IF条件判断或者使用exit when退出循环
    loop
        执行语句;
        IF 条件1 then                  
            exit;--[ exit when 条件2 ]
        end if 
    end loop;
    b.while循环:可以用条件设置提前推出循环,条件不满足直接退到循环外下一条执行
    while 循环条件 loop
        执行语句1;
        执行语句2;
        …..
        执行语句n;
    end loop;
    c.for循环
    范围for循环:i作为循环变量,in指定范围,1为进步,包涵边界值
    for i in 1..n  loop
        执行语句;
    end loop;

五、异常
    运行过程中的错误为异常,是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。为了提高
程序的健壮性,可以在PL/SQL块中引入异常处理部分,进行捕捉异常,并根据异常出现的情况进行相应的处理。异常作用
范围仅限当前语句块,内部可以使用外部的,外部不能使用内部的
1.异常分类
    系统异常、自定义异常,其中系统异常又分为:预定义异常和非预定义异常。
a.预定义异常,ORACLE定义了他们的错误编号和异常名字
    NO_DATA_FOUND          SELECT ... INTO ... 时,没有找到数据
    TOO_MANY_ROWS          SELECT ... INTO ... 时,查询的结果是多值
b.非预定义异常,ORACLE为它定义了错误编号,但没有定义异常名字。我们使用的时候,先声名一个异常名,
  通过伪过程PRAGMA EXCEPTION_INIT,将异常名与错误号关联起来。    
c.自定义异常,程序员从我们业务角度出发,制定的一些规则和限制。
2.异常处理
PL/SQL中,异常处理按个步骤进行:
    定义异常
    抛出异常
    捕获及处理异常
a.定义异常
    exception_name EXCEPTION;
b.抛出异常
    RAISE exception_name
c.捕获及处理异常
    EXCEPTION
        WHEN e_name1 [OR e_name2 ... ] THEN
            statements;
        WHEN e_name3 [OR e_name4 ... ] THEN
            statements;
            ......
        WHEN OTHERS THEN
            statements;
3.异常使用
a.预定义异常
    DECLARE
      V_ENAME EMP.ENAME%TYPE;
    BEGIN
      SELECT ENAME INTO V_ENAME FROM EMP WHERE DEPTNO = &DNO;
    EXCEPTION
      WHEN TOO_MANY_ROWS THEN
        DBMS_OUTPUT.PUT_LINE('Too many rows are returned');
    END;
b.非预定义异常
    非预定义异常使用的基本过程
    定义一个异常名
    将异常名与异常编号相关联
    在异常处理部分捕捉并处理异常    
    DECLARE
      E_DEPTID EXCEPTION;
      PRAGMA EXCEPTION_INIT(E_DEPTID, -2292);
    BEGIN
      DELETE FROM DEPT WHERE DEPTNO = 10;
    EXCEPTION
      WHEN E_DEPTID THEN
        DBMS_OUTPUT.PUT_LINE('at sub table have record!');
    END;
c.自定义异常
    自定义异常与Oracle错误没有任何关系,有开发人员为特定情况所定义的例外    
    定义异常(在declare部分进行定义)
    显示触发异常(在执行BEGIN部分触发异常,使用RAISE语句)
    引用异常(在EXCEPTION部分捕捉并处理异常)
    DECLARE
      E_INTEGRITY EXCEPTION;
      PRAGMA EXCEPTION_INIT(E_INTEGRITY, -2291);
      E_NO_EMPLOYEE EXCEPTION;
    BEGIN
      UPDATE EMP SET DEPTNO = &DNO WHERE EMPNO = &ENO;
      IF SQL%NOTFOUND THEN
        RAISE E_NO_EMPLOYEE;
      END IF;
    EXCEPTION
      WHEN E_INTEGRITY THEN
        DBMS_OUTPUT.PUT_LINE('The dept is not exists');
      WHEN E_NO_EMPLOYEE THEN
        DBMS_OUTPUT.PUT_LINE('The employee is not exists');
    END;    
d.使用异常函数处理异常           
    函数SQLCODE用于取得Oracle错误号
    函数SQLERRM用于取得与错误号对应的相关错误消息*/
    undef v_sal
    declare
        v_ename emp.ename%type;
        begin
            select ename into v_ename from emp
            where sal=&&v_sal;
            dbms_output.put_line('Employee Name:'||v_ename);
    exception
        when no_data_found then
            dbms_output.put_line('The employee is not exists for salary '||&v_sal);
        when others then
            dbms_output.put_line('Error No:'||SQLCODE);
            dbms_output.put_line(SQLERRM);
    end;    
    RAISE_APPLICATION_ERROR:将应用程序专有的错误从服务器端转达到客户端    
    RAISE_APPLICATION_ERROR(error_number,message[,{true | false}]);
    error_number:用于定义错误号,且错误号从-20000 到-20999 之间,以避免与ORACLE 的任何错误代码发生冲突
    message:用于指定错误消息,且消息长度不能超过k,超出部分将被截取
    CREATE OR REPLACE PROCEDURE RAISE_COMM(V_NO   EMP.EMPNO%TYPE,
                                           V_COMM OUT EMP.COMM%TYPE) AS
    BEGIN
      SELECT COMM INTO V_COMM FROM EMP WHERE EMPNO = V_NO;
      IF V_COMM IS NULL THEN
        RAISE_APPLICATION_ERROR(-20001, 'It is no comm for this employee');
      END IF;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('The employee is not exist');
    END;
4.异常处理
    当发生异常后,程序将在错误处停止,并转到该语句块的末尾搜索是否有异常处理,有则处理,无或者异常不匹
配,则跳出当前可执行语句块,到外层语句块末尾找异常处理,否则交给操作系统处理。

动态,静态sql

转载于:https://my.oschina.net/peakfang/blog/2245388

oracle 对象管理 07_PLSQL基础与异常相关推荐

  1. oracle 对象管理 01_用户及权限

    2019独角兽企业重金招聘Python工程师标准>>> 一.用户管理 1.创建用户(可带用户的profile文件,对用户的约束信息)     CREATE USER username ...

  2. 触发器与job的配合使用oracle,oracle 对象管理 10_触发器job

    一.触发器相关概念 1.触发器分类 a.DML触发器:对DML语句进行触发(表上进行DML操作前BEFORE.后AFTER) b.INSTEAD OF 触发器:只适用于视图(复杂视图上DML),不能指 ...

  3. oracle对象管理及使用实验报告,oracle对象管理常用操作(objects management)

    一.creating a table --创建表 create table computer_systems( computer_system_id  number(38, 0) not null, ...

  4. Oracle数据库模式对象管理

    实验四 Oracle数据库模式对象管理 一.预习报告 一. 实验目的 1) 掌握表的创建与管理. 2) 掌握索引的创建与管理. 3) 掌握视图的创建与管理. 4) 掌握序列的创建与管理. 5) 了解簇 ...

  5. unity 引用prefab_Unity基础教程-对象管理(二)——对象多样化(Fabricating Shapes)...

    200+篇教程总入口,欢迎收藏: 放牛的星星:[教程汇总+持续更新]Unity从入门到入坟--收藏这一篇就够了​zhuanlan.zhihu.com 本文重点: 1.为形状创建一个工厂 2.保存和加载 ...

  6. ORACLE甚而,PL/SQL基础

    Oracle PL/SQL语言基础 PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用 ...

  7. Oracle PL/SQL语句基础学习笔记(上)

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...

  8. Oracle用户管理学习总结

    Oracle 用户管理 一.用户的概念 用户,即user,通俗的讲就是访问oracle数据库的"人".在oracle中,可以对用户的各种安全参数进行控制,以维护数据库的安全性,这些 ...

  9. Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理

    1.为什么学习oracle? 性能优越: 小型数据库 中型数据库 大型数据库 acess.foxbase mysql.sql server.informix sybase.oracle.db2 复杂量 ...

最新文章

  1. 剑指offer: 面试题03. 数组中重复的数字
  2. YOLOv5在建筑工地中安全帽佩戴检测的应用
  3. 用python描述车_使用Python探索二手车市场(含代码)
  4. python lol脚本_配台电脑,能玩LOL顶配和能够写一些python脚本能用ps不卡,预算6k到8k?...
  5. Java设计模式(十五):桥接设计模式
  6. Linux驱动编程中EXPORT_SYMBOL()介绍
  7. html语言中的转行标记是6,网页设计与制作模拟试题
  8. primefaces_懒惰的JSF Primefaces数据表分页–第1部分
  9. 函数调用关系图如何画_彩铅画入门植物教程 | 如何用彩铅画一株多肉?多肉彩铅画教程步骤图详细...
  10. python self 值自动改变_Python,为什么传递和更改带有外部函数的类selfvariable用于操作iterable而不是变量...
  11. 我佛了!用 KNN 实现验证码识别,又 Get 到一招
  12. SQLServer2008R2精简版使用
  13. mybatisplus的逻辑删除
  14. HTTP协议:无状态协议
  15. Python-QQ聊天记录分析-jieba+wordcloud
  16. 佳文分享:我个人比较受用的一些习惯
  17. 20172327 2017-2018-2 《程序设计与数据结构》第十一周学习总结
  18. 我如何在1年内在YouTube上从0到70k的订阅者流失-以及我赚了多少钱
  19. 群论:李群(Lie Group)和几种经典李群
  20. (每日水题004-1)(DP,滚动数组)洛谷P1508 Likecloud-吃、吃、吃

热门文章

  1. quill鼠标悬浮 出现提示_jQuery实现鼠标悬停显示提示信息窗口的方法
  2. tensorflow 转张量类型为float_TensorFlow是什么?怎么用?终于有人讲明白了
  3. 孤傲授权系统网站源码
  4. 前端开发知识点解答-HTML-面试
  5. Mock数据,语法规范
  6. java 日志管理源码_Java源码初探_logging日志模块实现
  7. 新服务器打包运营级价值几千的H5商城源码
  8. DWZMVC的探索系列——给列表穿上DWZ华丽的外衣
  9. 移动项目开发笔记(管理不同解决方案下的DLL文件相互引用之心得体会)
  10. 渗透之cookie截取