运用 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;
分享到:
相关推荐
1)掌握 ——存储过程的应用; 课程目标 存储过程举例 【例】 创建一个Bookstore数据库的存储过程,根据用户姓名和书名查询订单,如果订购册数小于5本不打折,订购册数在5-10本之间,订购单价打九折,订购册数大于10...
以下的文章主要介绍的是MySQL INSERT INTO语句的实际用法以及MySQL INSERT INTO语句中的相关语句的介绍,MySQL INSERT INTO语句在实际应用中是经常使用到的语句,所以对其相关的内容还是多多掌握为好。 INSERT [LOW...
实例277 在程序中使用存储过程 实例278 调用具有输出参数的存储过程 实例279 编写扩展存储过程 8.7 数据库结构的读取与修改 实例280 读取Access数据库结构 实例281 读取SQL Server数据库结构 8.8 图片、多媒体数据...
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’ 或者用...
--创建存储过程P_Sale3,能够根据指定的产品编号和日期,以输出参数的形式得到该产品的销售金额 CREATE PROCEDURE P_Sale3 @ProNo nvarchar(5),@SaleDate DateTime,@MONEY Decimal(8,2)OUTPUT AS SET @MONEY=( ...
默认情况下,SQL Server 将存放路径设置为其安装目录下的data子目录,单击该列中的按钮可以在打开的“定位文件夹”对话框中更改数据库的存储路径。 完成上述操作后,单击“确定”按钮关闭“新建数据库”窗口,即完成...
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际...
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际...
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际...
触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收...
据提取转化加载 (ETL),这是一种可以存储、 查询和分析存储在 Hadoop 中的大规模数据的 机制。 Hive 定义了简单的类 SQL 查询语言,称为 QL,它允许熟悉 SQL 的用户查询数据。 同时,这个语言也允许熟悉 ...
存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 (2)存储过程的基本写法...
数据库中存储过程和触发器中涉及大量的SQL语句,对SQL语句的编写规范如下: 关键字大写:在SQL语句的编写中,凡是SQL语句的关键字一律大写,如:SELECT、ORDER BY、 GROUP BY、 FROM、WHERE、 UPDATE、 INSERT INTO...
存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.9.2 准备 create table t_user ( username varchar2(20), ...
以下代码介绍了一个简单的例子,它使用两个存储过程在各个页面间进行导航: Create PROCEDURE spGetNextPage @id varchar(11) =' 0', @rows int = 0 AS SET NOCOUNT ON SET ROWCOUNT @rows Select a.au_id, a.au...
数据库中存储过程和触发器中涉及大量的SQL语句,对SQL语句的编写规范如下: 关键字大写: 在SQL语句的编写中,凡是SQL语句的关键字一律大写,如:SELECT、ORDER BY、 GROUP BY、 FROM、 WHERE、 UPDATE、 INSERT ...
通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中可以使用create procedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来...
db2 IBM DB2在企业级的应用最为广泛, 在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器。收费 大型企业 Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时...
2、 定义一个为修改职工表(emp)中某职工工资的存储过程子程序,职工名作为形参,若该职工名在职工表中查找不到,就在屏幕上提示“查无此人”然后结束子程序的执行;否则若工种为MANAGER的,则工资加$1000;工种为...
至此,test_procedure存储过程已经完成,经过编译后就可以在其他PL/SQL块或者过程中调用了。 函数与过程具有很大的相似性,此处不再详述。 编辑本段 游标 游标的定义为:用游标来指代一个DML SQL操作返回的...