`

select into 在存储过程中的运用

 
阅读更多
运用 select -- into 时可能会导致的异常:

一,no_data_found

二,too_many_rows

在存储过程中,如果有用到select into ,要捕获他可能抛出的异常,比如:

------
begin  
   select pos_type into v_postype from pos_type_tbl where 1=0;  
    dbms_output.put_line(v_postype);  
exception
  when no_data_found then  
    dbms_output.put_line('没找到数据');  
  when too_many_rows then
    dbms_output.put_line('找到多条要赋给参数的记录');
end; 
------

这样,才能保证存储过程在各种可能的情况下都能正常的走完流程,提高了其健壮性;

================================
下面再附上一个运行在真实环境下的实例:

=================================
CREATE OR REPLACE PROCEDURE "HUAXIA_PRO"
/*
    Copyright(c) John.
    Remark : First Creation (xxx 2009)
*/
(
    cd_in              IN    TBL_EW_MT_SRC.cd%TYPE,
    dscp_in            IN    TBL_EW_MT_SRC.dscp%TYPE,
    alt_dscp_in        IN    TBL_EW_MT_SRC.alt_dscp%TYPE,
    is_default_in      IN    TBL_EW_MT_SRC.is_default%TYPE,
    is_other_in        IN    TBL_EW_MT_SRC.is_other%TYPE,
    is_deactivated_in  IN    TBL_EW_MT_SRC.is_deactivated%TYPE,
    is_del_in          IN    TBL_EW_MT_SRC.is_del%TYPE,
    is_sys_in          IN    TBL_EW_MT_SRC.is_sys%TYPE,
    mt_maint_sts_cd_in IN    TBL_EW_MT_SRC.mt_maint_sts_cd%TYPE,
    created_by_in      IN    TBL_EW_MT_SRC.created_by%TYPE,
    updated_by_in      IN    TBL_EW_MT_SRC.updated_by%TYPE,
    dt_created_in      IN    TBL_EW_MT_SRC.dt_created%TYPE,
    dt_updated_in      IN    TBL_EW_MT_SRC.dt_updated%TYPE,
    version_in         IN    TBL_EW_MT_SRC.version%TYPE,
    result_cursor      OUT  TYPES.cursor_type
)
AS
    v_pk  TBL_EW_MT_SRC.cd%TYPE;

BEGIN
    SELECT    TBL_EW_MT_SRC.cd INTO v_pk
        FROM  TBL_EW_MT_SRC
        WHERE TBL_EW_MT_SRC.cd      = cd_in
        AND   TBL_EW_MT_SRC.version = version_in
        AND   TBL_EW_MT_SRC.is_sme='Y'
        FOR UPDATE NOWAIT;

    UPDATE    TBL_EW_MT_SRC
        SET
              TBL_EW_MT_SRC.dscp            = dscp_in,
              TBL_EW_MT_SRC.alt_dscp        = alt_dscp_in,
              TBL_EW_MT_SRC.is_default      = is_default_in,
              TBL_EW_MT_SRC.is_other        = is_other_in,
              TBL_EW_MT_SRC.is_deactivated  = is_deactivated_in,
              TBL_EW_MT_SRC.is_del          = is_del_in,
              TBL_EW_MT_SRC.is_sys          = is_sys_in,
              TBL_EW_MT_SRC.mt_maint_sts_cd = mt_maint_sts_cd_in,
              TBL_EW_MT_SRC.updated_by      = updated_by_in,
              TBL_EW_MT_SRC.dt_updated      = dt_updated_in,
              TBL_EW_MT_SRC.version         = USF_NEXT_VERSION(version_in)
        WHERE TBL_EW_MT_SRC.cd      = cd_in
        AND   TBL_EW_MT_SRC.version = version_in
        AND   TBL_EW_MT_SRC.is_sme='Y';

    OPEN result_cursor FOR
        SELECT 'success' AS status FROM dual;

EXCEPTION

    WHEN NO_DATA_FOUND THEN
        BEGIN
            SELECT    TBL_EW_MT_SRC.cd INTO v_pk
                FROM  TBL_EW_MT_SRC
                WHERE TBL_EW_MT_SRC.cd = cd_in
                AND   TBL_EW_MT_SRC.is_sme='Y';
            ERR.RAISE_ERR(ERR.UPDATED_BY_OTHER_USER);

        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                ERR.RAISE_ERR(ERR.DELETED_BY_OTHER_USER);
        END;
   
    WHEN TOO_MANY_ROWS THEN
        ERR.RAISE_ERR(ERR.UNIQUE_CONSTRAIT);
   
    WHEN ERR.RECORD_IS_LOCKED THEN
        ERR.RAISE_ERR(ERR.UPDATED_BY_OTHER_USER);

    WHEN OTHERS THEN
        RAISE;

END;
分享到:
评论

相关推荐

    MySQL数据库:存储过程举例.pptx

    1)掌握 ——存储过程的应用; 课程目标 存储过程举例 【例】 创建一个Bookstore数据库的存储过程,根据用户姓名和书名查询订单,如果订购册数小于5本不打折,订购册数在5-10本之间,订购单价打九折,订购册数大于10...

    正确使用MySQL INSERT INTO语句

    以下的文章主要介绍的是MySQL INSERT INTO语句的实际用法以及MySQL INSERT INTO语句中的相关语句的介绍,MySQL INSERT INTO语句在实际应用中是经常使用到的语句,所以对其相关的内容还是多多掌握为好。 INSERT [LOW...

    Visual C++程序开发范例宝典 - 第8章

    实例277 在程序中使用存储过程 实例278 调用具有输出参数的存储过程 实例279 编写扩展存储过程 8.7 数据库结构的读取与修改 实例280 读取Access数据库结构 实例281 读取SQL Server数据库结构 8.8 图片、多媒体数据...

    PgSQl临时表创建及应用实例解析

    select * into temp table tmp0 from xxx create index idx_tmp0_inner_cd on tmp0(inner_cd); 查看临时表是否创建,返回0表示未创建,1为创建 select count(*) from pg_class where relname = ‘tmp0’  或者用...

    SQL sever 实训

    --创建存储过程P_Sale3,能够根据指定的产品编号和日期,以输出参数的形式得到该产品的销售金额 CREATE PROCEDURE P_Sale3 @ProNo nvarchar(5),@SaleDate DateTime,@MONEY Decimal(8,2)OUTPUT AS SET @MONEY=( ...

    数据库原理实验报告整合

    默认情况下,SQL Server 将存放路径设置为其安装目录下的data子目录,单击该列中的按钮可以在打开的“定位文件夹”对话框中更改数据库的存储路径。 完成上述操作后,单击“确定”按钮关闭“新建数据库”窗口,即完成...

    经典SQL语句大全

    注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际...

    数据库操作语句大全(sql)

    注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际...

    sql经典语句一部分

    注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际...

    Oraclet中的触发器

    触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收...

    Hive用户指南(Hive_user_guide)_中文版.pdf

    据提取转化加载 (ETL),这是一种可以存储、 查询和分析存储在 Hadoop 中的大规模数据的 机制。 Hive 定义了简单的类 SQL 查询语言,称为 QL,它允许熟悉 SQL 的用户查询数据。 同时,这个语言也允许熟悉 ...

    sql总结.doc

    存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 (2)存储过程的基本写法...

    SQLServer数据库设计规范.txt

    数据库中存储过程和触发器中涉及大量的SQL语句,对SQL语句的编写规范如下: 关键字大写:在SQL语句的编写中,凡是SQL语句的关键字一律大写,如:SELECT、ORDER BY、 GROUP BY、 FROM、WHERE、 UPDATE、 INSERT INTO...

    SQL培训第一期

    存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.9.2 准备 create table t_user ( username varchar2(20), ...

    SQL实际应用面试题

    以下代码介绍了一个简单的例子,它使用两个存储过程在各个页面间进行导航: Create PROCEDURE spGetNextPage @id varchar(11) =' 0', @rows int = 0 AS SET NOCOUNT ON SET ROWCOUNT @rows Select a.au_id, a.au...

    数据库设计参考模板.doc

    数据库中存储过程和触发器中涉及大量的SQL语句,对SQL语句的编写规范如下: 关键字大写: 在SQL语句的编写中,凡是SQL语句的关键字一律大写,如:SELECT、ORDER BY、 GROUP BY、 FROM、 WHERE、 UPDATE、 INSERT ...

    OraclePLSQL编程经典例子

    通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中可以使用create procedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    db2 IBM DB2在企业级的应用最为广泛, 在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器。收费 大型企业 Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时...

    oracle实验报告

    2、 定义一个为修改职工表(emp)中某职工工资的存储过程子程序,职工名作为形参,若该职工名在职工表中查找不到,就在屏幕上提示“查无此人”然后结束子程序的执行;否则若工种为MANAGER的,则工资加$1000;工种为...

    PL/SQL Developer8.04官网程序_keygen_汉化

     至此,test_procedure存储过程已经完成,经过编译后就可以在其他PL/SQL块或者过程中调用了。  函数与过程具有很大的相似性,此处不再详述。 编辑本段 游标  游标的定义为:用游标来指代一个DML SQL操作返回的...

Global site tag (gtag.js) - Google Analytics