ORACLE 存储过程的一点疑问

Sauron_龙小奔 2019-01-21 11:15:05
CREATE OR REPLACE PROCEDURE APP_MANAGER.PB_EQUIP_SUBMIT(Y IN VARCHAR2,M IN VARCHAR2) AS

CURSOR CS IS
SELECT FACILITY_NO
,DEPRECIATION_THIS_MONTH
,SERVICE_LIFE
,UNUSED_LIFE
,ACCUMULATIVE_DEPRECIATION
,CURRENT_VALUE
FROM APP_MANAGER.SB_DEPRECIATION_2019
WHERE SEQ_ID LIKE '%'||Y||M;


BEGIN
FOR C IN CS LOOP
BEGIN

UPDATE APP_MANAGER.ASSET_EQUIP_FACILITY
SET DEPRECIATION_THIS_MONTH = C.DEPRECIATION_THIS_MONTH
,SERVICE_LIFE = C.SERVICE_LIFE
,ACCUMULATIVE_DEPRECIATION = C.ACCUMULATIVE_DEPRECIATION
,CURRENT_VALUE = C.CURRENT_VALUE
WHERE FACILITY_NO = C.FACILITY_NO;

END;
END LOOP;
END PB_EQUIP_SUBMIT;

现在这个存储过程是可以运行的。

参数Y是年,M是月,我上面有个2019是写死的,我想把2019替换成Y,如何实现呢??求完整代码。
...全文
245 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
djkhym 2019-01-24
  • 打赏
  • 举报
回复
参考使用字符串的命令执行方式,形成拼接的sql语句:
https://www.cnblogs.com/senyier/p/7801350.html
======================================
上述这篇文章可参考下
=========================
Sauron_龙小奔 2019-01-23
  • 打赏
  • 举报
回复
顶起来,来大手解决问题。
nayi_224 2019-01-23
  • 打赏
  • 举报
回复
引用 6 楼 Sauron_龙小奔 的回复:
引用 5 楼 nayi_224 的回复:
2L不是已经解决了?
没有啊 好多2019没写活啊
那些2019只是用来定义数据类型的,表名已经改为动态获取了。
Sauron_龙小奔 2019-01-23
  • 打赏
  • 举报
回复
引用 5 楼 nayi_224 的回复:
2L不是已经解决了?
没有啊 好多2019没写活啊
nayi_224 2019-01-23
  • 打赏
  • 举报
回复
2L不是已经解决了?
Sauron_龙小奔 2019-01-21
  • 打赏
  • 举报
回复
上面的那些2019也是活的。
滇中倦客 2019-01-21
  • 打赏
  • 举报
回复
使用动态游标


CREATE OR REPLACE PROCEDURE APP_MANAGER.PB_EQUIP_SUBMIT(Y IN VARCHAR2,
M IN VARCHAR2,
P_Y IN VARCHAR2) AS
TYPE REF_CURSOR_TYPE IS REF CURSOR;
V_CUR_C REF_CURSOR_TYPE;
V_FACILITY_NO APP_MANAGER.SB_DEPRECIATION_2019.FACILITY_NO%TYPE;
V_DEPRECIATION_THIS_MONTH APP_MANAGER.SB_DEPRECIATION_2019.DEPRECIATION_THIS_MONTH%TYPE;
V_SERVICE_LIFE APP_MANAGER.SB_DEPRECIATION_2019.SERVICE_LIFE%TYPE;
V_UNUSED_LIFE APP_MANAGER.SB_DEPRECIATION_2019.UNUSED_LIFE%TYPE;
V_ACCUMULATIVE_DEPRECIATION APP_MANAGER.SB_DEPRECIATION_2019.ACCUMULATIVE_DEPRECIATION%TYPE;
V_CURRENT_VALUE APP_MANAGER.SB_DEPRECIATION_2019.CURRENT_VALUE%TYPE;

CURSOR CS IS
SELECT FACILITY_NO,
DEPRECIATION_THIS_MONTH,
SERVICE_LIFE,
UNUSED_LIFE,
ACCUMULATIVE_DEPRECIATION,
CURRENT_VALUE
FROM APP_MANAGER.SB_DEPRECIATION_2019
WHERE SEQ_ID LIKE '%' || Y || M;

BEGIN
OPEN V_CUR_C FOR 'SELECT FACILITY_NO,
DEPRECIATION_THIS_MONTH,
SERVICE_LIFE,
UNUSED_LIFE,
ACCUMULATIVE_DEPRECIATION,
CURRENT_VALUE
FROM APP_MANAGER.SB_DEPRECIATION_' || P_Y || 'WHERE SEQ_ID LIKE ''%''||' || Y || '||' || M;
FETCH V_CUR_C
INTO V_FACILITY_NO,
V_DEPRECIATION_THIS_MONTH,
V_SERVICE_LIFE,
V_UNUSED_LIFE,
V_ACCUMULATIVE_DEPRECIATION,
V_CURRENT_VALUE;
WHILE V_CUR_C%FOUND LOOP

UPDATE APP_MANAGER.ASSET_EQUIP_FACILITY
SET DEPRECIATION_THIS_MONTH = V_DEPRECIATION_THIS_MONTH,
SERVICE_LIFE = V_SERVICE_LIFE,
ACCUMULATIVE_DEPRECIATION = V_ACCUMULATIVE_DEPRECIATION,
CURRENT_VALUE = V_CURRENT_VALUE
WHERE FACILITY_NO = V_FACILITY_NO;

FETCH V_CUR_C
INTO V_FACILITY_NO,
V_DEPRECIATION_THIS_MONTH,
V_SERVICE_LIFE,
V_UNUSED_LIFE,
V_ACCUMULATIVE_DEPRECIATION,
V_CURRENT_VALUE;
END LOOP;
CLOSE V_CUR_C;
EXCEPTION
WHEN OTHERS THEN
CLOSE V_CUR_C;
RAISE;
END PB_EQUIP_SUBMIT;
Mricoo_周 2019-01-21
  • 打赏
  • 举报
回复
你这个因为表名也要用参数,所以得用动态SQL

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