oracle-游标-存储过程-函数-包

一、存储过程
不可以在insert,update,delete中直接使用,可以有return但代表的是退出过程
过程有三种类型:不返回值,可以返回多个值,参数有三种类型,分别如下:
        in:只输入,不返回结果,默认为in
        out:只返回结果,不输入,要想取出输出变量的值必须通过pl/sql块的变量取出
        in  out:可输入,又可返回结果,要想取出输出变量的值必须通过pl/sql块的变量取出
    --语法
    create or replace procedure 名称(a1 in varchar2,a2 out varchar2,a3 in out int)
        as 

        begin

        end;
    --测试in
        create or replace procedure getSex1(p_customerName in varchar2)
        as
            v_sex varchar2(20);
        begin
            select sex into v_sex from customer where customerName=p_customerName;
            dbms_output.put_line(v_sex);
        end;
    --测试out
      create or replace procedure getSex2(p_customerName in varchar2,p_sex out varchar2)
        as
        begin
          select sex into p_sex from customer where customerName like p_customerName;
        exception
          when others then raise_application_error(-20001,‘occur error‘);
        end;
    --测试in out
        create or replace procedure getSex3(p_param1 in out varchar2)
        as
        begin
            select sex into p_param1 from customer where customerName=p_param1;
        end;
    --在pl/sql块中执行
        declare
        begin
              getSex1(‘a1‘);
        end;

--在pl/sql块中执行
        declare
            p_sex varchar2(20);
        begin
            getSex2(‘a1‘,p_sex);
            dbms_output.put_line(p_sex);
            getSex2(‘a2‘,p_sex);
            dbms_output.put_line(p_sex);
        end;

        declare
            p_sex varchar2(20);
        begin
            p_sex:=‘a1‘;
            getSex3(p_sex);
            dbms_output.put_line(p_sex);
            p_sex:=‘a2‘;
            getSex3(p_sex);
            dbms_output.put_line(p_sex);
        end;
二、函数:
        只能返回且必须返回一个结果,可以直接用在insert,update,delele,select中
    可以有多个return;
    语法:
        create or replace function 函数名(p1 varchar2) return varchar2
        as
        begin
        exception
        end;
    实例:根据姓名返回姓别
        create or replace function getSex(p_customerName varchar2) return varchar2
        as
            v_sex customer.sex%type;
        begin
            select sex into v_sex from customer where customerName=p_customerName;
            return v_sex;
        end;
执行函数:
        1、在sql(sqlplus)
            select getSex(customerName),sex from customer;
        2、在pl/sql块中
      declare
                v_sex customer.sex%type;
            begin
                v_sex:=getsex(‘a1‘);
                dbms_output.put_line(v_sex);
            end;

存储过程:
                  1.声明处没有return,可以返回多个值,用输出变量(out,in out)返回
                    return代表退出程序,不返回结果.
                  2.不可以在insert,update,delete,select
                    中直接使用,只能通过exec中用
 函数:
                  1.声明处有return,只可以返回一个值,
                    return代表返回一个值.
                  2.可以在insert,update,delete,select
                    中直接使用.

三、触发器
set serveroutput on;
create or replace trigger teacher_trigger after insert or update or delete on customer for each row
begin
dbms_output.put_line(‘the table data already has been modified....‘);
end;

四、游标
        declare
                    v_customer customer%rowtype;
                    v_customerName customer.customerName%type;
                    cursor c1(v_customerName varchar2) is select * from customer     where customerName like v_customerName;
              begin
                    v_customerName:=‘&aa‘;
                    open c1(v_customerName);
                    fetch c1 into v_customer;
                    while(c1%found) loop
                        dbms_output.put_line(v_customer.customerName||‘      ‘||v_customer.sex);
                        fetch c1 into v_customer;
                    end loop;
              end;

五、包
包:包中可以有多个方法,包包括包声明与包主体,包声明中声明的方法名,参数名,类型,个数必须与包主体的方法完全一样。
       包声明中声明的变量是全局变量,大家都可以用
       --实现包声明
