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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值