`

qlsql 学习实例代码2

阅读更多
--------------------------------创建过程 procedure

create or replace procedure myprocedure(id in number)  --参数的数据类型不跟字符类型的大小
is                           ---is == as
name varchar2(10);           ---过程里面声明的字符类型后面必须跟上字符类型的大小。
begin
  select ename into name from emp where empno = id;
  dbms_output.put_line(name);
 
end myprocedure;

execute myprocedure(7369);       -----命令控制台执行过程


create or replace procedure myproc2(id in number,name out varchar2) is
begin
  select ename into name from emp where empno = id;
  dbms_output.put_line(name);
end myproc2;


SQL> declare                     -----命令控制台执行过程
  2  tid number;
  3  tname varchar2(10);
  4  begin
  5  tid := 7369;
  6  myproc2(7369,tname);
  7  end;
  8  /

SMITH

PL/SQL procedure successfully completed

------------------------------------------------- 定义函数 function

create or replace function get_salary(dept_no in number,emp_count out number)
return number is
  V_sum number;
begin
  select sum(sal),count(*) into V_sum,emp_count from emp where deptno=dept_no;
  return V_sum;
exception
  when no_data_found then
  dbms_output.put_line('你需要的数据不存在');
  when others then
  dbms_output.put_line(sqlcode||'---'||sqlerrm); 
end get_salary;

SQL> declare                -----命令控制台执行定义的函数
  2  v_num number;
  3  v_sum number;
  4  begin
  5  v_sum := get_salary(10,v_num);      ---可以这样传递参数:v_sum := get_salary(dept_no => 10,emp_count => v_num);
  6  dbms_output.put_line('10号部门工资总和:'||v_sum||',people:'||v_num);
  7  end;
  8  /

10号部门工资总和:8750,people:3

PL/SQL procedure successfully completed

------------------------------------------------游标

游标是一个指向上下文的句柄(handle)或指针。

对于不同的SQL语句,游标的使用情况不同

SQL语句                            游标

非查询语句                       隐式游标
结果是单行的查询语句             隐式游标或显示游标
结果是多行的查询语句             显示游标


游标的声明部分是唯一可以出现在模块声明部分中的步骤
在声明部分的末尾声明游标



SQL> declare
  2  v_ename emp.ename%type;
  3  v_sal emp.sal%type;
  4  cursor c_cursor is select ename,sal from emp where rownum < 8;    ----定义一个游标
  5  begin
  6  open c_cursor;                         ---打开游标
  7  fetch c_cursor into v_ename,v_sal;       -----提前游标工作区域中的数据集合
  8  while c_cursor %found  loop
  9  dbms_output.put_line(v_ename||'----'||to_char(v_sal));
10  fetch c_cursor into v_ename,v_sal;
11  end loop;
12  close c_cursor;                ----关闭游标
13  end;
14  /

SMITH----800
ALLEN----1600
WARD----1250
JONES----2975
MARTIN----1250
BLAKE----2850
CLARK----2450

PL/SQL procedure successfully completed

==============
   显示游标属性                        描述

%found                 布尔型属性,当最近一次读记录时成功返回,则值为true;

%notfound              布尔型属性,与%found相反

%isopen                 布尔型属性,当游标已打开时返回true

%rowcount               数字型属性,返回已从游标中读取的记录数

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

==============
   隐式游标属性                        描述

%found                 布尔型属性,当最近一次读记录时成功返回,则值为true;

%notfound              布尔型属性,与%found相反

%isopen                 布尔型属性,取值总是false,sql命令执行完毕立即关闭隐式游标。

%rowcount               数字型属性,返回已从游标中读取的记录数

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

----------------------------处理隐式游标

SQL> declare
  2  v_deptno emp.deptno%type := &p_deptno;
  3  begin
  4  delete from emp where deptno = v_deptno;
  5  if sql%notfound then
  6  delete from dept where deptno=20;
  7  end if;
  8  end;
  9  /

PL/SQL procedure successfully completed            -----不要忘记commit

-----------------------------------------------------游标检索循环
SQL> declare
  2  v_empno emp.empno%type;
  3  v_sal   emp.sal%type;
  4  cursor c_cursor is select empno,sal from emp;
  5  begin
  6  open c_cursor;
  7  loop
  8    fetch c_cursor into v_empno,v_sal;
  9    exit when c_cursor %notfound;
10    if v_sal <= 1000 then
11       update emp set sal = sal +50 where empno = v_empno;
12       dbms_output.put_line('编码为'||v_empno||'工资已更新');
13     end if;
14     dbms_output.put_line('记录数为'||c_cursor %rowcount);
15  end loop;
16  close c_cursor;
17  end;
18  /

编码为7369工资已更新
记录数为1
记录数为2
记录数为3
记录数为4
记录数为5
记录数为6
记录数为7
记录数为8
记录数为9
记录数为10
记录数为11
编码为7900工资已更新
记录数为12
记录数为13
记录数为14

PL/SQL procedure successfully completed
--------------------------------------------------------------游标的for循环

SQL> declare
  2  cursor c_sal is select empno,ename,sal from emp;
  3  begin
        --隐含打开游标
  4     for v_sal in c_sal loop
        --隐含执行一个fetch语句
  5     dbms_output.put_line(to_char(v_sal.empno)||'---'||v_sal.ename||'---'||to_char(v_sal.sal));
        --隐含监测c_sal%notfound
  6     end loop;
        --隐含关门游标
  7  end;
  8  /

7369---SMITH---850
7499---ALLEN---1600
7521---WARD---1250
7566---JONES---2975
7654---MARTIN---1250
7698---BLAKE---2850
7782---CLARK---2450
7788---SCOTT---3000
7839---KING---5000
7844---TURNER---1500
7876---ADAMS---1100
7900---JAMES---1000
7902---FORD---3000
7934---MILLER---1300

PL/SQL procedure successfully completed

---------------------------------------------------------带参数的游标的for循环

SQL> declare
  2  cursor c_cursor(dept_no number default 10)is
  3  select dname,loc from dept where deptno <= dept_no;
  4  begin
  5  dbms_output.put_line('dept_no 参数值为30:');
  6  for c1_rec in c_cursor(30) loop
  7    dbms_output.put_line(c1_rec.dname||'---'||c1_rec.loc);
  8  end loop;
  9  dbms_output.put_line(chr(10)||'dept_no 参数值为10:');
10  for c1_rec in c_cursor(10) loop
11    dbms_output.put_line(c1_rec.dname||'---'||c1_rec.loc);
12  end loop;
13  end;
14  /

dept_no 参数值为30:
ACCOUNTING---NEW YORK
RESEARCH---DALLAS
SALES---CHICAGO

dept_no 参数值为10:
ACCOUNTING---NEW YORK

PL/SQL procedure successfully completed
-------------------------------------------------------for update 游标锁定
SQL> declare
  2  v_deptno emp.deptno%type :=&p_deptno;
  3  cursor emp_cursor is
  4  select empno,sal from emp where deptno = v_deptno FOR UPDATE NOWAIT;   --当加上NOWAIT子句时,
                                                                            --如果这些行真的被另一个会话锁定,
                                                                            --则open立即返回并给出错误提示:
                                                                            --ORA-0054:resource busy and acquire with nowait specified
  5  begin
  6    for emp_rec in emp_cursor loop
  7       if emp_rec.sal < 1500 then
  8         update emp set sal=1500 where current of emp_cursor;
  9       end if;
10    end loop;
11  end;
12  /

PL/SQL procedure successfully completed
--------------------------------------------------------游标变量的应用    游标变量类型无返回值

SQL> declare
  2  type emp_cursor_type is ref cursor;          ---定义游标变量类型的名称
  3  emp_cursor emp_cursor_type;                  ---声明一个变量为游标变量类型(无返回值)
  4  emp_record emp%rowtype;                      ---定义一个与表字段 字段类型相同的一个记录 
  5  begin
  6    open emp_cursor for select * from emp where deptno = 10;    ---打开游标变量 open ... for
  7    loop
  8      fetch emp_cursor into emp_record;
  9      exit when emp_cursor%notfound;
10      dbms_output.put_line('第'||emp_cursor%rowcount||'个雇员:'||emp_record.ename);
11    end loop;
12  close emp_cursor;
13  end;
14  /

第1个雇员:CLARK
第2个雇员:KING
第3个雇员:MILLER

PL/SQL procedure successfully completed

--------------------------------------------------------游标变量的应用    游标变量类型有返回值
SQL> declare
  2  type emp_record_type is record(
  3     name varchar2(10),salary number(6,2));
  4  type emp_cursor_type is ref cursor return emp_record_type;         -- 有返回值的游标变量类型  那么select语句的返回结果必须与return的结果类型想匹配。
  5  emp_cursor emp_cursor_type;
  6  emp_record emp_record_type;
  7  begin
  8  open emp_cursor for select ename,sal from emp where deptno = 20;
  9  loop
10    fetch emp_cursor into emp_record;
11    exit when emp_cursor%notfound;
12      dbms_output.put_line('第'||emp_cursor%rowcount||'个雇员:'||emp_record.name);
13  end loop;
14  close emp_cursor;
15  end;
16  /

第1个雇员:SMITH
第2个雇员:JONES
第3个雇员:SCOTT
第4个雇员:ADAMS
第5个雇员:FORD

PL/SQL procedure successfully completed
-------------------------------------------------------------

==========================================包定义
create or replace package demo_pack is

  deptrec dept%rowtype;
 
  function add_dept(
     dept_no number,dept_name varchar2,location varchar2)
     return number;
  function remove_dept(dept_no number)
     return number;
  procedure query_dept(dept_no in number);     
end demo_pack;

=============================================  包主体  实行function和procedure
create or replace package body demo_pack is

  function add_dept(
     dept_no number,dept_name varchar2,location varchar2)
     return number 
   is
     empno_remaining exception;                 -----自定义一个异常
     pragma exception_init(empno_remaining,-1);
    begin
      insert into dept values(dept_no,dept_name,location);
      if sql%found then
      return 1;
      end if;
    exception
       when empno_remaining then
       return 0;
       when others then
       return -1;
     end add_dept;
     function remove_dept(dept_no number)
        return number
     is
     begin
        delete from dept where deptno = dept_no;
        if sql%found then
        return 1;
        else
        return 0;
        end if;
     exception
        when others then
        return -1;
     end remove_dept;
     procedure query_dept(dept_no in number)
     is
     begin
       select * into deptrec from dept where deptno = dept_no;
     exception
       when no_data_found then
       dbms_output.put_line('部门:'||dept_no||'不存在');
       when too_many_rows then
       dbms_output.put_line('程序运行错误,请使用游标');
       when others then
       dbms_output.put_line(sqlcode||'---'||sqlerrm);
     end query_dept;                  

end demo_pack;

======================================================命令窗口操作包及里面的function和procedure
SQL> declare
  2  var number;
  3  begin
  4  var := demo_pack.add_dept(90,'administration','beijing');
  5  if var = -1 then
  6    dbms_output.put_line(sqlcode||'---'||sqlerrm);
  7  elsif var = 0 then
  8    dbms_output.put_line('该部门记录已经存在');
  9  else
10    dbms_output.put_line('添加记录成功');
11    demo_pack.query_dept(90);
12    dbms_output.put_line(demo_pack.deptrec.deptno||'--'||demo_pack.deptrec.dname||'--'||demo_pack.deptrec.loc);
13    var := demo_pack.remove_dept(90);
14    if var = -1 then
15    dbms_output.put_line(sqlcode||'---'||sqlerrm);
16    elsif var = 0 then
17    dbms_output.put_line('该部门记录不存在');
18    else
19    dbms_output.put_line('删除记录成功');
20    end if;
21  end if;
22  end;
23  /

添加记录成功
90--administration--beijing
删除记录成功

PL/SQL procedure successfully completed







































































































1
0
分享到:
评论

相关推荐

    plsql语法编程实例

    本资料包“plsql语法编程实例”提供了一系列SQL基础语法和PL/SQL编程实例,对于学习和掌握这一技能非常有帮助。 首先,SQL(Structured Query Language)是关系型数据库管理系统中用于管理和处理数据的标准语言。其...

    plsql代码和学习资料

    总的来说,"PLSQL_code"压缩包中的内容可能是对PLSQL编程语言和Oracle 11g数据库管理系统的实战教程和实例代码,对于想深入了解和提升这方面技能的学习者来说,是非常宝贵的资源。通过深入学习和实践,你可以成为一...

    Oracle PLSQL实例精解(英文原书第4版)

    《Oracle PLSQL实例精解(英文原书第4版)》是Oracle数据库开发领域的一本经典著作,专注于讲解PL/SQL编程语言的应用。PL/SQL是Oracle数据库系统中用于处理结构化查询语言(SQL)的编程环境,它扩展了SQL的功能,使...

    PLSQL学习笔记(1-7)

    本“PLSQL学习笔记”将逐步讲解这些概念,通过实例和练习帮助读者巩固理解,进一步提升在Oracle数据库开发中的技能。无论你是初学者还是有经验的开发者,这份笔记都能提供有价值的参考。通过深入学习和实践,你将...

    PLSQL编程学习资料

    例如,实例2和实例3展示了如何定义一个简单的PLSQL块,包括变量声明、查询和异常处理。 2. **变量声明**: 变量在PLSQL中使用`DECLARE`关键字进行声明,如`v_ename VARCHAR2(5)`和`v_sal emp.sal%TYPE`。`emp.sal%...

    ORACLE PLSQL实例精解(第4版) 中文版

    ### ORACLE PL/SQL 实例精解(第4版)知识点概述 #### 一、PL/SQL基础 **1.1 PL/SQL简介** - **定义**:PL/SQL(Procedural Language for SQL)是一种过程化语言,专门用于增强Oracle数据库的功能。它将SQL命令与...

    PLSQL学习基础课件PPT

    本PLSQL学习基础课件PPT旨在为初学者提供深入浅出的教程,帮助他们掌握这一强大的数据库编程工具。 首先,我们要了解PLSQL的基本结构,它由声明部分、执行部分和异常处理部分组成。声明部分包括变量、常量、游标、...

    plsql建表实例.txt

    59. **`DISCOUNT_CODE CHAR(2)`**: 折扣代码,长度为2个字符。 60. **`CHILD_PUBLISHED_FBC CHAR(15)`**: 儿童已发布FBC,长度为15个字符。 61. **`INFANT_PUBLISHED_FBC CHAR(15)`**: 婴儿已发布FBC,长度为15个...

    Oracle PLSQL语法大全及实例讲解.pdf

    Oracle PL/SQL是一种强大...通过学习和实践这些基本概念,你可以构建复杂的PL/SQL程序来管理Oracle数据库中的数据,进行数据处理和业务逻辑实现。了解并熟练掌握这些知识点对于任何Oracle数据库开发者来说都至关重要。

    PLSql循序渐进全面学习教程

    10. **PLSql调试和错误处理**:学习如何使用Oracle的调试工具,以及如何编写健壮的错误处理代码,能帮助你快速定位和解决问题。 11. **数据库链接**:数据库链接允许你在不同的Oracle实例之间进行通信,这对于...

    ORACLE_PLSQL专家指南代码

    通过深入研究这个指南中的代码实例,你可以深化对PL/SQL的理解,提升解决实际问题的能力。同时,理解数据库的内部工作原理,如何有效地与SQL交互,以及如何利用PL/SQL提供的高级功能,都是成为一个真正Oracle PL/SQL...

    PLSQL学习资料

    学习保存程序的最佳实践,确保代码安全,便于后期修改和复用。 ##### 3.3 修改程序 熟悉编辑功能,如查找替换、代码折叠等,提高代码编辑效率。 ##### 3.4 编译程序 理解编译过程,识别并解决语法错误,确保代码...

    oracle-PLSQL实例精析

    2. **异常处理**:学习如何用EXCEPTION块来捕获和处理运行时错误,增强程序的健壮性。 3. **游标**:掌握游标的使用,包括声明、打开、关闭和提取记录,以及游标变量和FOR循环中的游标应用。 4. **存储过程和函数*...

    PLSQL教程

    在PLSQL的学习过程中,"源码"可能是指编写和执行的存储过程、函数、触发器等代码片段,而"工具"可能指的是PLSQL Developer这样的集成开发环境,它为编写、调试和管理PLSQL代码提供了便利。 在压缩包中的两个文件名...

    PLSQL操作ORALCE数据库

    在PLSQL中,可以声明各种内置数据类型,如NUMBER、VARCHAR2、DATE等。变量可以用来存储数据,而常量则是不可改变的值。此外,还可以定义记录类型和数组,以适应更复杂的数据结构需求。 三、控制流语句 PLSQL支持...

    PLSQL学习基础资料

    本文将深入探讨"PLSQL学习基础资料"中的关键知识点,旨在为初学者提供一个全面的入门指南。 首先,让我们从"Oracle-SQL语言基础"开始。SQL(Structured Query Language)是用于查询、更新和管理关系数据库的标准...

    Oracle PLSQL实例精解(原书第4版) 源码下载

    《Oracle PLSQL实例精解(原书第4版)》是一本深入探讨Oracle数据库编程语言PL/SQL的专业书籍。此书旨在帮助读者掌握PL/SQL的精髓,通过丰富的实例和详细解析,提升在Oracle数据库环境中的开发能力。作者在书中不仅...

    PLSQL电子书小合集

    这个“PLSQL电子书小合集”显然是一个包含了关于PLSQL学习资料的压缩包,可能包括教程、指南、实战案例等内容,对于想要深入理解和掌握PLSQL的用户来说非常有价值。 PLSQL的主要组成部分包括声明部分、执行部分和...

    PLSQL Developer

    2. **PLSQL Developer功能** - **代码编辑**:提供语法高亮、自动完成、代码折叠等特性,提升编码效率。 - **调试工具**:内置调试器支持断点、单步执行、查看变量值等功能,便于调试和定位问题。 - **数据库连接...

Global site tag (gtag.js) - Google Analytics