首页 > 数据库 >Oracle PL/SQL 循环批量执行存储过程

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

时间:2024-07-08 12:56:20浏览次数:18  
标签:head END name SQL rec2 crlf sql Oracle PL

1. 查询存储过程

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

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

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

3. 动态执行

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

4. 输出执行信息

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

SET SERVEROUTPUT ON;
DECLARE
    v_sql          varchar2(32767);
    v_head         varchar2(32767);
    v_tail         varchar2(32767);
	n_count        number := 0;
    crlf           constant    varchar2(4) := chr(13) || chr(10);
BEGIN
    FOR rec1 IN (
        SELECT object_name
          FROM USER_OBJECTS
         WHERE OBJECT_TYPE = 'PROCEDURE'
         ORDER BY 1)
    LOOP
        v_sql := null;
        v_head := null;
        v_tail := null;

        ------------------------------------------
        -- Header
        ------------------------------------------
        v_head := v_head || 'DECLARE' || crlf;
        FOR rec3 IN (
            SELECT CASE data_type
                       WHEN 'DATE' THEN
                           '    d_out' || position || '    date;'
                       ELSE
                           '    v_out' || position || '    varchar2(1000);'
                   END var
              FROM user_arguments
             WHERE object_name = rec1.object_name
               AND in_out <> 'IN'
             ORDER BY position)
        LOOP
            v_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_arguments
             WHERE object_name = rec1.object_name
             ORDER BY position) 
        LOOP
            --*****************************
            -- set in parameter
            IF rec2.in_out = 'IN' then
                IF rec2.position = 1 then
                    IF rec2.data_type = 'DATE' THEN
                        v_sql := v_sql || '        ' || rec2.argument_name || ' => SYSDATE' || crlf;
                    ELSE
                        v_sql := v_sql || '        ' || rec2.argument_name || ' => 1'       || crlf;
                    END IF;
                ELSE
                    IF rec2.data_type = 'DATE' THEN
                        v_sql := v_sql || '      , ' || rec2.argument_name || ' => SYSDATE' || crlf;
                    ELSE
                        v_sql := v_sql || '      , ' || rec2.argument_name || ' => 1'       || crlf;
                    END IF;
                END IF;
            -- set out parameter
            ELSE
                 IF rec2.position = 1 then
                    IF rec2.data_type = 'DATE' THEN
                        v_sql := v_sql || '        ' || rec2.argument_name || ' => d_out' || rec2.position || crlf;
                    ELSE
                        v_sql := v_sql || '        ' || rec2.argument_name || ' => v_out' || rec2.position || crlf;
                    END IF;
                ELSE
                    IF rec2.data_type = 'DATE' THEN
                        v_sql := v_sql || '      , ' || rec2.argument_name || ' => d_out' || rec2.position || crlf;
                    ELSE
                        v_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);
        BEGIN
			n_count := n_count + 1;
            EXECUTE IMMEDIATE v_head || v_sql || v_tail;
            DBMS_OUTPUT.PUT_LINE(LPAD(n_count, 3, '0') || '_存储过程:' || rec1.object_name || '执行成功。');
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE(LPAD(n_count, 3, '0') ||'_存储过程:' || rec1.object_name || '执行失败。');
        END;
    END LOOP;
    ROLLBACK;
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        RAISE;
END;
/

标签:head,END,name,SQL,rec2,crlf,sql,Oracle,PL
From: https://blog.csdn.net/wuchunyu002/article/details/140265344

相关文章

  • 基于VPLC532E开放式数控系统在五轴义齿机上的应用
    市场应用背景随着中国口腔医学的进步及人民生活质量和消费水平的提升,人们对医疗技术和服务的期望不断提高,从而推动了对高端优质口腔医疗设备和材料的需求日益增加。特别是在义齿机市场,增长主要由人口老龄化导致的牙齿脱落、牙科铣床需求的增加、对CAD/CAM牙科铣床的认识......
  • Mybatis-plus
    Mapper接口:定义一个Mapper接口,继承自MyBatis-Plus的 BaseMapper 接口,这样你就可以使用MyBatis-Plus提供的各种方法了。java复制代码 packagebjdx.example.mapper;   importbjdx.example.entity.User; importcom.baomidou.mybatisplus.c......
  • oracle控制台创建表空间,用户名
    1、打开doc命令行窗口,通过sqlplus/assysdba输入用户名密码进入>sql2、将下列的”用户名“、”密码“、”表空间名“替换称自己的,不允许出现中文,尽量用大写,避免奇怪的问题---删除用户dropuser用户名cascade;--删除表空间droptablespace表空间名includingcontentsan......
  • windows版Oracle11g安装记录
    一、下载Oracle 11g数据库安装包已上传至博客园文件中二、安装Oracle11g下载下来是下图这样的两个压缩包:1、解压这两个压缩包到同一个文件夹(切记路径文件不可有中文、空格和不规则字符。):2、将解压好的win64_11gR2_database_2of2\database\stage\Components下的所有文件拷......
  • element-plus自定义弹框头背景色
    1.效果如下:弹框头部定制背景色;关闭按钮和标题对齐;鼠标悬浮关闭按钮颜色变浅。2.用到element-plus版本:  "element-plus":"2.7.6",3.具体思路:整个弹框的背景色改成蓝色,padding:0;header、body、footer背景色改成白色,字体黑色不变;padding给20px;关闭按钮高度......
  • oracle 表数据指定表字段,并筛选出重复项
    之前线上遇到了个问题,需要临时处理一下同步过来的数据,删除重复项,当时没写出来这个sql,泪目.....正好空下来了,理一下怎么写这个sqlsql主要用到的还是row_number这个函数,他会为根据指定条件,每行数据分配一个序号语法格式:row_number()over(partitionby分组列orderby排序列d......
  • 开源数据库Greenplu突然闭源?GaussDB(DWS)提供数仓新可能
    本文分享自华为云社区《开源数据库Greenplum人去楼空?GaussDB(DWS)提供数仓新可能》,作者:起个名字11111。近日Greenplum关闭GitHub源码事件在数仓行业广受关注,代码业界纷纷猜测Greenplum即将闭源。作为一款典型的OLAP数据库,Greenplum的闭源势必带来数仓市场格局的调整与变化。国......
  • Mysql数据同步ES的4种方式
    1、同步双写 通过应用服务,直接为数据库及ES写如数据。 优点:业务逻辑简单;实时性高缺点:业务耦合,耦合大量数据同步代码硬编码,有需要写入MySQL的地方都需要添加写入ES的代码;影响性能,写入两个存储,响应时间变长不便扩展:搜索可能有一些个性化需求,需要对数据进行聚合,这......
  • windows mysql执行sql文件
    背景快速导入数据表或者数据库。解决直接执行sql文件。虽然直接复制内容也行,但是还是执行文件更好一些。登录mysql-uroot-p-Dxxx-D指定数据库的名称。如果不写,可以在进入mysql命令行后,使用usexxx来使用数据库。执行sourcexxx.sql特别注意,哪怕路径里有空......
  • Spring Boot3整合Mybatis Plus,数据库为MySQL
    项目结构如下:注意不需要任何XML文件1.导入依赖除了SpringBoot创建时自带的依赖,还需要加入:<!--MybatisPlus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version&g......