动态游标,动态SQL

create or replace procedure PRO_AJ_GB_JBXX
(p_tablename in varchar2,p_zhsjc in date,P_SJW IN VARCHAR2)

is

v_ajbh aj_gb_jbxx.ajbh%type;
v_zab aj_gb_jbxx.zab%type;
v_fab1 aj_gb_jbxx.fab1%type;
v_fab2 aj_gb_jbxx.fab2%type;
v_fasjsx aj_gb_jbxx.fasjsx%type;
v_fasjxx aj_gb_jbxx.fasjxx%type;
v_fadqh aj_gb_jbxx.fadqh%type;
v_fadxz aj_gb_jbxx.fadxz%type;
v_fadzbh aj_gb_jbxx.fadzbh%type;
v_fxsj aj_gb_jbxx.fxsj%type;
v_ladw aj_gb_jbxx.ladw%type;
v_larq aj_gb_jbxx.larq%type;
v_cbdw aj_gb_jbxx.cbdw%type;
v_aqms aj_gb_jbxx.aqms%type;
v_ywgl aj_gb_jbxx.ywgl%type;
v_zhsjc aj_gb_jbxx.zhsjc%type;
V_SFWK NUMBER;
v_sfzx varchar2(5);

TYPE CURSOR_XX IS REF CURSOR;
CC CURSOR_XX;
begin

OPEN CC FOR 'select ajbh, zab, fab1, fab2, fasjsx, fasjxx, fadqh, fadxz, fadzbh, fxsj, ladw, larq, cbdw, aqms, ywgl, zhsjc from
'||p_tablename||' where zhsjc >= :1 and zhsjc <= ( select max(zhsjc) from '||p_tablename||')' using p_zhsjc;
LOOP
FETCH CC INTO v_ajbh, v_zab, v_fab1, v_fab2, v_fasjsx, v_fasjxx, v_fadqh, v_fadxz, v_fadzbh, v_fxsj, v_ladw, v_larq, v_cbdw, v_aqms, v_ywgl, v_zhsjc;
EXIT WHEN CC%NOTFOUND;

SELECT COUNT(*) INTO V_SFWK FROM AJ_GB_JBXX WHERE ajbh = V_ajbh;
if v_sfzx = '0' or v_sfzx is null then
IF V_SFWK <= 0 THEN
insert into aj_gb_jbxx (ajbh, zab, fab1, fab2, fasjsx, fasjxx, fadqh, fadxz, fadzbh, fxsj, ladw, larq, cbdw, aqms, ywgl, zhsjc)
values (v_ajbh, v_zab, v_fab1, v_fab2, v_fasjsx, v_fasjxx, v_fadqh, v_fadxz, v_fadzbh, v_fxsj, v_ladw, v_larq, v_cbdw, v_aqms, v_ywgl, v_zhsjc);

ELSE
IF P_SJW <> '1' THEN
UPDATE aj_gb_jbxx SET YWGL= '31' WHERE ajbh = V_ajbh;

ELSE
UPDATE aj_gb_jbxx SET ajbh=v_ajbh, zab=v_zab, fab1=v_fab1, fab2=v_fab2, fasjsx=v_fasjsx,
fasjxx=v_fasjxx, fadqh=v_fadqh, fadxz=v_fadxz, fadzbh=v_fadzbh, fxsj=v_fxsj, ladw=v_ladw,
larq=v_larq, cbdw=v_cbdw, aqms=v_aqms,ywgl= '31', zhsjc=v_zhsjc WHERE ajbh = V_ajbh;

END IF;
END IF;
else
IF V_SFWK <= 0 THEN
insert into aj_gb_jbxx (ajbh, zab, fab1, fab2, fasjsx, fasjxx, fadqh, fadxz, fadzbh, fxsj, ladw, larq, cbdw, aqms, ywgl, zhsjc)
values (v_ajbh, v_zab, v_fab1, v_fab2, v_fasjsx, v_fasjxx, v_fadqh, v_fadxz, v_fadzbh, v_fxsj, v_ladw, v_larq, v_cbdw, v_aqms, v_ywgl, v_zhsjc);

ELSE
IF P_SJW <> '1' THEN
UPDATE aj_gb_jbxx SET YWGL= '31' WHERE ajbh = V_ajbh;

ELSE
UPDATE aj_gb_jbxx SET ajbh=v_ajbh, zab=v_zab, fab1=v_fab1, fab2=v_fab2, fasjsx=v_fasjsx,
fasjxx=v_fasjxx, fadqh=v_fadqh, fadxz=v_fadxz, fadzbh=v_fadzbh, fxsj=v_fxsj, ladw=v_ladw,
larq=v_larq, cbdw=v_cbdw, aqms=v_aqms,ywgl= '31', zhsjc=v_zhsjc WHERE ajbh = V_ajbh;

END IF;
END IF;
end if;
END LOOP;
CLOSE CC;
end PRO_AJ_GB_JBXX;

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8345941/viewspace-953448/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8345941/viewspace-953448/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
游标动态SQL拼接是一种将游标动态SQL语句结合使用的技术,可以根据需要动态生成SQL语句,从而实现更加灵活的数据库操作。具体实现步骤如下: 1. 定义游标:使用DECLARE CURSOR语句定义游标,指定需要遍历的数据集合。 2. 定义变量:使用DECLARE语句定义需要使用的变量,例如存储表名、SQL语句等。 3. 打开游标:使用OPEN语句打开游标,开始遍历数据集合。 4. 循环遍历:使用FETCH语句循环遍历游标,获取每一条记录。 5. 动态SQL拼接:根据需要动态拼接SQL语句,可以使用CONCAT函数将多个字符串拼接在一起。 6. 执行SQL语句:使用PREPARE语句将动态生成的SQL语句准备好,然后使用EXECUTE语句执行SQL语句。 7. 关闭游标:使用CLOSE语句关闭游标,释放资源。 8. 提交事务:使用COMMIT语句提交事务,确保数据操作的一致性。 下面是一个示例存储过程,演示了如何使用游标动态SQL拼接来清空数据库中的所有表(除了以t_开头的表和comp表): ```mysql CREATE PROCEDURE `CleanDb`() BEGIN DECLARE nodata int DEFAULT 0; DECLARE tnm VARCHAR(128); DECLARE cnt int DEFAULT 0; DECLARE sql_str VARCHAR(2000); DECLARE cur_tbls CURSOR FOR SELECT DISTINCT table_name from information_schema.`TABLES` WHERE TABLE_schema = 'db_dl' ORDER BY table_name; DECLARE CONTINUE handler for not found set nodata = 1; OPEN cur_tbls; ll:LOOP FETCH cur_tbls INTO tnm; IF nodata = 1 THEN LEAVE ll; END IF; SET sql_str = ''; IF tnm NOT LIKE 't_%' AND tnm <> 'comp' THEN SET sql_str = CONCAT('DROP TABLE ',tnm,';'); SET @sql = sql_str; PREPARE s1 FROM @sql; EXECUTE s1; DEALLOCATE PREPARE s1; END IF; END LOOP; COMMIT; SELECT CONCAT('完了',cnt); CLOSE cur_tbls; END ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值