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”我怎么也找不到介绍,实在不懂。
上个问题付过费了,这次我也悬赏吧,希望能彻底解决。