`
Luob.
  • 浏览: 1592601 次
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle 顺序控制,异常处理,动态sql

阅读更多
-----------------顺序控制--------------------
    --1.  GOTO语句  :用于跳转到特定标记号去执行语句  (使可读性变差)
    --2. null 语句 :不会执行任何操作,并直接将控制传递下一条语句   (使可读性变强)
          --示例1
            Declare
                   v_sal emp.sal%type;
                   v_name emp.ename%type;
            Begin
                   select sal,ename into v_sal,v_ename from emp where empno=&empno;
                   if v_sal<3000 then
                      update emp set comm=sal*0.1 where ename=v_ename;
                   else
                      null;
                   end if;
            END;



      
---------------------异常处理--------------------
  
  -- 语法
    Exception
      when  异常错误的名称1 [or 异常错误名称2...] then
            执行语句1;
      when  异常错误的名称3 [or 异常错误名称4...] then
            执行语句2;
      when others then
            执行语句3;
  --示例1
   declare
       v_dept_row dept%rowtype;  --定义变量,用于保存dept表的相关信息
   begin
       select * into v_dept_row form dept;  --查询dept中的所有记录 将触发too_mang_rows 异常;
       --向dept表总插入数据, 会违反主键唯一约束, 会触发 DUP_val_on_index 异常
       insert into dept values(10,'product','china');  --
   Exception
      when too_many_rows then
          Dbms_Output.put_line('返回了多行,请使用游标来处理多行记录的集合!');
      when DUP_val_on_index then
          Dbms_Output.put.line('主键不能重复!');
   END;
         
-----------------自定义异常--------------------------

   --示例1  
    declare
         ept_no_emp Exception;
    Begin
         update emp set comm=case when comm is null then 50 else comm*1.1 end where empno=&empno;
       
       If sql%notfound then 
          raise ept_no_emp ;   --如果没有数据更新 就抛出异常 使用raise;
       else
          DBMS_output.put_line('奖金已经更新了!');  
    Exception
       when ept_no_emp then
           Dbms_Output.put_line('该员工编号不存在!');       
    
    END;






--开发动态SQL
   declare 
       type Create_table_record is record
       (
          filed_name varchar2(15),
          filed_type varchar2(15),
          filed_explain varchar2(15)
       );
       type Dynamic_sql_table is table of Create_table_record index by binary_integer;
       
       v_dynamic_sql_table_name Dynamic_sql_table;
    
       v_create_table_name varchar2(20);
       v_dynamic_ddl_sal varchar2(500);
       v_dynamic_dcl_sal varchar2(500);
       v_grant_user varchar2(10);
       v_grant_authority varchar2(10);
  Begin
       v_create_table_name:='STUD';
       v_grant_user:='scott';
       v_grant_authority:='select';
       v_dynamic_sql_table(0).field_name:='sid';
       v_dynamic_sql_table(0).field_type:='varcar2(10)';
       v_dynamic_sql_table(0).field_explain:='primary key';
       
       v_dynamic_sql_table(1).field_name:='sname';
       v_dynamic_sql_table(1).field_type:='varcar2(10)';
       v_dynamic_sql_table(1).field_explain:='not null';
       
       v_dynamic_sql_table(2).field_name:='sclass';
       v_dynamic_sql_table(2).field_type:='varcar2(10)';
       v_dynamic_sql_table(2).field_explain:='not null';
       
       v_dynamic_ddl_sql:='create table'||v_create_table_name||chr(13)||'('||chr(13);
       for i in 1..v_dynamic_sql_table.count-1 
           Loop
               v_dynamic_ddl_sql:=v_dynamic_ddl_sql||v_dynamic_sql_table(i).field_name ||' '||
               v_dynamic_sql_table(i).field_type || ' '||v_dynamic_sql_table(i).field_explain ||','||chr(13);
           End lOOP;
       v_dynamic_ddl_sql:=substr(v_dynamic_ddl_sql,0,lenth(v_dyname_ddl_sql)-2);
       v_dynamic_ddl_sql:=v_dynamic_ddl_sql||chr(13)||')';
       v_dynamic_dcl_sql:='grant'||v_grant_authority||'on'||c_create_table_name||'to'||v_grant_user;
       
       execute immediate v_dynamic_ddl_sql;
       execute immediate v_dynamic_dcl_sql;
  End;
  
--处理无占位符和returning子句的DML语句
   --示例1
     declare 
         v_dynamic_sql varchar2(100);
     begin
         v_dynamic_sql:='Update emp set sal=sal*1.1 where deptno=30';
         execute immediate v_dynamic_sql;
     END;
     
     
   --示例2
     declare
         v_dynamic_sql varchar2(100);
     begin
         v_dynamic_sql:='update emp set sal=sal*(1+:percent/100.0) where deptno=:deptno';
         execute immediate v_dynamic_sql Using &percent,&deptno;
     END;
     
   --示例3
     declare 
         v_dynamic_sql varchar2(100);  --存储SQL语句的变量
         v_sal number(7,2);   --存储工资的变量
         v_empno number(4):=&deptno;  --接受用户输入的编号变量
         v_percent number(2):=&percent;   --定义增加员工工资的百分比变量
      Begin
         select sal into v_sal from emp where empno=v_empno; --查询更新前的个工资
         DBMS_OUTPUT.put_line('更新前的工资'||v_sal);  --输出
         
         --要执行的sql 语句 并返回 跟新后的 sal  
         v_dynamic_sql:='update emp set sal=sal*(1+:percent/100.0)' where empno=:empno returning sal into :sal;
         
         
         --执行定义的sql语句  并使用returning into 接受放回的值;
         execute immediate v_dyname_sql using v_percent,v_empno returning into v_sal;
         Dbms_Output.put_line('增长率:'||v_percent||'%');
         Dbms_Output.put_line('新工资:'||v_sal);
         
      END;
      
    --示例4   --处理单行查询语句
       declare
          v_dynamic_sql varchar2(100);   
          emp_record emp%rowtype;
       begin
          v_dynamic_sql:='select * from emp where empno=:empno';
          execute immediate v_dynamic_sql into emp_record using &empno;
          DBMS_output.put_line('雇员:'||emp_record.ename||'的工资是:'||emp_record_sal);
         
    --示例5  是用Bulk collect 
      declare 
           type emp_ename_table Is table of emp.ename%type index by binary_integer;  --一个列类型
           v_emp_ename_table emp_ename_table;  --一个列类型的变量
           v_dynamic_sql varchar2(100);  --保存要执行的sql语句
      begin
          v_dynamic_sql:='select ename from emp where deptno=:deptno';   --给变量赋值
          execute immediate v_dynamic_sql bulk collect into v_emp_enam_table using &deptno;
          for i in 1..v_emp_ename_table.cont 
              LOOP
                  dbms_output.put_line(v_emp_ename_table(i));
              END loop;
      END;
      
     
分享到:
评论

相关推荐

    Oracle SQL 官方文档

    此文档详细介绍了PL/SQL的各种元素,如变量、常量、条件语句(IF-THEN-ELSIF)、循环(WHILE, FOR)、异常处理(BEGIN-EXCEPTION-END)、游标和存储过程。此外,还涵盖了PL/SQL块的结构、子程序(函数和过程)以及...

    Oracle PL SQL程序设计 上 第五版(代码示例)

    《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

    NC的Oracle优化及异常数据处理

    本篇文档详细介绍了SQL优化的本质、途径以及异常数据处理的方法,对于从事Oracle数据库管理的工程师来说,具有较高的实用价值。 首先,文档阐述了SQL优化的本质,即缩短数据库查询的响应时间、提升系统的吞吐量和...

    oracle通过sql实现字符串转数字oracle函数

    在Oracle数据库中,将字符串转换为数字是一项常见的操作,特别是在处理包含数字的字符串列时,可能需要进行数值计算或按照数值大小进行排序。本篇文章将深入探讨如何在SQL查询中利用Oracle提供的函数来实现这一目标...

    Oracle游标和异常处理的应用.doc

    实验报告的主题集中在游标和异常处理,这是Oracle编程中两个关键的概念。游标用于遍历和操作查询结果集,而异常处理则确保在遇到错误时程序能够优雅地恢复或提供反馈。 一、游标的应用 1. 隐式游标: Oracle数据库...

    ORACLE 异常处理总结.doc

    Oracle 异常处理是PL/SQL编程中的关键组成部分,它允许开发者优雅地处理程序执行过程中可能出现的错误,确保系统的稳定性和可靠性。异常处理是通过异常情况(EXCEPTION)和异常处理器(EXCEPTION HANDLER)来实现的...

    Oracle PL/SQL by Example(4th Edition)

    PL/SQL是Oracle数据库提供的一个内置编程语言,它将SQL的查询能力与过程编程语言的控制结构相结合,使得开发者能够创建复杂的数据处理逻辑和业务规则。在本书中,你将了解到: 1. **基础语法**:学习PL/SQL的基本...

    Oracle PL SQL程序设计 上 第五版part1

    《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

    Oracle PL SQL程序设计 上 第五版part2

    《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

    基于Oracle的SQL优化典型案例分

    在数据库管理领域,Oracle是一种广泛使用的高性能关系型数据库系统,其强大的功能和高效的数据处理能力深受企业青睐。然而,随着数据量的增长,SQL查询的性能优化成为了一个关键问题。本篇将深入探讨“基于Oracle的...

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    探讨了数据类型、条件控制语句和顺序控制语句、循环、异常处理、安全特性、全球化和本地化问题, 以及PL/SQL架构。 ? 通过使用过程、函数、触发器和包,建立模块化的PL/SQL应用。 内容推荐 《Oracle PL/SQL程序...

    Oracle 8i PL_SQL高级程序设计.rar

    1. **PL/SQL基本结构**:PL/SQL是由声明部分、执行部分和异常处理部分组成的。声明部分定义变量、游标、过程和函数;执行部分包含业务逻辑;异常处理部分用于捕获和处理运行时错误。 2. **PL/SQL数据类型**:包括...

    14oracle的PL/SQL编程-控制结构 PPT

    在PL/SQL中,控制结构是实现程序流程控制的关键元素,它们决定了代码的执行顺序和条件。以下是关于PL/SQL控制结构的一些详细解释: 1. **条件语句** - 主要有`IF...THEN...ELSIF...ELSE`结构,用于基于不同的条件...

    Oracle PL/SQL程序设计(第5版)(下册) 第一部分

    探讨了数据类型、条件控制语句和顺序控制语句、循环、异常处理、安全特性、全球化和本地化问题, 以及PL/SQL架构。 ? 通过使用过程、函数、触发器和包,建立模块化的PL/SQL应用。 内容推荐 《Oracle PL/SQL程序...

    10g oracle SQL Reference

    在Oracle 10g中,SQL还包括高级特性,如子查询、联接操作、集合操作、游标、事务控制和异常处理。子查询可以在查询中嵌套,以获取更复杂的查询结果。联接操作如`JOIN`、`CROSS JOIN`、`LEFT JOIN`、`RIGHT JOIN`和`...

    Oracle PL/SQL

    通过控制块流程,开发者可以精确地控制程序的执行顺序,处理各种可能的条件和异常情况。 总的来说,Oracle PL/SQL是Oracle数据库系统中不可或缺的一部分,它提供了丰富的编程特性,使得数据库管理和应用开发更加...

    oracle/pl/sql编程

    综上所述,Oracle PL/SQL编程涉及的内容广泛且深入,从基本的语法和数据类型,到复杂的控制结构、数据处理和错误处理机制,它是构建高效、稳定的Oracle数据库应用程序的基础。通过深入学习和实践,开发者可以充分...

    Oracle plsql 基础ppt

    PL/SQL程序块结构严格遵循声明、执行和异常处理的顺序,并可以嵌套在其他块中。注释使用`--`表示单行注释,`/* */`表示多行注释。标识符的规则是字母开头,后面可跟字母、数字、货币符号、下划线等,但不允许某些...

    Oracle数据库实用教程第三章PL/SQL程序设计.pptx

    PL/SQL程序按照声明-执行-异常处理的顺序执行,异常处理部分用于捕获和处理运行时错误。 **3.6 异常处理** 使用`EXCEPTION`关键字来捕获和处理异常,如`WHEN OTHERS THEN`可以捕获所有未明确处理的异常。 **3.7 ...

    pl sql oracle教程

    Oracle PL/SQL是一种强大的数据库编程语言,它结合了SQL(结构化查询语言)的查询功能和过程性编程语言的控制结构。这篇教程旨在帮助你掌握Oracle数据库中的PL/SQL编程,提升你的数据库管理和开发能力。 **第二章 ...

Global site tag (gtag.js) - Google Analytics