从程序中获取表输出

时间:2014-09-15 16:01:53

标签: sql excel oracle excel-vba plsql vba

我有一个工作程序,使用DBMS_OUTPUT.put_line函数输出a,我会考虑的脚本输出。

该过程完美无缺,但我只能使用Toad系统中的DBMS输出行查看结果。我可以使用CSV将数据传输到excel,但是这个过程需要一些时间,理想情况下我希望只能使用Excel来运行报告。

我非常有能力运行宏并连接到我的Oracle数据库,然后严格地从Excel工作簿运行查询。问题是收获DBMS输出行格式脚本响应;我只能在"数据网格"中收获输出。 format-表格格式,类似于输出select * from table1

我的问题是,Oracle是否有办法以表格格式将一个集合从一个过程输出到datagrid格式?

以下是该程序的一个示例:

LOOP
      SELECT (CAST (MULTISET (SELECT DECODE (mike.flg, '1', 'No Trailer', DECODE(mike.prod, '1', 'Waiting', mike.txt))
                                FROM (  SELECT *
                                          FROM (  SELECT *
                                                    FROM hist
                                                   WHERE     id = v_array.seq_id
                                                         AND txt IS NOT NULL
                                                         AND txt <> 'NOW'
                                                         AND flg = 1
                                                ORDER BY id DESC) b                                         WHERE ROWNUM <= 1                                      ORDER BY ROWNUM DESC) m) AS wbr.data_1_col_ty))
        INTO v_col
        FROM DUAL;

        --select * from v_col;

      IF v_col IS NOT NULL AND v_col.COUNT > 0
      THEN
         FOR v_index IN v_col.FIRST .. v_col.LAST
         LOOP
                 DBMS_OUTPUT.put_line ();
         END LOOP;
      END IF;
   END LOOP;

我希望能够像我一样以表格格式输出v_col的结果,或者在程序的最后一次输出结果。我知道v_array.seq_id在循环中匹配,但有没有办法以表格格式输出?能够这样做应该允许我通过Excel宏来调用这个脚本并收集结果。

1 个答案:

答案 0 :(得分:1)

CREATE FUNCTION some_fun
  RETURN wbr.data_1_col_ty PIPELINED
IS
LOOP
  SELECT (CAST (MULTISET (SELECT DECODE (mike.flg, '1', 'No Trailer', DECODE(mike.prod, '1', 'Waiting', mike.txt))
                            FROM (  SELECT *
                                      FROM (  SELECT *
                                                FROM hist
                                               WHERE     id = v_array.seq_id
                                                     AND txt IS NOT NULL
                                                     AND txt <> 'NOW'
                                                     AND flg = 1
                                            ORDER BY id DESC) b                                         WHERE ROWNUM <= 1                                      ORDER BY ROWNUM DESC) m) AS wbr.data_1_col_ty))
    INTO v_col
    FROM DUAL;

    --select * from v_col;

  IF v_col IS NOT NULL AND v_col.COUNT > 0
  THEN
     FOR v_index IN v_col.FIRST .. v_col.LAST
     LOOP
        PIPE ROW(v_col(v_index));
     END LOOP;
  END IF;
END LOOP;
END some_fun;

然后你可以做

select * from table(some_fun())

在Excel文件中。

顺便说一下,您可以使用PL / SQL批量绑定功能,而不是选择和转换多个集合:

  SELECT DECODE (mike.flg, '1', 'No Trailer', DECODE(mike.prod, '1', 'Waiting', mike.txt))
  BULK COLLECT INTO v_col
                            FROM (  SELECT *
                                      FROM (  SELECT *
                                                FROM hist
                                               WHERE     id = v_array.seq_id
                                                     AND txt IS NOT NULL
                                                     AND txt <> 'NOW'
                                                     AND flg = 1
                                            ORDER BY id DESC) b                                         WHERE ROWNUM <= 1                                      ORDER BY ROWNUM DESC) m;