如何在UNIX中使用sqlplus以很好的方式显示选择查询

时间:2018-08-17 11:37:37

标签: oracle unix select sqlplus

我需要选择大量数据(超过450万条记录),而当我使用unix中的sqlplus进行操作时,数据以难以理解的方式呈现:

Columns1
--------------------------------------------------------------------------------
Columns2
--------------------
110345947
107110345947

110345948
107110345948

110345949
107110345949


Columns1
--------------------------------------------------------------------------------
Columns2
--------------------
110345950
107110345950

110345951
107110345951

我想得到的是这个

Columns1,Columns2
110345950,107110345950
110345951,107110345951

我的sql脚本如下:

set long 30000;
set colsep ",";
SELECT Columns1, Columns2 from table;

有什么想法怎么做?

3 个答案:

答案 0 :(得分:1)

如果您坚持使用SQL * Plus,最简单的方法是自己连接值:

SELECT Columns1 ||','|| Columns2 from table;

如果您可以改用SQLcl或SQL Developer,则它们可以自然输出CSV:

set sqlformat csv
SELECT Columns1, Columns2 from table;

,这将包括用双引号引起来的字符串等,以避免嵌入逗号引起的问题。

答案 1 :(得分:1)

更多选项:

使用SET LINESIZE SQL * Plus命令并对其进行扩展,以使所有列都适合一行:

SQL> set linesize 30
SQL> select * from dept;

    DEPTNO DNAME
---------- --------------
LOC
-------------
        10 ACCOUNTING
NEW YORK

        20 RESEARCH
DALLAS

        30 SALES
CHICAGO

        40 OPERATIONS
BOSTON


SQL> set linesize 100
SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL>

或者,使用SQL * Plus COLUMN命令并“缩短”每一个太宽的列(尽管这有点无聊):

SQL> create table test (ename varchar2(50), job varchar2(50));

Table created.

SQL> insert into test select ename, job from emp where rownum < 5;

4 rows created.

SQL> set linesize 50
SQL> select * from test;

ENAME
--------------------------------------------------
JOB
--------------------------------------------------
SMITH
CLERK

ALLEN
SALESMAN

WARD
SALESMAN

JONES
MANAGER


SQL> col ename format a12
SQL> col job   format a20
SQL> select * from test;

ENAME        JOB
------------ --------------------
SMITH        CLERK
ALLEN        SALESMAN
WARD         SALESMAN
JONES        MANAGER

SQL>

答案 2 :(得分:1)

从SQL * Plus 12.2开始,您可以使用

SET MARKUP CSV {ON|OFF} [DELIMI[TER] character] [QUOTE {ON|OFF}]

例如(使用所有默认设置)

    using Microsoft.AspNetCore.Authorization;
    ...     
    [Authorize]
    [HttpGet("check")]
    public IActionResult CheckAuth()
    {
        return Ok("authorized");
    }

或者,如果您的命令行能够启动Web浏览器,则可以set markup csv on ,保存到文件并在浏览器中打开它。 (我意识到您要求使用CSV格式,因此这可能对您没有用,但这是一个巧妙的技巧,因此我还是要共享它。)

https://uhesse.com/2011/06/30/sqlplus-output-in-nice-html-format/

例如,将以下内容另存为set markup html(此示例适用于Windows,因此您需要replace the start command with your Linux equivalent):

html.sql

然后,您可以在SQL提示符下输入查询(不运行查询),然后

set termout off feedback off

set markup html on head "<title>SQL*Plus Output &_user@&_connect_identifier &_date</title> -
<style> -
html { -
   font-family: consolas, monospace; -
   font-size: 9pt; -
   background-color: #dce1e9; -
} -
table, td, th { -
   text-align: left; -
   vertical-align: top; -
   border: 1px solid #808090; -
   background: white; -
   padding: .5em .6em; -
} -
table { -
   border-collapse: collapse; -
   margin-top: 1.2em;  /* space above table itself */ -
   margin-bottom: 1.2em; -
   border-width: 3px; -
   margin-bottom: 1em; -
} -
td { -
   margin: .2em; -
   font-size: 80%; -
} -
th { -
   background: #f0f4fd; -
   font-weight: bold; -
   font-size: 95%; -
   margin: .2em; -
   padding-bottom: .4em; -
} -
</style>" -
body "" -
table "align='left' summary='Script output'" -
spool on entmap on preformat off

spool sqlplus_output.html

run

spool off
set markup html off spool off
host start sqlplus_output.html
set termout on feedback on

,结果将显示在默认浏览器中。