`
shoushounihao
  • 浏览: 41390 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

存储过程学习基础

 
阅读更多

存储过程创建语法:

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

as

变量1 类型(值范围);

变量2 类型(值范围);

Begin

    Select count(*) into 变量1 from 表A where列名=param1;

    If (判断条件) then

       Select 列名 into 变量2 from 表A where列名=param1;

       Dbms_output。Put_line(‘打印信息’);

    Elsif (判断条件) then

       Dbms_output。Put_line(‘打印信息’);

    Else

       Raise 异常名(NO_DATA_FOUND);

    End if;

Exception

    When others then

       Rollback;

End;

 

注意事项:

1,  存储过程参数不带取值范围,in表示传入,out表示输出

2,  变量带取值范围,后面接分号

3,  在判断语句前最好先用count(*)函数判断是否存在该条操作记录

4,  用select 。。。into。。。给变量赋值

5,  在代码中抛异常用 raise+异常名

 

 

以命名的异常

命名的系统异常                          产生原因

ACCESS_INTO_NULL                   未定义对象

CASE_NOT_FOUND                     CASE 中若未包含相应的 WHEN ,并且没有设置

ELSE 时

COLLECTION_IS_NULL                集合元素未初始化

CURSER_ALREADY_OPEN          游标已经打开

DUP_VAL_ON_INDEX                   唯一索引对应的列上有重复的值

INVALID_CURSOR                 在不合法的游标上进行操作

INVALID_NUMBER                       内嵌的 SQL 语句不能将字符转换为数字

NO_DATA_FOUND                        使用 select into 未返回行,或应用索引表未初始化的 

 

TOO_MANY_ROWS                      执行 select into 时,结果集超过一行

ZERO_DIVIDE                              除数为 0

SUBSCRIPT_BEYOND_COUNT     元素下标超过嵌套表或 VARRAY 的最大值

SUBSCRIPT_OUTSIDE_LIMIT       使用嵌套表或 VARRAY 时,将下标指定为负数

VALUE_ERROR                             赋值时,变量长度不足以容纳实际数据

LOGIN_DENIED                           PL/SQL 应用程序连接到 oracle 数据库时,提供了不

正确的用户名或密码

NOT_LOGGED_ON                       PL/SQL 应用程序在没有连接 oralce 数据库的情况下

访问数据

PROGRAM_ERROR                       PL/SQL 内部问题,可能需要重装数据字典& pl./SQL

系统包

ROWTYPE_MISMATCH                宿主游标变量与 PL/SQL 游标变量的返回类型不兼容

SELF_IS_NULL                             使用对象类型时,在 null 对象上调用对象方法

STORAGE_ERROR                        运行 PL/SQL 时,超出内存空间

SYS_INVALID_ID                         无效的 ROWID 字符串

TIMEOUT_ON_RESOURCE         Oracle 在等待资源时超时 

 

 

参数变量的设置

declare bb int ;
var_sta varchar(2);
begin
 
    loop
     select c_org into var_sta  from res_driver group by c_org;
     dbms_output.put_line(var_sta);
     end loop;
   /--   EXCEPTION
    /-- WHEN OTHERS THEN
     /--   dbms_output.put_line('执行出错了,老板!');

  end;

 

 

案例

create or replace procedure sp_java_staffarrangedata(arrangedate in varchar2,
    mycursor out sys_refcursor,mycursor2 out sys_refcursor,mycursor3 out sys_refcursor,
    monthStr out varchar2)
authid current_user
 as
  v_sql varchar2(200);
  v_sql1 varchar2(200);
  v_sql2 varchar2(200);
  v_sql3 varchar2(300);
  v_sql4 varchar2(300);
  lastMonth varchar2(10);
  arrDate date;
begin

  select to_char(add_months(to_date(arrangedate,'yyyy-mm'),-1),'yyyy-mm') res  into lastMonth from dual;
  select to_date(arrangedate,'yyyy-mm') retval into arrDate from dual;
  --1自动排班的时候,根据当前排班的月份,删除当前月份的上一次的排班数据
   v_sql:='delete from tml_admin_arrange_month_gather t where ';
   v_sql:= v_sql||' t.c_month='''||arrangedate||'''';
   execute immediate v_sql;
   commit;
  
   --2自动排班的时候,根据当前排班的月份,删除当前月份排班详情的所有数据
   v_sql:='delete from tml_admin_arrange_detail t where ';
   v_sql:= v_sql||' t.c_month='''||arrangedate||'''';
   execute immediate v_sql;
   commit;
 
  --3获取没有离职的清机员数据
  v_sql1:='select * from tml_admin t where t.c_status!=''3'' order by d_date desc ';
  open mycursor for(v_sql1);
 
  ---4获取老员工和新员工的搭档数据
  v_sql2:='select * from task_staff_partner_choose ';
  open mycursor2 for(v_sql2);
 
  --5获取上一个月的加班数据
   v_sql3:='select * from tml_admin_arrange_month_gather t ';
   v_sql3:= v_sql3||' where t.c_month='''||lastMonth||'''';
--   dbms_output.put_line('v_sql4:'||v_sql4);
   open mycursor3 for(v_sql3);
  
   --6获取排班月份的天数组合
   v_sql4:='select wm_concat(lpad(rownum,2,''0'')) day from dual ';
   v_sql4:= v_sql4||' connect by rownum<=to_char(last_day('''||arrDate||'''';
   v_sql4:= v_sql4||' ),''DD'') ';
--   dbms_output.put_line('v_sql4:'||v_sql4);
   execute immediate v_sql4 into monthStr;
 
end sp_java_staffarrangedata;

 

 

------------范例

CREATE OR REPLACE PROCEDURE fims.UP_BALANCE_TOTAL_COUNTRY
--///*利用外资分国别表平衡检查*/
( V_USER_DEPT_CODE          IN  VARCHAR2,
  V_REPORT_PERIOD           IN  VARCHAR2, --//要求格式YYYYMM
  V_DATA_TYPE               IN  VARCHAR2, --//数据类型:置为’2’,外商直接投资
  V_RetResult               OUT VARCHAR2,  --结果:’0’:失败,’1’:成功。
  V_RetMsg                  OUT VARCHAR2,
  RetCur                    OUT SYS_REFCURSOR
  )
AS
  V_DEPT_QUERY_CODE         VARCHAR2(10);
BEGIN

  V_RetResult := '1';
  V_RetMsg := '成功';
  V_DEPT_QUERY_CODE := UF_GET_QUERY_CODE(V_USER_DEPT_CODE);


  INSERT INTO GTMP_QUERY_SIC_BALANCE
         ( REPORT_PERIOD,DEPT_CODE,STAT_DEPT_CODE,ENTP_TYPE_CODE,
           ENTP_NUMBER,CONTRACT_INVESTMENT,ACTUAL_INVESTMENT )
  SELECT A.REPORT_PERIOD,A.DEPT_CODE,A.STAT_DEPT_CODE,A.ENTP_TYPE_CODE,
         NVL(SUM(A.ENTP_NUMBER),0),
         NVL(SUM(A.CONTRACT_INVESTMENT),0),
         NVL(SUM(A.ACTUAL_INVESTMENT),0)
  FROM T_FI_TOTAL_SUM A
  WHERE A.DEPT_CODE = V_USER_DEPT_CODE
  AND   A.REPORT_PERIOD = V_REPORT_PERIOD
  AND   SUBSTR(A.ENTP_TYPE_CODE,1,1) = V_DATA_TYPE
  GROUP BY A.REPORT_PERIOD,A.DEPT_CODE,A.STAT_DEPT_CODE,A.ENTP_TYPE_CODE;


  INSERT INTO GTMP_QUERY_SIC_BALANCE
         ( REPORT_PERIOD,DEPT_CODE,STAT_DEPT_CODE,ENTP_TYPE_CODE,
           ENTP_NUMBER_1,CONTRACT_INVESTMENT_1,ACTUAL_INVESTMENT_1 )
  SELECT A.REPORT_PERIOD,A.DEPT_CODE,A.STAT_DEPT_CODE,A.ENTP_TYPE_CODE,
         NVL(SUM(A.ENTP_NUMBER),0),
         NVL(SUM(A.CONTRACT_INVESTMENT),0),
         NVL(SUM(A.ACTUAL_INVESTMENT),0)
  FROM T_FI_TOTAL_COUNTRY A
  WHERE A.DEPT_CODE = V_USER_DEPT_CODE
  AND   A.REPORT_PERIOD = V_REPORT_PERIOD
  AND   SUBSTR(A.ENTP_TYPE_CODE,1,1) = V_DATA_TYPE
  GROUP BY A.REPORT_PERIOD,A.DEPT_CODE,A.STAT_DEPT_CODE,A.ENTP_TYPE_CODE;

 

  --//置各下级单位名称,合计行名称用“合计”
  UPDATE GTMP_QUERY_SIC_BALANCE A
  SET STAT_DEPT_NAME=(SELECT B.DEPT_NAME
                      FROM T_CODE_DEPT B
                      WHERE A.STAT_DEPT_CODE = B.DEPT_CODE);

  UPDATE GTMP_QUERY_SIC_BALANCE A
  SET ENTP_TYPE_NAME=(SELECT B.ENTP_TYPE_SHORT_NAME
                      FROM T_CODE_ENTP_TYPE B
                      WHERE A.ENTP_TYPE_CODE = B.ENTP_TYPE_CODE);


  OPEN RetCur FOR
       SELECT A.STAT_DEPT_NAME,A.ENTP_TYPE_NAME,
               NVL(SUM(A.ENTP_NUMBER),0),
               NVL(SUM(A.CONTRACT_INVESTMENT),0),
               NVL(SUM(A.ACTUAL_INVESTMENT),0),
               NVL(SUM(A.ENTP_NUMBER_1),0),
               NVL(SUM(A.CONTRACT_INVESTMENT_1),0),
               NVL(SUM(A.ACTUAL_INVESTMENT_1),0)
       FROM GTMP_QUERY_SIC_BALANCE A
       GROUP BY A.STAT_DEPT_NAME,A.ENTP_TYPE_NAME
       HAVING NVL(SUM(A.CONTRACT_INVESTMENT),0) <> NVL(SUM(A.CONTRACT_INVESTMENT_1),0)
       OR NVL(SUM(A.ACTUAL_INVESTMENT),0) <> NVL(SUM(A.ACTUAL_INVESTMENT_1),0);

 

END UP_BALANCE_TOTAL_COUNTRY;

 

---------------------------

CREATE OR REPLACE Procedure fims.UP_GET_TABLE_COL_STR_XH
(V_TableName in varchar2,
 V_ContainKey in varchar2,
 V_column_id in integer,
 V_Ret out varchar2)
as
V_columnName varchar2(30);
V_columnList sys_refcursor;
V_count integer;
Begin
  V_count := 0;
  open V_columnList for
  select column_name from user_tab_columns where table_name= V_TableName and column_id >= v_column_id order by column_id;

  Loop
     fetch V_columnList into V_columnName;
     exit when V_columnList%Notfound;
     V_count := V_count + 1;

     if (V_ContainKey = '0' and (V_count = 1 or V_Count = 2)) then
        V_count := v_count;
     else
        V_Ret := V_Ret || V_columnName || ',';
     end if;

  end loop;

  close V_columnList;

  v_ret := substr(v_ret,1,length(v_ret)-1);

End UP_GET_TABLE_COL_STR_XH;

分享到:
评论

相关推荐

    oracle存储过程学习经典入门

    Oracle 存储过程学习目录是 Oracle 存储过程学习的基础知识,了解 Oracle 存储过程的基本语法、基础知识和一些常见问题的解决方法是非常重要的。本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储...

    ORACLE存储过程学习源码

    这个"ORACLE存储过程学习源码"集合包含了从基础到高级的30个示例,是学习和掌握Oracle存储过程的理想资源。下面,我们将深入探讨存储过程的基本概念、结构、类型,以及如何通过这些源码进行学习。 1. **存储过程的...

    oracle存储过程学习经典

    ### Oracle存储过程学习经典 #### Oracle存储过程基础知识与实践 Oracle存储过程是SQL与PL/SQL结合的强大功能,用于封装复杂的数据操作逻辑于数据库内部,从而实现高效的事务处理和数据管理。以下是对Oracle存储...

    ORACLE存储过程学习

    ### ORACLE存储过程学习知识点详解 #### 一、存储过程概述 存储过程是数据库中预编译好的一组SQL语句,它可以实现复杂的数据处理逻辑,提高应用开发效率,并且能够增强应用程序的安全性。Oracle存储过程使用PL/SQL...

    oracle的存储过程学习资料

    通过这份"Oracle的存储过程学习资料",你可以系统地学习和掌握存储过程的各个方面,从而提升你在Oracle数据库管理和开发中的技能。无论是初学者还是经验丰富的DBA,这些资源都将为你的知识库增添宝贵的一笔。

    存储过程学习1

    ### 存储过程学习1:Oracle中的存储过程基础与示例 #### 一、存储过程简介 存储过程是在数据库中预编译好的SQL语句集合,它可以接受输入参数并返回输出值。存储过程的主要优点包括提高性能(通过预编译减少网络...

    oracle 存储过程学习经典

    ### Oracle存储过程学习经典知识点详解 #### 一、Oracle存储过程概述 - **定义**: 存储过程是在数据库中预编译并存储的一段SQL或PL/SQL代码块,它可以包含复杂的逻辑处理,用于实现特定的功能。存储过程提高了代码...

    DB2存储过程基础培训

    DB2存储过程基础培训

    DB2 SQL存储过程基础

    DB2 SQL存储过程基础 DB2 存储过程是指在 DB2 服务器端编写、执行的程序单元,可以实现业务逻辑、数据处理和事务控制等功能。存储过程是一种特殊的数据库对象,能够接受输入参数、执行复杂的业务逻辑、返回结果集等...

    Oracle学习开发常用的SQL和存储过程学习(内含SQL面试题目和存储过程,函数面试题目).zip

    本资源“Oracle学习开发常用的SQL和存储过程学习(内含SQL面试题目和存储过程,函数面试题目).zip”提供了全面的学习材料,旨在帮助初学者和求职者提升在Oracle数据库中的SQL查询和存储过程编写技能。 SQL...

    oracle存储过程学习经典[语法+实例+调用].doc

    ### Oracle存储过程学习经典知识点详解 #### Oracle存储过程概述与基础知识 存储过程是数据库中预编译的一系列SQL和PL/SQL语句的集合,它提供了执行复杂操作的能力,如事务处理、数据处理和错误处理。Oracle存储...

    存储过程学习经典[语法+实例+调用]

    ### Oracle存储过程学习经典知识点详解 #### 一、Oracle存储过程概述 **Oracle存储过程**是一种可以在Oracle数据库中存储并可被多次调用的程序单元。它可以包含一系列SQL语句和控制流语句,用于执行复杂的操作。...

    存储过程基础教程(MSSQL)

    **存储过程基础教程(MSSQL)** 存储过程是数据库管理系统中的一个重要概念,尤其是在Microsoft SQL Server(MSSQL)中,它们是预编译的SQL语句集合,用于执行特定任务或实现特定业务逻辑。存储过程可以理解为...

    存储过程基础教程

    存储过程是数据库管理系统中预编译的SQL语句集合,它封装了特定的数据库操作,可以理解为数据库中的可执行程序。在SQL中,存储过程是数据库...通过深入学习和实践,我们可以更好地利用存储过程来解决实际的数据库问题。

    MySQL存储过程基础教程.pdf

    开发者可以针对存储过程提出新的特性请求,同时也有许多资源可以用来学习和参考,包括官方文档、开发者社区等。 #### 18. 安装配置MySQL 5.0 文档提供了关于如何在不同操作系统上安装MySQL 5.0的信息,并包括了相关...

    MySQL存储过程入门学习

    通过本文的学习,我们了解了MySQL存储过程的基础概念、创建方法、调用方式以及如何使用参数来增强其灵活性和功能性。存储过程不仅可以帮助开发者简化复杂操作,还能提高应用程序的性能和安全性。随着进一步的学习和...

    oracle 存储过程学习总结

    Oracle存储过程学习总结涵盖了Oracle中存储过程的编写与应用,涉及到字符串处理、游标使用、PL/SQL编程等方面的知识点。 首先,字符串处理是存储过程中常见的操作。文章中提到了多个内置函数,如CONCAT用于连接字符...

    sql存储过程学习资料--总结的很全的 暴经典的资料啊

    SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集合,它是预...这份“存储过程学习资料--总结的很全的”压缩包,无疑是深入学习存储过程的好助手,无论你是初学者还是经验丰富的开发者,都能从中受益。

    oracle存储过程基础教程

    通过“Oracle存储过程学习经典[语法+实例+调用].doc”和“oracle存储过程超详细使用手册.pdf”这两个文档,你可以找到更多实际操作示例和详细的解释,进一步提升你的Oracle存储过程技能。记得理论结合实践,多编写和...

    oracle存储过程学习经典[语法+实例+调用]

    在学习Oracle存储过程时,结合详细的文档如《oracle存储过程超详细使用手册.doc》和实例资料《oracle存储过程学习经典[语法+实例+调用].doc》会非常有帮助。这些文档通常会涵盖基础语法、实例解析、调用方法、异常...

Global site tag (gtag.js) - Google Analytics