当前位置: 首页 > news >正文

Oracle PL/SQL 循环批量执行存储过程

1. 查询存储过程

        根据数据字典USER_OBJECTS查询出所有存储过程。

2. 动态拼接字符串(参数等)

        根据数据字典USER_ARGUMENTS动态拼接参数。

3. 动态执行

        利用EXECUTE IMMEDIATE动态执行无名块。

4. 输出执行信息

        利用DBMS_OUTPUT.PUT_LINE输出执行成功与否信息。

SET SERVEROUTPUT ON;
DECLAREv_sql          varchar2(32767);v_head         varchar2(32767);v_tail         varchar2(32767);n_count        number := 0;crlf           constant    varchar2(4) := chr(13) || chr(10);
BEGINFOR rec1 IN (SELECT object_nameFROM USER_OBJECTSWHERE OBJECT_TYPE = 'PROCEDURE'ORDER BY 1)LOOPv_sql := null;v_head := null;v_tail := null;-------------------------------------------- Header------------------------------------------v_head := v_head || 'DECLARE' || crlf;FOR rec3 IN (SELECT CASE data_typeWHEN 'DATE' THEN'    d_out' || position || '    date;'ELSE'    v_out' || position || '    varchar2(1000);'END varFROM user_argumentsWHERE object_name = rec1.object_nameAND in_out <> 'IN'ORDER BY position)LOOPv_head := v_head || rec3.var || crlf;END LOOP;v_head := v_head || 'BEGIN' || crlf;v_head := v_head || '    ' || rec1.object_name || '('  || crlf;-------------------------------------------- Process------------------------------------------FOR rec2 IN (SELECT *FROM user_argumentsWHERE object_name = rec1.object_nameORDER BY position) LOOP--*****************************-- set in parameterIF rec2.in_out = 'IN' thenIF rec2.position = 1 thenIF rec2.data_type = 'DATE' THENv_sql := v_sql || '        ' || rec2.argument_name || ' => SYSDATE' || crlf;ELSEv_sql := v_sql || '        ' || rec2.argument_name || ' => 1'       || crlf;END IF;ELSEIF rec2.data_type = 'DATE' THENv_sql := v_sql || '      , ' || rec2.argument_name || ' => SYSDATE' || crlf;ELSEv_sql := v_sql || '      , ' || rec2.argument_name || ' => 1'       || crlf;END IF;END IF;-- set out parameterELSEIF rec2.position = 1 thenIF rec2.data_type = 'DATE' THENv_sql := v_sql || '        ' || rec2.argument_name || ' => d_out' || rec2.position || crlf;ELSEv_sql := v_sql || '        ' || rec2.argument_name || ' => v_out' || rec2.position || crlf;END IF;ELSEIF rec2.data_type = 'DATE' THENv_sql := v_sql || '      , ' || rec2.argument_name || ' => d_out' || rec2.position || crlf;ELSEv_sql := v_sql || '      , ' || rec2.argument_name || ' => v_out' || rec2.position || crlf;END IF;END IF;END IF;END LOOP;-------------------------------------------- Tail------------------------------------------v_tail := v_tail || '    );' || crlf;v_tail := v_tail || 'END;' || crlf;-------------------------------------------- Execute SQL--------------------------------------------dbms_output.put_line(v_head || v_sql || v_tail);BEGINn_count := n_count + 1;EXECUTE IMMEDIATE v_head || v_sql || v_tail;DBMS_OUTPUT.PUT_LINE(LPAD(n_count, 3, '0') || '_存储过程:' || rec1.object_name || '执行成功。');EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(LPAD(n_count, 3, '0') ||'_存储过程:' || rec1.object_name || '执行失败。');END;END LOOP;ROLLBACK;
EXCEPTIONWHEN OTHERS THENROLLBACK;RAISE;
END;
/

http://www.lryc.cn/news/394859.html

相关文章:

  • kafka 生产者
  • Powershell 获取电脑保存的所有wifi密码
  • golang结合neo4j实现权限功能设计
  • java 参数传递(尤其注意参数是对象的情况)
  • 拼音字符串相似度
  • 如何创建一个基本的Mojolicious Web应用:探索Perl的现代Web框架
  • FPGA/数字IC复习八股
  • Android 简单快速实现 下弧形刻度尺(滑动事件)
  • 【Go】常见的变量与常量
  • Qt使用sqlite数据库及项目实战
  • 开源模型应用落地-FastAPI-助力模型交互-进阶篇(一)
  • 精准选择广告工具,提升推广效果
  • Swagger的原理及应用详解(六)
  • 世界人工智能大会今日开幕:人工智能如何成为引领发展的新引擎
  • tinyshop项目部署
  • Gemini for China 大更新,现已上架 Android APP!
  • Unity渲染管线介绍
  • 【UML用户指南】-31-对体系结构建模-制品图
  • 《基于 Kafka + Flink + ES 实现危急值处理措施推荐和范围校准》
  • 计算机的进制转换
  • String类(STL开始)
  • 【数据结构】单链表:数据结构中的舞者,穿梭于理论与实践的舞池
  • html三级菜单
  • 【人工智能】—基于成都市各区(市)县租房价格预测建模研究
  • 3213. 最小代价构造字符串
  • 提取重复数据
  • Go语言标准库之log和三方库zap
  • Linux:进程终止和进程替换
  • 使用Java实现异步消息处理与队列消费
  • 使用C++实现ATM系统,谈谈思路及代码实现