精华内容
下载资源
问答
  • Oracle存储过程

    万次阅读 多人点赞 2019-07-01 14:52:17
    Oracle存储过程详解 procedure 1.创建Oracle存储过程 prodedure create or replace procedure test(var_name_1 in type,var_name_2 out ty pe) as --声明变量(变量名 变量类型) begin --存储过程的执行体 end ...

    Oracle存储过程详解 procedure

    1.创建Oracle存储过程 prodedure

    create or replace procedure test(var_name_1 in type,var_name_2 out ty
    pe) as
    --声明变量(变量名 变量类型)
    begin
    --存储过程的执行体
    end test;
    打印出输入的时间信息
    create or replace procedure test(workDate in Date) is
    begin
    dbms_output.putline(The input date is:||to_date(workDate, yyyy-mm-d
    d));
    end test;

    2.变量赋值

    create or replace procedure test(workDate in Date) is
    x number(4,2);
    begin
    x := 1;
    end test;

    3.判断语句

    if 比较式 then begin end; end if;
    
    create or replace procedure test(x in number) is
    begin
    if x >0 then
    begin
    x := 0 - x;
    end;
    end if;
    if x = 0 then
    begin
    x: = 1;
    end;
    end if;
    end test;

    4.for循环

    For ... in ... LOOP
    --执行语句
    end LOOP;
    (1)循环遍历游标
    create or replace procedure test() as
    Cursor cursor is select name from student;
    name varchar(20);
    begin
    for name in cursor LOOP
    begin
    dbms_output.putline(name);
    end;
    end LOOP;
    end test;
    (2)循环遍历数组
    create or replace procedure test(varArray in myPackage.TestArray) a
    s
    --(输入参数varArray 是自定义的数组类型,定义方式见标题6)
    i number;
    begin
    i := 1; --存储过程数组是起始位置是从1开始的,与java、 C、 C++等语言
    不同。因为在Oracle 中本是没有数组的概念的,数组其实就是一张
    --表(Table),每个数组元素就是表中的一个记录,所以遍历数组时就相当于从表
    中的第一条记录开始遍历
    for i in 1..varArray.count LOOP
    dbms_output.putline(The No. || i ||record in varArray is: ||varArray
    (i));
    end LOOP;
    end test;

    5.while 循环

    while 条件语句 LOOP
    begin
    end;
    end LOOP;
    E.g
    create or replace procedure test(i in number) as
    begin
    while i < 10 LOOP
    begin
    i:= i + 1;
    end;
    end LOOP;
    end test;

    6.数组

    首先明确一个概念: Oracle中本是没有数组的概念的, 数组其实就是一张表(Ta
    ble),每个数组元素就是表中的一个记录。
    使用数组时,用户可以使用Oracle已经定义好的数组类型,或可根据自己的需
    要定义数组类型。
    (1)使用Oracle自带的数组类型

    x array; --使用时需要需要进行初始化
    e.g:
    create or replace procedure test(y out array) is
    x array;
    begin
    x := new array();
    y := x;
    end test;

    (2)自定义的数组类型 (自定义数据类型时,建议通过创建Package的方式实现,
    以便于管理) (自定义使用参见标题4.2)

     create or replace package myPackage is
    -- Public type declarations type info is record( name va
    rchar(20), y number);
    type TestArray is table of info index by binary_integer; --此处
    声明了一个TestArray 的类型数据,其实其为一张存储Info 数据类型的Table
    而已,及TestArray 就是一张表,有两个字段,一个是
    name, 一个是y。 需要注意的是此处使用了Index by binary_integer 编制该T
    able 的索引项,也可以不写,直接写成: type TestArray is
    table of info,如果不写的话使用数组时就需要进行初始化: varArray myPac
    kage.TestArray; varArray := new myPackage.TestArray();
    end TestArray;
    

    7.关于package

     

    ORACLE PACKAGE 包 是一组相关过程、函数、变量、常量#SinaEditor_Temp_FontName、类型和游标等PL/SQL程序设计元素的组合。包具有面向对象设计的特点,是对这些PL/SQL程序设计元素的封装。一个包由两个分开的部分组成:  

    (1)包package声明或定义:包定义部分是创建包的规范说明,声明包内数据类型、变量、常量、游标等元素。这部分也是为使用者提供了透明的接口。  

    (2)包体packpage body:包体是包定义部分的具体实现。  

    (3)将有联系的对象打成包,方便使用  

    (4)包中对象包括储存过程,函数,游标,自定义类型和变量,可以在PL_SQL块中应用这些对象.  

    定义包头

    create or replace package <Package_name> is  
      type <TypeName> is <Datatype>;--定义类型  
      -- Public constant declarations  
      <ConstantName> constant <Datatype> := <Value>;--声明常量  
      -- Public variable declarations  
      <VariableName> <Datatype>;  --数据类型  
      -- Public function and procedure declarations  
      function <FunctionName>(<Parameter> <Datatype>) return <Datatype>; --函数  
    end <Package_name>;  

    定义包体

    create or replace package body <Package_name> is  
      -- Private type declarations  
      type <TypeName> is <Datatype>;  
      -- Private constant declarations  
      <ConstantName> constant <Datatype> := <Value>  
      -- Private variable declarations  
      <VariableName> <Datatype>;  
      -- Function and procedure implementations  
      function <FunctionName>(<Parameter> <Datatype>) return <Datatype> is --函数的具体内容  
        <LocalVariable> <Datatype>;  
      begin  
       <Statement>;  
        return(<Result>);  
      end;  
    begin  
      -- Initialization--初始化包体,每次调用时被初始化  
      <Statement>;  
    end <Package_name>;  

    只有当包头编辑成功后才能编辑包体.其中的函数名与过程名须和包头中的函数过程一样.  

     包说明和包体必须有相同的名字  

     包的开始没有begin语句,与存储过程和函数不同。  

     在包的说明部分定义函数和过程的名称和参数,具体实现在包体中定义。  

     在包内声明常量、变量、类型定义、异常、及游标时不使用declare。  

     包内的过程和函数的定义不要create or replace语句。  

     包声明和包体两者分离。  

      包头(Package)与包体(Package body)的应用  

    包的作用: 根据出生年月返回年龄function Getage,返回工资function Getsalary  

    --创建环境 

    Create Table T_PsnSalary  --工资表  
    (  
    Fpsncode varchar(4) default '',  --个人代码  
    Fpsndesc varchar(20) default '',  --描述  
    FpsnBirth varchar(20) default '', --生日  
    FpsnSalary number(8,2)            --工资  
    );  

     --添加数据 

    Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C001','张三','1986.01.10',1100);  
    Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C002','李四','1980.10.10',3000);  
    Insert into T_PsnSalary(Fpsncode,Fpsndesc,FpsnBirth,FpsnSalary) Values('C003','王五','1996.12.10',800);  
    commit;  

    --创建包头 

    create or replace package package_demo is  
     function Getage(birthst varchar,birthend varchar) return integer;  
     function Getsalary(VFpsncode varchar) return number;  
    end package_demo;  

    --创建包体

    create or replace package body package_demo is  
      function Getage(birthst varchar,birthend varchar) return integer ---得到年龄函数  
      is  
        V_birth integer;  
        ToDateEnd Date;  
        Toyear number(4);  
        Tomonth number(4);  
        Fromyear number(4);  
        Frommonth number(4);  
      begin  
        if (birthend='') or (birthend is null) then   
          select sysdate into ToDateEnd from dual;         ---得到系统时间  
        end if;  
        Toyear := to_number(to_char(ToDateEnd,'YYYY'));    ---得到最后年月  
        Tomonth := to_number(to_char(ToDateEnd,'MM'));  
        Fromyear := to_number(substr(birthst,1,4));        ---计算的年月  
        Frommonth := to_number(substr(birthst,6,2));  
        if Tomonth-Frommonth>0 then  
          V_birth:=Toyear-fromyear;  
        else  
          V_birth:=Toyear-fromyear-1;  
        end if;  
        return(V_birth);  
      end Getage;  
      
      function getSalary(VFpsncode varchar) return number  ---返回工资情况  
      is  
        V_psnSalary number(8,2);  
      begin  
        Select FpsnSalary into V_psnSalary from T_PsnSalary where Fpsncode = VFpsncode;  
        return(V_psnSalary);  
      end getSalary;   
    end package_demo;  

    --包的调用

    select a.*,package_demo.Getage(Fpsnbirth,'')age from T_psnsalary a;  --调用包得到年龄功能  
    select package_demo.getsalary('C001') from dual;                     --代码得到工资  

    8.游标的使用 Oracle 中Cursor是非常有用的, 用于遍历临时表中的查询结果。
    其相关方法和属性也很多,现仅就常用的用法做一二介绍

    (1)Cursor型游标(不能用于参数传递)
    create or replace procedure test() is
    cusor_1 Cursor is select std_name from student where ...; --Curso
    r 的使用方式1 cursor_2 Cursor;
    begin
    select class_name into cursor_2 from class where ...; --Cursor的使
    用方式2
    可使用For x in cursor LOOP .... end LOOP; 来实现对 Cursor的遍历
    end test;
    (2)SYS_REFCURSOR型游标, 该游标是Oracle以预先定义的游标, 可作出参数进
    行传递
    create or replace procedure test(rsCursor out SYS_REFCURSOR) is
    cursor SYS_REFCURSOR; name varhcar(20);
    begin
    OPEN cursor FOR select name from student where ... --SYS_REFCURSOR只
    能通过OPEN方法来打开和赋值
    LOOP
    fetch cursor into name --SYS_REFCURSOR只能通过 fetch into来打
    开和遍历 exit when cursor%NOTFOUND; --SYS_R
    EFCURSOR中可使用三个状态属性:
    ---%NOTFOUND(未找到记录信息) %FOUND(找到记录信息)
    ---%ROWCOUNT(然后当前游标所指向的行位置)
    dbms_output.putline(name);
    end LOOP;
    rsCursor := cursor;
    end test;

    下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:
    现假设存在两张表,一张是学生成绩表(studnet),字段为: stdId,math,artic
    le,language,music,sport,total,average,step
    一张是学生课外成绩表(out_school),
    字段为:stdId,parctice,comment
    通过存储过程自动计算出每位学生的总成绩和平均成绩, 同时, 如果学生在课外
    课程中获得的评价为 A,就在总成绩上加20分。

    create or replace procedure autocomputer(step in number) is
    rsCursor SYS_REFCURSOR;
    commentArray myPackage.myArray;
    math number;
    article number;
    language number;
    music number;
    sport number;
    total number;
    average number;
    stdId varchar(30);
    record myPackage.stdInfo;
    i number;
    begin
    i := 1;
    get_comment(commentArray); --调用名为get_comment()的存储过程获取学生
    课外评分信息
    OPEN rsCursor for select stdId,math,article,language,music,sport from
    student t where t.step = step;
    LOOP
    fetch rsCursor into stdId,math,article,language,music,sport; exit whe
    n rsCursor%NOTFOUND;
    total := math + article + language + music + sport;
    for i in 1..commentArray.count LOOP
    record := commentArray(i);
    if stdId = record.stdId then
    begin
    if record.comment = 'A' then
    begin
    total := total + 20;
    go to next; --使用go to跳出for循环
    end;
    end if;
    end;
    end if;
    end LOOP;
    average := total / 5;
    update student t set t.total=total and t.average = average where t.
    stdId = stdId;
    end LOOP;
    end;
    end autocomputer;
    --取得学生评论信息的存储过程
    create or replace procedure get_comment(commentArray out myPackage.my
    Array) is
    rs SYS_REFCURSOR;
    record myPackage.stdInfo;
    stdId varchar(30);
    comment varchar(1);
    i number;
    begin
    open rs for select stdId,comment from out_school
    i := 1;
    LOOP
    fetch rs into stdId,comment; exit when rs%NOTFOUND;
    record.stdId := stdId;
    record.comment := comment;
    recommentArray(i) := record;
    i:=i + 1;
    end LOOP;
    end get_comment;
    --定义数组类型myArray
    create or replace package myPackage is begin
    type stdInfo is record(stdId varchar(30),comment varchar(1));
    type myArray is table of stdInfo index by binary_integer;
    end myPackage;

    字符函数——返回字符值
    这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.
    除了特别说明的之外,这些函数大部分返回 VARCHAR2 类型的数值.
    字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的。
    字符型变量存储的最大值:
    VARCHAR2数值被限制为 2000字符(ORACLE 8 中为4000 字符)
    CHAR数值被限制为 255字符(在 ORACLE8中是 2000)
    long类型为 2GB
    Clob类型为 4GB
    1、 CHR
    语法: chr(x)
    功能: 返回在数据库字符集中与X拥有等价数值的字符。 CHR和ASCII是一对反函数。 经过
    CHR转换后的字符再经过ASCII转换又得到了原来的字
    符。
    使用位置:过程性语句和SQL语句。
    2、 CONCAT
    语法: CONCAT( string1,string2)
    功能:返回string1,并且在后面连接string2。
    使用位置:过程性语句和SQL语句。
    3、 INITCAP
    语法: INITCAP( string)
    功能:返回字符串的每个单词的第一个字母大写而单词中的其他字母小写的string。单词
    是用.空格或给字母数字字符进行分隔。不是字母的
    字符不变动。
    使用位置:过程性语句和SQL语句。
    4、 LTRIM
    语法: LTRIM( string1,string2)
    功能:返回删除从左边算起出现在string2中的字符的string1。 String2被缺省设置为单
    个的空格。数据库将扫描string1,从最左边开始。当
    遇到不在string2中的第一个字符,结果就被返回了。 LTRIM的行为方式与RTRIM很相似。
    使用位置:过程性语句和SQL语句。
    5、 NLS_INITCAP
    语法: NLS_INITCAP( string[,nlsparams])
    功能: 返回字符串每个单词第一个字母大写而单词中的其他字母小写的string, nlsparams
    指定了不同于该会话缺省值的不同排序序列。如果不指定参数,则功能和INITCAP相同。 N
    lsparams可以使用的形式是:
    ‘ NLS_SORT=sort’
    这里sort制订了一个语言排序序列。
    使用位置:过程性语句和SQL语句。
    6、 NLS_LOWER
    语法: NLS_LOWER( string[,nlsparams])
    功能:返回字符串中的所有字母都是小写形式的string。不是字母的字符不变。
    Nlsparams参数的形式与用途和NLS_INITCAP中的nlsparams参数是相同的。
    如果nlsparams没有被包含,那么NLS_LOWER所作的处理和
    LOWER相同。
    使用位置;过程性语句和SQL语句。
    7、 NLS_UPPER
    语法: nls_upper( string[,nlsparams])
    功能: 返回字符串中的所有字母都是大写的形式的string。 不是字母的字符不变。 nlspara
    ms参数的形式与用途和NLS_INITCAP中的相同。如果
    没有设定参数,则NLS_UPPER功能和UPPER相同。
    使用位置:过程性语句和SQL语句。
    8、 REPLACE
    语法: REPLACE( string, search_str[,replace_str])
    功能: 把string中的所有的子字符串search_str用可选的replace_str替换, 如果没有指
    定replace_str,所有的string中的子字符串
    search_str都将被删除。 REPLACE是TRANSLATE所提供的功能的一个子集。
    使用位置:过程性语句和SQL语句。
    9、 RPAD
    语法: RPAD( string1,x[,string2])
    功能: 返回在X字符长度的位置上插入一个string2中的字符的string1。 如果string2的
    长度要比X字符少,就按照需要进行复制。如果string2
    多于X字符, 则仅string1前面的X各字符被使用。 如果没有指定string2, 那么使用空格
    进行填充。 X是使用显示长度可以比字符串的实际长度
    要长。 RPAD的行为方式与LPAD很相似,除了它是在右边而不是在左边进行填充。
    使用位置:过程性语句和SQL语句。
    10、 RTRIM
    语法: RTRIM( string1,[,string2])
    功能: 返回删除从右边算起出现在string1中出现的字符string2. string2被缺省设置
    为单个的空格.数据库将扫描string1,从右边开始.当遇
    到不在string2中的第一个字符,结果就被返回了RTRIM的行为方式与LTRIM很相似.
    使用位置:过程性语句和SQL语句。
    11、 SOUNDEX
    语法: SOUNDEX( string)
    功能: 返回string的声音表示形式.这对于比较两个拼写不同但是发音类似的单词而言
    很有帮助.
    使用位置:过程性语句和SQL语句。
    12、 SUBSTR
    语法: SUBSTR( string,a[,b])
    功能: 返回从字母为值a开始b个字符长的string的一个子字符串.如果a是0,那么它
    就被认为从第一个字符开始.如果是正数,返回字符是从左
    边向右边进行计算的.如果b是负数,那么返回的字符是从string的末尾开始从右向左进行
    计算的.如果b不存在,那么它将缺省的设置为整个字符
    串.如果b小于1,那么将返回NULL.如果a或b使用了浮点数,那么该数值将在处理进行以前
    首先被却为一个整数.
    使用位置:过程性语句和SQL语句。
    13、 TRANSLATE
    语法: TRANSLATE(string,from_str,to_str)
    功能: 返回将所出现的from_str中的每个字符替换为to_str中的相应字符以后的
    string. TRANSLATE是REPLACE所提供的功能的一个超集.
    如果from_str比to_str长,那么在from_str中而不在to_str中而外的字符将从string
    中被删除,因为它们没有相应的替换字符. to_str不能为空
    .Oracle把空字符串认为是NULL,并且如果TRANSLATE中的任何参数为NULL,那么结果也是N
    ULL.
    使用位置:过程性语句和SQL语句。
    14、 UPPER
    语法: UPPER( string)
    功能: 返回大写的string.不是字母的字符不变.如果string是CHAR数据类型的,那么结果
    也是CHAR类型的.如果string是VARCHAR2类型的,那么
    结果也是VARCHAR2类型的.
    使用位置: 过程性语句和SQL语句。
    字符函数——返回数字
    这些函数接受字符参数回数字结果.参数可以是CHAR或者是VARCHAR2类型的.尽管实际下许
    多结果都是整数值,但是返回结果都是简单的NUMBER
    类型的,没有定义任何的精度或刻度范围.
    16、 ASCII
    语法: ASCII( string)
    功能: 数据库字符集返回string的第一个字节的十进制表示.请注意该函数仍然称作为ASC
    II.尽管许多字符集不是7位ASCII.CHR和ASCII是互为
    相反的函数.CHR得到给定字符编码的响应字符. ASCII得到给定字符的字符编码.
    使用位置: 过程性语句和SQL语句。
    17、 INSTR
    语法: INSTR( string1, string2[a,b])
    功能: 得到在string1中包含string2的位置. string1时从左边开始检查的,开始的位
    置为a,如果a是一个负数,那么string1是从右边开始进行
    扫描的.第b次出现的位置将被返回. a和b都缺省设置为1,这将会返回在string1中第一
    次出现string2的位置.如果string2在a和b的规定下没有
    找到,那么返回0.位置的计算是相对于string1的开始位置的,不管a和b的取值是多少.
    使用位置: 过程性语句和SQL语句。
    18、 INSTRB
    语法: INSTRB( string1, string2[a,[b]])
    功能: 和INSTR相同,只是操作的对参数字符使用的位置的是字节.
    使用位置: 过程性语句和SQL语句。
    19、 LENGTH
    语法: LENGTH( string)
    功能: 返回string的字节单位的长度.CHAR数值是填充空格类型的,如果string由数据
    类型CHAR,它的结尾的空格都被计算到字符串长度中间.
    如果string是NULL,返回结果是NULL,而不是0.
    使用位置: 过程性语句和SQL语句。
    20、 LENGTHB
    语法: LENGTHB( string)
    功能: 返回以字节为单位的string的长度.对于单字节字符集LENGTHB和LENGTH是一样
    的.
    使用位置: 过程性语句和SQL语句。
    21、 NLSSORT
    语法: NLSSORT( string[,nlsparams])
    功能: 得到用于排序string的字符串字节.所有的数值都被转换为字节字符串,这样在不同
    数据库之间就保持了一致性. Nlsparams的作用和
    NLS_INITCAP中的相同.如果忽略参数,会话使用缺省排序.

    9.Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

    (1)无参存储过程语法

    create or replace procedure NoParPro  
     as  //声明  
     ;  
     begin // 执行  
     ;  
     exception//存储过程异常  
     ;  
     end;

     

    (2)带参存储过程实例

    create or replace procedure queryempname(sfindno emp.empno%type)   
    as 
       sName emp.ename%type;  
       sjob emp.job%type;  
    begin 
           ....  
    exception  
           ....  
    end;

    (3)带参数存储过程含赋值方式

    create or replace procedure runbyparmeters    
        (isal in emp.sal%type,   
         sname out varchar,  
         sjob in out varchar)  
     as  
        icount number;  
     begin 
          select count(*) into icount from emp where sal>isal and job=sjob;  
          if icount=1 then 
            ....  
          else 
           ....  
         end if;  
    exception  
         when too_many_rows then 
         DBMS_OUTPUT.PUT_LINE('返回值多于1行');  
         when others then 
         DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');  
    end;

    其中参数IN表示输入参数,是参数的默认模式。

    OUT表示返回值参数,类型可以使用任意Oracle中的合法类型。

    OUT模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程

    IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去。

    10.存储过程中游标的定义和使用

    准备环境

    CREATE TABLE EMP(
     EMPNO NUMBER(4) NOT NULL,  
     ENAME VARCHAR2(10),  
     JOB VARCHAR2(9),  
     MGR NUMBER(4),  
     HIREDATE DATE,  
     SAL NUMBER(7, 2),  
     COMM NUMBER(7, 2),  
     DEPTNO NUMBER(2)
    );  
    
    INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK', 7902, SYSDATE, 800, NULL, 20); 
    INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, SYSDATE, 1600, 300, 30); 
    INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN',7698, SYSDATE, 1250, 500, 30); 
    INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER', 7839,SYSDATE, 2975, NULL, 20); 
    INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698, SYSDATE, 1250, 1400, 30); 
    INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839, SYSDATE, 2850, NULL, 30); 
    INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839, SYSDATE, 2450, NULL, 10); 
    INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566, SYSDATE, 3000, NULL, 20); 
    INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL, SYSDATE, 5000, NULL, 10); 
    INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698, SYSDATE, 1500, 0, 30); 
    INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788, SYSDATE, 1100, NULL, 20); 
    INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698, SYSDATE, 950, NULL, 30); 
    INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566, SYSDATE, 3000, NULL, 20); 
    INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782, SYSDATE, 1300, NULL, 10); 
    COMMIT;
    

    案例一 使用游标查询部门编号为10的所有人姓名和薪水

    create or replace procedure test2 is
    begin
     declare
       type c is ref cursor;    
       emp_sor c;      
       cname emp.ename%type;     
       csal emp.sal%type;
    begin
      open emp_sor for select ename,sal from emp where deptno=10;       
      loop        
        fetch emp_sor into cname,csal;  --取游标的值给变量。             
        dbms_output.put_line('ename:'||cname||'sal'||csal);        
        exit when emp_sor%notfound;        
       end loop;         
       close emp_sor;     
    end;
    end test2;

    案例二  直接定义游标

    create or replace procedure test3 is
    begin
     declare
       cursor emp_sor  is select ename,sal from emp where deptno=10;
       cname emp.ename%type;
       csal emp.sal%type;
    begin
      open emp_sor;
      loop
        fetch emp_sor into cname,csal;  --取游标的值给变量。
        dbms_output.put_line('ename:'||cname||'sal'||csal);
        exit when emp_sor%notfound;
       end loop;
       close emp_sor;
    end;
    end test3;

     

    案例三  使用记录变量来接受游标指定的表的数据

    create or replace procedure test4 is
    begin
     declare
       cursor emp_sor is
         select ename, sal from emp where deptno = 10;
       --使用记录变量来接受游标指定的表的数据
       type emp_type is record(
         v_ename emp.ename%type,
         v_sal   emp.sal%type);
       --用emp_type声明一个与emp_type类似的记录变量。该记录有两列,与emp表的ename,sal同类型的列。
       emp_type1 emp_type;
     begin
       open emp_sor;
       loop
         fetch emp_sor into emp_type1; --取游标的值给变量。
         dbms_output.put_line(emp_type1.v_ename || ',' || emp_type1.v_sal);
         exit when emp_sor%notfound;
       end loop;
       close emp_sor;
     end;
    end test4;

    案例四  for循环从游标中取值

    create or replace procedure test5 is
    begin
     declare
       cursor emp_sor is select a.ename from emp a;
       type ename_table_type is table of varchar2(20);
       ename_table ename_table_type;
     begin
      ----用for游标取值
       open emp_sor;
       ---通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率
       ---Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使用批查询,批查询在----某--些情况下能显著提高查询效率。
       --采用bulk collect可以将查询结果一次性地加载到collections中。
       --而不是通过cursor一条一条地处理。
       --可以在select into,fetch into,returning into语句使用bulk collect。
       --注意在使用bulk collect时,所有的into变量都必须是collections
         fetch emp_sor bulk collect into ename_table;
         for i in 1 ..ename_table.count loop
           dbms_output.put_line(ename_table(i));
       end loop;
       close emp_sor;
     end;
    end test5;

    案例五  用for取值,带隐式游标会自动打开和关闭

    create or replace procedure test6 is
    begin
     declare
       cursor emp_sor is select a.ename from emp a;
       type emp_table_type is table of varchar(20);
       begin 
       for emp_record in emp_sor
         loop
           dbms_output.put_line('第'||emp_sor%rowcount||'雇员名:'||emp_record.ename);
         end loop;
     end;
    end test6;

    案例六  判断游标是否打开

    
    create or replace procedure test7 is
    begin
     declare
       cursor emp_sor is select a.ename from emp a;
       type emp_table_type is table of varchar(20);
       emp_table emp_table_type;
     begin
      --用for取值,判断游标是否打开
       if not emp_sor%isopen then
         open emp_sor;
       end if;
       fetch emp_sor bulk collect into emp_table;
       dbms_output.put_line(emp_sor%rowcount);
       close emp_sor;
     end;
    end test7;

    案例七  使用游标变量取值

    create or replace procedure test8 is
    begin
      --使用游标变量取值
     declare
       cursor emp_sor is select a.ename,a.sal from emp a;
       emp_record emp_sor%rowtype;
     begin
      open emp_sor;
      loop
        fetch emp_sor into emp_record;
        exit when emp_sor%notfound;
         --exit when emp_sor%notfound放的位置不一样得到的结果也不一样。如果放到dbms_....后,
         --结果会多显示一行数据,即查询结果的最后一行显示了两次。
        dbms_output.put_line('序号'||emp_sor%rowcount||'名称:'||emp_record.ename||'薪水:'||emp_record.sal);
      end loop;
      close emp_sor;
     end;
    end test8;

    案例八 带参数的游标,在打开游标的时候传入参数

    
    create or replace procedure test9 is
    begin
      --带参数的游标,在打开游标的时候传入参数
     declare
       cursor emp_sor(no number) is select a.ename from emp a where a.deptno=no;
       emp_record emp_sor%rowtype;
     begin
      open emp_sor(10);
      loop
        fetch emp_sor into emp_record;
        exit when emp_sor%notfound;
        dbms_output.put_line('序号'||emp_sor%rowcount||'名称:'||emp_record.ename);
      end loop;
      close emp_sor;
     end;
    end test9;

     案例九  使用游标做更新操作

    
    create or replace procedure test10 is
    begin
      --使用游标做更新、删除操作,必须在定义游标的时候加上for update
      --当然也可以用for update nowait
     declare
       cursor emp_sor is select a.ename,a.sal from emp a for update;
       cname emp.ename%type;
       csal emp.sal%type;
     begin
      open emp_sor;
      loop
        fetch emp_sor into cname,csal;
        exit when emp_sor%notfound;
        dbms_output.put_line('名称:'||cname||','||'薪水:'||csal);
        if csal < 2000 then
          update emp set sal = sal+200 where current of emp_sor;
        end if;
      end loop;
      close emp_sor;
      --要查看更新后的数据,必须得重新打开游标去查询
      open emp_sor;
      loop
        fetch emp_sor into cname,csal;
         exit when emp_sor%notfound;
         dbms_output.put_line('名称:'||cname||','||'new薪水:'||csal);
      end loop;
      close emp_sor;
     end;
    end test10;

    案例十  使用游标做删除操作

    
    create or replace procedure test11 is
    begin
      --使用游标做更新、删除操作,必须在定义游标的时候加上for update
     declare
       cursor emp_sor is select a.empno from emp a for update;
       pempno emp.empno%type;
     begin
      open emp_sor;
      loop
        fetch emp_sor into pempno;
        exit when emp_sor%notfound;
        dbms_output.put_line('旧的empno:'||pempno);
        if pempno = 2009 then
           delete emp where current of emp_sor;
        end if;
      end loop;
      close emp_sor;
      --要查看删除后的数据,必须得重新打开游标去查询
      open emp_sor;
      loop
        fetch emp_sor into pempno;
        exit when emp_sor%notfound;
        dbms_output.put_line('新的empno:'||pempno);
      end loop;
      close emp_sor;
     end;
    end test11;

    案例十一 直接使用游标而不用去定义

    
    create or replace procedure test12 is
     begin
       for emp_record in(select empno,sal,deptno from emp)
         loop
           dbms_output.put_line('员工编号:'||emp_record.empno||',薪水:'||emp_record.sal||',部门编号'||emp_record.deptno);
         end loop;
    end test12;

    案例十二 带sql 的统计查询

    
    create or replace procedure test13 is
    begin
     declare
       type test_cursor_type is ref cursor;
       test_cursor test_cursor_type;
       v_name user_tables.TABLE_NAME%type;
       v_count number;
       str_sql varchar2(100);
     begin
      open test_cursor for select table_name from user_tables;
      loop
        fetch test_cursor into v_name;
        if v_name is not null then
          str_sql := 'select count(*) from '|| v_name;
          execute immediate str_sql into v_count;
        end if;
        exit when test_cursor%notfound;
        dbms_output.put_line(v_name||','||v_count);
      end loop;
      close test_cursor;
     end;
    end test13;

     

    当我们写完存储过程之后,我们可以在 command window下执行,oracle默认是不显示输出的, 
    所以我们要 set serveroutput on 命令来显示输出结果,然后exec test1()即可输出结果。

     

    以上内容比较杂乱 ,有的是借鉴别人的 ,为了对自己不熟悉的地方做个记录 一并归入到了本文章中,希望你看了后能有所收获!

    如果你有好的案例可以发给我,有错误的地方敬请指正!

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 初出茅庐,不知原来存储...在Oracle中使用存储过程可以声明单个存储过程,也可以使用包的方式一个存储过程包(PACKAGE)包含许多存储过程。 编写单个存储过程的格式可以参考下面这个例子,这是最简单的存储过程例子...

    初出茅庐,不知原来存储过程还可以写得如此复杂,而且还竟然可以调试!

    好吧,得整理一下存储过程的一些语法,以备以后用到时可以查阅。

    使用数据库:Oracle

    数据库工具:PL/SQL Developer

    在Oracle中使用存储过程可以声明单个存储过程,也可以使用包的方式一个存储过程包(PACKAGE)包含许多存储过程。

    编写单个存储过程的格式可以参考下面这个例子,这是最简单的存储过程例子:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    CREATE OR REPLACE PROCEDURE PROC_TEST IS

      /* 声明变量 */

      count number;

      BEGIN

         /* SQL代码 */

         select from dual;

      /* 异常处理 */

      EXCEPTIOIN

        WHEN NO_DATA_FOUND THEN

            --处理代码

        WHEN OTHERS THEN

            --处理代码

      END PROC_TEST; --这里也可以直接写成: "END;"

    如果有许多存储过程,那么你可能需要用到存储过程包。在Oracle中使用存储过程包首先要先创建package声明存储过程,之后创建package body写存储过程的具体内容。

    存储过程的package相当于Java中的接口,而package body就相当于Java中实现该接口的类。

    1.声明存储过程

     

    1

    2

    3

    4

    5

    6

    CREATE OR REPLACE PACKAGE PACK_ZOO IS

            /* 不带参数的存储过程 */

            PROCEDURE WATCH_MONKEY;

            /* 带参数的存储过程 */

            PROCEDURE FEED_MONKEY(p_food IN VARCHAR2, p_amount IN NUMBER);

    END PACK_ZOO;

     

    ①在oracle的存储过程中,形式参数(形参)声明用IN关键字。上面代码[p_food IN VARCHAR2] 中,p_food为变量名,IN为关键字,VARCAHR2为变量类型。

    ②在存储过程中声明参数,则是直接变量名后跟上变量类型,如下面代码中的name参数:[name VARCAHR2(12)]

    2.编写存储过程内容

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    CREATE OR REPLACE PACKAGE BODY PACK_ZOO IS

          /*

            * 不带参数的存储过程

            */

          PROCEDURE WATCH_MONKEY IS

              /* 参数声明 */

              name VARCHAR2(12);

              BEGIN

              /* 处理体 */

                 SELECT FROM DUAL;

              /* 异常处理 */

              EXCEPTION

                     WHEN NO_DATA_FOUND THEN

                          DBMS_OUTPUT.PUT_LINE('无数据记录');

                     WHEN OTHERS THEN

                          DBMS_OUTPUT.PUT_LINE('异常代码:' + sqlcode);  --sqlcode代表异常代码

                          DBMS_OUTPUT.PUT_LINE('异常信息:' + sqlerrm);  --sqlerrm代表异常信息

       END WATCH_MONKEY;

    /*

            *带参数的存储过程

            */

           PROCEDURE FEED_MONKEY(p_food IN VARCHAR2, p_amount IN NUMBER) IS

              /* 参数声明 */

              name VARCHAR2(12);

           BEGIN

              /* 处理体 */

              name := 'Hello Oracle!';

              /* 异常处理 */

              EXCEPTION

                 WHEN NO_DATA_FOUND THEN

                      DBMS_OUTPUT.put_line('CATCH EXCEPTIOIN');

                 WHEN OTHERS THEN

                      DBMS_OUTPUT.PUT_LINE('异常代码:' + sqlcode);  --sqlcode代表异常代码

                      DBMS_OUTPUT.PUT_LINE('异常信息:' + sqlerrm);  --sqlerrm代表异常信息

           END FEED_MONKEY;

    END PACK_ZOO;

     

    在方法体里要给一个变量赋值,应该使用符号 "  :=  ",如:"  name := 'Hello Oracle!'  "

    这里用到的语法是PLSQL语法,想了解更多关于PLSQL语法的知识,可以看我的另一篇文章:PL/SQL基础语法

     

    转自:https://www.cnblogs.com/chanshuyi/p/3834140.html

    展开全文
  • Oracle中使用存储过程可以声明单个存储过程,也可以使用包的方式一个存储过程包(PACKAGE)包含许多存储过程。 编写单个存储过程的格式可以参考下面这个例子,这是最简单的存储过程例子: 1 2 3 ...

    初出茅庐,不知原来存储过程还可以写得如此复杂,而且还竟然可以调试!

    好吧,得整理一下存储过程的一些语法,以备以后用到时可以查阅。

    使用数据库:Oracle

    数据库工具:PL/SQL Developer

    在Oracle中使用存储过程可以声明单个存储过程,也可以使用包的方式一个存储过程包(PACKAGE)包含许多存储过程。

    编写单个存储过程的格式可以参考下面这个例子,这是最简单的存储过程例子:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    CREATE OR REPLACE PROCEDURE PROC_TEST IS

      /* 声明变量 */

      count number;

      BEGIN

         /* SQL代码 */

         select from dual;

      /* 异常处理 */

      EXCEPTIOIN

        WHEN NO_DATA_FOUND THEN

            --处理代码

        WHEN OTHERS THEN

            --处理代码

      END PROC_TEST; --这里也可以直接写成: "END;"

    如果有许多存储过程,那么你可能需要用到存储过程包。在Oracle中使用存储过程包首先要先创建package声明存储过程,之后创建package body写存储过程的具体内容。

    存储过程的package相当于Java中的接口,而package body就相当于Java中实现该接口的类。

    1.声明存储过程

     

    1

    2

    3

    4

    5

    6

    CREATE OR REPLACE PACKAGE PACK_ZOO IS

            /* 不带参数的存储过程 */

            PROCEDURE WATCH_MONKEY;

            /* 带参数的存储过程 */

            PROCEDURE FEED_MONKEY(p_food IN VARCHAR2, p_amount IN NUMBER);

    END PACK_ZOO;

     

    ①在oracle的存储过程中,形式参数(形参)声明用IN关键字。上面代码[p_food IN VARCHAR2] 中,p_food为变量名,IN为关键字,VARCAHR2为变量类型。

    ②在存储过程中声明参数,则是直接变量名后跟上变量类型,如下面代码中的name参数:[name VARCAHR2(12)]

    2.编写存储过程内容

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    CREATE OR REPLACE PACKAGE BODY PACK_ZOO IS

          /*

            * 不带参数的存储过程

            */

          PROCEDURE WATCH_MONKEY IS

              /* 参数声明 */

              name VARCHAR2(12);

              BEGIN

              /* 处理体 */

                 SELECT FROM DUAL;

              /* 异常处理 */

              EXCEPTION

                     WHEN NO_DATA_FOUND THEN

                          DBMS_OUTPUT.PUT_LINE('无数据记录');

                     WHEN OTHERS THEN

                          DBMS_OUTPUT.PUT_LINE('异常代码:' + sqlcode);  --sqlcode代表异常代码

                          DBMS_OUTPUT.PUT_LINE('异常信息:' + sqlerrm);  --sqlerrm代表异常信息

       END WATCH_MONKEY;

    /*

            *带参数的存储过程

            */

           PROCEDURE FEED_MONKEY(p_food IN VARCHAR2, p_amount IN NUMBER) IS

              /* 参数声明 */

              name VARCHAR2(12);

           BEGIN

              /* 处理体 */

              name := 'Hello Oracle!';

              /* 异常处理 */

              EXCEPTION

                 WHEN NO_DATA_FOUND THEN

                      DBMS_OUTPUT.put_line('CATCH EXCEPTIOIN');

                 WHEN OTHERS THEN

                      DBMS_OUTPUT.PUT_LINE('异常代码:' + sqlcode);  --sqlcode代表异常代码

                      DBMS_OUTPUT.PUT_LINE('异常信息:' + sqlerrm);  --sqlerrm代表异常信息

           END FEED_MONKEY;

    END PACK_ZOO;

     

    在方法体里要给一个变量赋值,应该使用符号 "  :=  ",如:"  name := 'Hello Oracle!'  "

    这里用到的语法是PLSQL语法,想了解更多关于PLSQL语法的知识,可以看我的另一篇文章:PL/SQL基础语法

     

    展开全文
  • Oracle存储过程基本用法

    千次阅读 2018-10-29 16:38:12
    1、Oracle存储过程基本语法 存储过程 create or replace package body 存储过程名(Pkg_AJStaticReport )--通知Oracle数据库去创建一个叫做Pkg_AJStaticReport 存储过程, 如果存在就覆盖它; is--is关...

    下面语法我是参照PLSQL Developer总结出来的语法,对于SQLserver或MySQL可能存在差异:

    1、Oracle存储过程基本语法 存储过程

    create or replace package body 存储过程名(Pkg_AJStaticReport )--通知Oracle数据库去创建一个叫做Pkg_AJStaticReport 存储过程, 如果存在就覆盖它;

    is--is关键词表明后面将跟随一个PL/SQL体。

    begin--begin关键词表明PL/SQL体的开始。

    null--表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句。

    end--end关键词表明PL/SQL体的结束。

    2、存储过程创建语法: 

    create or replace procedure 存储过程名(param1 in type,param2 out type)

    as 

    变量1 类型(值范围); --vs_msg VARCHAR2(4000); 
    变量2 类型(值范围); 

    例如:

    Begin 
    Select count(*) into 变量1 from 表A where列名=param1; 
    If (判断条件) then 
    Select 列名 into 变量2 from 表A where列名=param1; 
    Dbms_output。Put_line(‘打印信息'); 
    else if (判断条件) then 
    Dbms_output。Put_line(‘打印信息'); 
    Else 
    Raise 异常名(NO_DATA_FOUND); 
    End if; 
    Exception 
    When others then 
    Rollback; 
    End; 

    注意事项: 
    1, 存储过程参数不带取值范围,in表示传入,out表示输出 。类型可以使用任意Oracle中的合法类型。 
    2, 变量带取值范围,后面接分号 
    3, 在判断语句前最好先用count(*)函数判断是否存在该条操作记录 
    4, 用select 。。。into。。。给变量赋值 
    5, 在代码中抛异常用 raise+异常名 

    CREATE OR REPLACE PROCEDURE存储过程名 

    --定义参数 
    is_ym IN CHAR(6) , 
    the_count OUT NUMBER, 

    AS 
    --定义变量 
    vs_msg VARCHAR2(4000); --错误信息变量 
    vs_ym_beg CHAR(6); --起始月份 
    vs_ym_end CHAR(6); --终止月份 
    vs_ym_sn_beg CHAR(6); --同期起始月份 
    vs_ym_sn_end CHAR(6); --同期终止月份 
    --定义游标(简单的说就是一个可以遍历的结果集) 

    CURSOR cur_1 IS 
    SELECT 。。。 
    FROM 。。。 
    WHERE 。。。 
    GROUP BY 。。。; 
    BEGIN 

    --用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS 

    TO_DATE 等很常用的函数。 
    vs_ym_beg := SUBSTR(is_ym,1,6); 
    vs_ym_end := SUBSTR(is_ym,7,6); 
    vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'), -12),'yyyymm'); 
    vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'), -12),'yyyymm'); 

    --先删除表中特定条件的数据。 

    DELETE FROM 表名 WHERE ym = is_ym; 

    --然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount 

    DBMS_OUTPUT.put_line('del上月记录='||SQL%rowcount||'条'); 
    INSERT INTO表名(area_code,ym,CMCODE,rmb_amt,usd_amt) 
    SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000 
    FROM BGD_AREA_CM_M_BASE_T 
    WHERE ym >= vs_ym_beg 
    AND ym <= vs_ym_end 
    GROUP BY area_code,CMCODE; 
    DBMS_OUTPUT.put_line('ins当月记录='||SQL%rowcount||'条'); 
    --遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。 

    FOR rec IN cur_1 LOOP 
    UPDATE 表名 
    SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn 
    WHERE area_code = rec.area_code 
    AND CMCODE = rec.CMCODE 
    AND ym = is_ym; 
    END LOOP; 
    COMMIT; 

    --错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。 

    EXCEPTION 

    WHEN OTHERS THEN 
    vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500); 

    ROLLBACK; 

    --把当前错误记录进日志表。 

    INSERT INTO LOG_INFO(proc_name,error_info,op_date) 
    VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE); 
    COMMIT; 
    RETURN; 

    END; 

     

     

    展开全文
  • Oracle 存储过程学习 目录 Oracle 存储过程.............................................................................................................................. 1 Oracle 存储过程基础知识........
  • oracle存储过程模板

    千次阅读 2016-04-29 11:10:30
    oracle 存储过程的基本语法 1.基本结构  CREATE OR REPLACE PROCEDURE 存储过程名字 (  参数1 IN NUMBER,  参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 ...
  • Oracle 存储过程学习

    万次阅读 2016-05-20 21:57:24
    Oracle存储过程基础知识 1 Oracle存储过程的基本语法 2 关于Oracle存储过程的若干问题备忘 4 1. 在Oracle中,数据表别名不能加as。 4 2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个...
  • Oracle存储过程学习

    2016-12-05 16:49:18
    Oracle存储过程学习 目录 Oracle 存储过程... 1 Oracle存储过程基础知识... 1 Oracle存储过程的基本语法... 2 关于Oracle存储过程的若干问题备忘... 4 1.  在Oracle中,数据表别名不能加as。... 4 2....
  • 最近要做测试场景的报表,写了很多存储过程。为了管理方便,打算放在一个包里。在网上搜了一下,按照定义做,总有问题。 后面明白是自己没明白Package和PackageBody的区别。要放在一个包里,需要先定义包(Package...
  • oracle存储过程

    2020-02-20 10:23:32
    1 存储过程 存储过程是编译好并存储在数据库的程序,有自己的名字、输入参数、输出参数。存储过程在创建的时候被编译,调用一次后相关信息保存到内存当中,下次调用时可以直接执行。 1.1 存储过程的创建 存储过程...
  • oracle存储过程实例

    万次阅读 2016-07-05 12:19:27
    认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中...
  • oracle存储过程和sqlserver存储过程

    千次阅读 2019-04-22 16:30:18
    oracle存储过程: 声明: 外部参数 只有数据类型没有大小 Procedure Pro_Insert_Stuff_Check( v_id VARCHAR2, v_card_id VARCHAR2, ...
  • oracle存储过程加密

    2017-11-28 09:25:10
    引言:平时大家在做项目的时候,经常会遇到把Oracle存储过程带到项目现场来测试系统。这时如果想对自己的存储过程进行保密,不使别人看到源代码,就可以对已有的存储过程进行加密保护。顾名思义,就是对Oracle存储...
  • 存储过程启动时报错如下,看到这个首先想到的是类型不匹配,但是一直没找到可能出现的问题, 然后。。。。 hmw_org_code VARCHAR2(128); for dept_code in (select distinct hme1.dept_i...
  • .net 调用Oracle存储过程

    千次阅读 2014-03-07 12:38:04
    在.NET中调用Oracle9i存储过程经验总结(1)  在.NET中调用Oracle9i存储过程可以用多个数据提供者,比如OralceClient,OleDb。本文将用OralceClient为例。.NET语言用C#。   一、调用一个带输入、输出参数的存储过程 ...
  • Oracle 存储过程、游标的使用
  • ORACLE存储过程调用WebService

    千次阅读 2017-07-19 11:15:27
    最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明。其他主流数据库,比如mysql和sql service,调用web service的方法这里就不做...
  • Oracle存储过程教程

    千次阅读 2009-10-23 15:34:00
    一个简单的oracle分页存储过程的实现和调用。在看了众多的分页存储过程以后发现都是针对sqlserver的,而没有oracle的,因此想写一个关于oracle存储过程,因为我用到的数据库是oracleOracle分页存储过程的思路于...
  • oracle 存储过程遍历数据

    千次阅读 2018-05-04 19:00:15
    摘要: Oracle存储过程,自定义数据类型,集合,遍历取值0.前言 在Oracle的存储过程中,可能会遇到数据处理,假如我们目前的功能在一个Packages中 Packages封装了多个不同功能的Procedure,我们在一个Procedure里面...
  • Oracle存储过程入门学习

    千次阅读 2018-12-12 16:06:39
    1,Oracle存储过程和自定义函数概述 指存储在数据库中供所有用户程序调用的子程序叫存储过程或存储函数。 存储过程 和 存储函数 的相同点和不同点: 1)相同点:都是完成特定功能的程序; 2)不同点:存储过程不...
  • Oracle存储过程加密

    千次阅读 2013-12-10 10:55:25
    Oracle存储过程加密 实现方法:  1、c:\>set NLS_LANG=AMERICAN_AMERICA.USACII7  或c:\>set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1  或c:\>set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK(当遇到加密报错,且有...
  • 存储过程存储函数 存储在数据库中供所有用户程序调用的子程序叫做存储过程存储函数。 区别:是否可以通过return返回函数值...而存储函数仍然存在,是由于oracle不断升级,需要实现向下兼容,所以存储函数就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,663
精华内容 8,665
关键字:

oracle存储过程body