create or replace package my_p
as
    function getReverse(v_name varchar2) return varchar2;
    procedure teacher_modify_column(teacher_id number,column_name varchar2,column_value1 number);
end;

create or replace package body my_p
as
procedure teacher_modify_column(teacher_id number,column_name varchar2,column_value1 number)
      is
        v_sql varchar2(200);
      begin
        v_sql:=‘update teachers set  ‘||column_name||‘ =  ‘||column_value1||‘   where teachers.teacher_id =  ‘||teacher_id;
        EXECUTE IMMEDIATE v_sql;
end teacher_modify_column;

function getReverse(v_name varchar2) return varchar2
as
v_title varchar2(200);
i int:=1;
j int:=0;
begin
 j:=length(v_name);
 while (j>0) loop
 v_title:= substr(v_name,i,1)||v_title;
 i:=i+1;
 j:=j-1;
 end loop;
return v_title;
end;
end;

      create or replace package MyPackage as
           type c_type is ref cursor;
           function MyReverse(source varchar2) return varchar2;
           procedure splitPage(p_sql varchar2,page int,pageSize int,result out c_type,pageCount out int);
      end;
       --实现包主体
        create or replace package body MyPackage as
               function MyReverse(source varchar2) return varchar2
               as
                 i int;
                 j int;
                 result varchar2(2000):=‘‘;
               begin
                 j:=length(source);
                 i:=1;
                 while(i<=j) loop
                   result:=substr(source,i,1)||result;
                   i:=i+1;
                 end loop;
                 return result;
               end;
             // 查询语句           页数
               procedure splitPage(p_sql varchar2,page int,pageSize int,result out c_type,pageCount out int)
               as
                 v_sql varchar2(500);
                 startPage int;
                 endPage int;
                 v_rowCount int;
               begin
                 v_sql:=‘select count(*) from (‘||p_sql||‘)‘;
                 dbms_output.put_line(v_sql);
                 execute immediate v_sql into v_rowCount;
                 pageCount:=ceil(v_rowCount/pageSize);
                 if(page=0) then
                   raise_application_error(-20001,‘申请的页面太小‘);
                 end if;
                 if(page>pageCount) then
                   raise_application_error(-20001,‘申请的页面太大‘);
                 end if;
                 startPage:=(page-1)*pageSize;
                 endPage:=page*pageSize;
                 v_sql:=‘select * from (‘||p_sql||‘) where rowNum<=‘||to_char(endPage);
                  v_sql:=v_sql||‘ minus ‘;
                  v_sql:=v_sql||‘select * from (‘||p_sql||‘) where rowNum<=‘||to_char(startPage);
                  dbms_output.put_line(v_sql);
                  open result for v_sql;
              end;
    end;
    --调用包中的方法
        select MyPackage.MyReverse(sex) from customer;
    --在pl/sql块中调用
    declare
      pageCount int;
      c1 mypackage.c_type;
      v_customer customer%rowtype;
    begin
      mypackage.splitPage(‘select * from customer‘,1,2,c1,pageCount);
      dbms_output.put_line(‘总页数是‘||pageCount);
      fetch c1 into v_customer;
      while(c1%found) loop
             dbms_output.put_line(v_customer.customername||‘  ‘||v_customer.sex);
             fetch c1 into v_customer;
      end loop;
      close c1;
      mypackage.splitPage(‘select * from customer‘,2,2,c1,pageCount);
      fetch c1 into v_customer;
      while(c1%found) loop
             dbms_output.put_line(v_customer.customername||‘  ‘||v_customer.sex);
             fetch c1 into v_customer;
      end loop;
      close c1;
      mypackage.splitPage(‘select * from customer‘,3,2,c1,pageCount);
      fetch c1 into v_customer;
      while(c1%found) loop
             dbms_output.put_line(v_customer.customername||‘  ‘||v_customer.sex);
             fetch c1 into v_customer;
      end loop;
      close c1;  

      mypackage.splitPage(‘select * from customer‘,4,2,c1,pageCount);
      fetch c1 into v_customer;
      while(c1%found) loop
             dbms_output.put_line(v_customer.customername||‘  ‘||v_customer.sex);
             fetch c1 into v_customer;
      end loop;
      close c1;
    end;
