穿梭机丶 2023-03-01 17:15 采纳率: 75%
浏览 69
已结题

判断字段值后自动导出查询结果


DECLARE
  CURSOR c_tables IS SELECT table_name FROM user_tables;--定义隐式游标
  v_name VARCHAR2(100);
  v_query VARCHAR2(200);
  v_filename VARCHAR2(100); --构建查询语句

BEGIN
  FOR t IN c_tables LOOP
      v_name:=t.table_name; --获取当前数据库表的名字,并赋值给v_name,用于后期的工作簿赋值
      IF NOT EXISTS (SELECT * FROM ALL_TAB_COLUMNS WHERE column_name='name') THEN
         v_filename:='F:\backup\12313\' || v_name || '.xlsx';  --创建工作簿命名
              SELECT * FROM TABLE(DBMS_XSLFORMAT.OPENWORKBOOK('xlsx',v_filename))
              WHERE  sheet_name= r.name --查询指定名称的工作簿是否存在,如果不存在就创建
              UNION ALL          ---将当前工作表添加到工作簿中
              SELECT * FROM TABLE(DBMS_XSLFORMAT.OPENWORKSHEET('xlsx',t.table_name))--新建sheet,给当前工作簿的活动sheet命名为关键字段的值
              WHERE 1=0; --必然不符合条件,纯粹为了创建和原库表字段结构一致的空sheet
              DBMS_XSLFORMAT.STARTROW(); --开始新的一行-等
              DBMS_XSLFORMAT.ADDCELL(v_name); --向工作表中添加单元格,并写入数据
              DBMS_XSLFORMAT.ADDCELL(r.name); --看不懂
      ELSE
          v_query:='SELECT * FROM'|| v_name ||'WHERE name=:1 '; --构建SQL查询语句,用于动态获取当前库表的数据
          FOR r IN (SELECT DISTINCT 行政区划名称 FROM v_name) LOOP   --关键字段的去重值作为临时数组,用于后期的excel工作簿命名和划分
              
              v_filename:='F:\backup\123\' || v_name || '.xlsx';  --创建工作簿命名
              SELECT * FROM TABLE(DBMS_XSLFORMAT.OPENWORKBOOK('xlsx',v_filename))  --table()用于创建制定路径工作簿并赋值给table数组
              WHERE  sheet_name= r.name --查询指定名称的工作簿是否存在,如果不存在就创建
              UNION ALL          ---将当前工作表添加到工作簿中
              SELECT * FROM TABLE(DBMS_XSLFORMAT.OPENWORKSHEET('xlsx',r.name))--新建sheet,给当前工作簿的活动sheet命名为关键字段的值
              WHERE 1=0; --必然不符合条件,纯粹为了创建和原库表字段结构一致的空sheet
              DBMS_XSLFORMAT.STARTROW(); --开始新的一行
              DBMS_XSLFORMAT.ADDCELL(v_name); --向工作表中添加单元格,并写入数据
              DBMS_XSLFORMAT.ADDCELL(r.name);
              
              FOR  row IN (SELECT * FROM TABLE(DBMS_SQL.execute(v_query,r.name))) LOOP  --是在当前库表执行v_query赋值的sql语句,筛选r.name的关键字段数据,遍历查询结果,并向工作表添加数据
                FOR i IN 1 TO ROW.COUNT LOOP --遍历当前行的所有列,row.count是当前行的列数上限
                  DBMS_XSLFORMAT.ADDCELL(ROW(i));--当前工作表中添加单元格,并写入数据
                END LOOP;
              END LOOP;
              DBMS_XSLFORMAT.ENDROW(); --结束当前行
            END LOOP;
            DBMS_XSLFORMAT.CLOSHEET(); --
     END IF;--这里的分号,猜测加的       
   END LOOP;      
END;

以上代码是在ORACLE运行报错的。各种报错。请各位big old代为检查。以下是一些需求:
其实是我上一个问题的延续,上一个问题没完全解决。
基本情况:名为DB的库(user)内存在T1,T2,T3……等多个表,一些表有一个Name字段。
目标:T1,T2,T3……中按NAME的不同分别筛选出结果,并将结果导出成一个excel表。如每个表中都存在“张三、李四……”多个名字,多个表按张三搜索,多个表的结果按指定路径导出成“张三”一个工作簿。
目标:
(一)导出Excel表
1.判断一个表字段是否存在Name字段,如果没有则作为公共表,如果有name字段就作为私有表。按私有表中的值作为文件夹命名,每个文件夹中均有公共表的工作簿,各种私有表作为1个工作簿,需要注意的是有些私有表超过100行,导出Excel的sheet按80万行一个sheet,命名就后面加(1)(2)……;
2. 以上代码算是完成了大部分目标,请按1要求修改;或者有更简洁的代码也可以提出,另外请加注释,本人little white;
(二)导出dmp文件
相对于Excel,导出dump就要求低点,假定事先知道name有“张三、李四、王五……”
1..判断一个表字段是否存在Name字段,如果没有则作为公共表,如果有name字段就作为私有表。按照"张三、李四、王五……”建立用户,每个用户名下均有公共表,且有按name划分的各种私有表。
2.在指定路径建立按“张三、李四、王五……”划分的文件夹,并在对应文件夹中导出对应的用户dmp文件;
3.以上代码跟第二点关系不大,请各位big old以第二点为重点吧。代码一定要有注释啊,最好能有知识点介绍。像上面代码“DBMS_XSLFORMAT”我怎么也找不到介绍,实在不懂。

上个问题付过费了,这次我也悬赏吧,希望能彻底解决。

img

  • 写回答

5条回答 默认 最新

  • MarkHan_ 2023-03-01 17:23
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    这段代码是一个PL/SQL存储过程,主要功能是动态查询数据库中所有的表,并根据表的结构和字段值将查询结果导出到指定的Excel工作簿中。

    具体实现的流程如下:

    1. 首先定义一个隐式游标,用于获取所有用户表的表名。
    2. 进入循环,对于每个表名,判断该表是否存在名为“name”的列,如果不存在,则在指定路径下创建以表名命名的Excel工作簿,并在其中创建一个名为表名的工作表,将表名写入该工作表中。
    3. 如果表中存在名为“name”的列,则动态构建SQL查询语句,用于获取该表中所有“name”列的不重复值。然后对于每个不重复的“name”值,创建一个以表名命名的Excel工作簿,并在其中创建一个名为“name”的工作表,将表名和“name”值写入该工作表中。
    4. 接下来,执行动态构建的SQL查询语句,将查询结果遍历并写入对应的工作表中,遍历过程中使用DBMS_XSLFORMAT.ADDCELL()函数将单元格数据写入Excel中。
    5. 最后,关闭工作表并结束循环。

    需要注意的是,代码中可能存在一些错误,例如:

    1. 在第14行和第29行中,变量名使用了字符串拼接符“||”,但没有加空格,应该改为“SELECT * FROM ” || v_name || ” WHERE name=:1”这样的形式。

    2. 在第20行和第35行中,有一些变量名不应该加引号,应该改为v_name、r.name这样的形式。

    3. 在第39行和第56行中,DBMS_XSLFORMAT.ENDROW()函数后面应该加分号。

    4. 最后一行的“END;”应该换行。

    另外,如果需要在PL/SQL中使用动态SQL语句,需要注意安全性问题,避免SQL注入攻击。可以使用绑定变量和EXECUTE IMMEDIATE语句来增强安全性。

    评论

报告相同问题?

问题事件

  • 系统已结题 3月9日
  • 创建了问题 3月1日

悬赏问题

  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件