时间: 2024-07-30 13:57:16

oracle-游标-存储过程-函数-包的相关文章

java下实现调用oracle的存储过程和函数

目录(?)[-] 创建表STOCK_PRICES 插入测试数据 建立一个返回游标 创建和存储过程P_GET_PRICE 创建函数 JAVA调用存储过程返回结果集 开发JAVA调用函数返回结果集 在oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES [cpp] view plaincopy --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR(6) PRIMARY KEY, PRICE NUMBER(7,2), UPDATED D

Oracle开发常用函数与存储过程

create or replace function Fuc_Get_AuthorName(RecID_In in varchar2, AdmID_In in varchar2) return varchar2 is Result varchar2(8000); names varchar2(4000); Cursor Cur_Get_AuthorNameS Is SELECT PEOPLENAME From TB_NEWS_CONTRI_AUTHOR Where REC_ID=RecID_In

oracle存储过程函数

1.函数 create or replace function get_Destroy_no return varchar2 is Result varchar2(50);begin SELECT max(destroy_no) INTO RESULT FROM t_oms_device_destroy WHERE substr(destroy_no,0,8)= to_char( SYSDATE ,'yyyymmdd'); IF (RESULT =''OR RESULT IS NULL) THE

oracle数据库函数和存储过程的包

1.创建包(package)函数:create or replace package 包名 as 函数注意:as后可加多个函数            存储过程:Create or replace package 包名 as 存储过程注意:as后可加多个存储过程 2.包的调用函数的包调用:call 包名.函数名:     存储过程的包调用:call 包名.存储过程名:

oracle的存储过程和函数(PL/SQL)

czmmiao 存储过程概述 存储过程是子程序的一种类型,能够完成一些任务,作为schema对象存储于数据库.是一个有名字的PL/SQL代码块,支持接收或不接受参数,同时也支持参数输出.一个存储过程通常包含定义部分,执行部分,Exception部分,可以被其他子程序调用,也可以被重用.过程定义CREATE [OR REPLACE]PROCEDURE procedure_name[(argument_name [IN | OUT | IN OUT] argument_type)]AS | ISBE

Duang!危险的oracle游标

1.引言 SQL是面向集合的语言,其结果一般是集合量(含多条记录),而pl/sql的变量是标量,一组变量一次只能存放一条记录.很多时候查询结果的记录数是不确定的,无法提前声明足够的变量.于是引入了游标的概念,游标使得数据库操作更灵活,但同时也给黑客入侵数据库带来了机会.安华金和数据库安全实验室(DBSec Labs)基于游标的应用原理,本文讨论游标可能带来什么安全隐患以及如何应对这些安全隐患. 2.游标的分类 oracle数据库游标是Pl/sql执行DQL.DML等语句的时候,oracle在内存

懵懂oracle之存储过程

/* 作为一个oracle界和厨师界的生手,笔者想给大家分享讨论下存储过程的知识,因为在我接触的通信行业中,存储过程的使用还是占据了一小块的地位. 存储过程是什么?不得不拿下百度词条的解释来:"存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中, 经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象." 其实就似我们经过一系列的

oracle 游标变量ref cursor详解

oracle 游标变量ref cursor详解 分类: PL/SQL开发 2013-12-04 15:15 685人阅读 评论(0) 收藏 举报 oracleref cursor 一 介绍      像游标cursor一样,游标变量ref cursor指向指定查询结果集当前行.游标变量显得更加灵活因为其声明并不绑定指定查询. 其主要运用于PLSQL函数或存储过程以及其他编程语言java等程序之间作为参数传递.     不像游标的一点,游标变量没有参数.     游标变量具有以下属性:     (

OTL调用存储过程/函数及注意事项

OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个 C++ 编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库. OTL 使用起来比较方便,其官方网站也提供了详细的文档和例子( http://otl.sourceforge.net/otl3.htmhttp://otl.sourceforge.net/otl3_examples.htm ). 最近在项目中需要使用 OTL 调用 Oracle 存储过程,并且需要返回游标,