5

我正在尝试创建这样的属性文件...

firstname=Jon
lastname=Snow
occupation=Nights_Watch
family=Stark

...从这样的查询...

SELECT 
  a.fname as firstname, 
  a.lname as lastname, 
  b.occ as occupation... 
FROM 
  names a, 
  occupation b, 
  family c... 
WHERE... 

我怎样才能做到这一点?正如我所知,只使用spool在这里不起作用的 CSV 文件?

这些属性文件将被 shell 脚本拾取以运行自动化任务。我正在使用 Oracle 数据库

4

5 回答 5

2

也许是这样的?

psql -c 'select id, name from test where id = 1' -x -t -A -F = dbname -U dbuser

输出如下:

id=1
name=test1

(有关选项的完整列表:man psql。)

于 2013-06-29T14:07:00.843 回答
1

您必须选择是从 shell 还是从 PL/SQL 维护这样的文件。两种解决方案都是可能的,而且都是正确的。

因为 Oracle 必须从文件中读取和写入,所以我会从数据库端进行。

您可以使用 UTL_FILE 包将数据写入文件。

DECLARE
    fileHandler UTL_FILE.FILE_TYPE;
BEGIN
    fileHandler := UTL_FILE.FOPEN('test_dir', 'test_file.txt', 'W');
    UTL_FILE.PUTF(fileHandler, 'firstname=Jon\n');
    UTL_FILE.PUTF(fileHandler, 'lastname=Snow\n');
    UTL_FILE.PUTF(fileHandler, 'occupation=Nights_Watch\n');
    UTL_FILE.PUTF(fileHandler, 'family=Stark\n');

    UTL_FILE.FCLOSE(fileHandler);
EXCEPTION
    WHEN utl_file.invalid_path THEN
        raise_application_error(-20000, 'ERROR: Invalid PATH FOR file.');
END;

示例来源: http: //psoug.org/snippet/Oracle-PL-SQL-UTL_FILE-file-write-to-file-example_538.htm

同时您使用 Oracle 外部表从文件中读取。

CREATE TABLE parameters_table
(
    parameters_coupled VARCHAR2(4000)
)
ORGANIZATION EXTERNAL
(
    TYPE ORACLE_LOADER
    DEFAULT DIRECTORY test_dir
    ACCESS PARAMETERS
    (
        RECORDS DELIMITED BY NEWLINE
        FIELDS
        (
            parameters_coupled VARCHAR2(4000)
        )
    )
    LOCATION ('test_file.txt')
);

此时,您可以将数据写入具有耦合参数和值的一列的表中,即:'firstname=Jon'

您可以通过 Oracle 阅读它

您可以通过任何 shell 脚本读取它,因为它是纯文本。

那么这只是一个查询的问题,即:

SELECT  MAX(CASE WHEN INSTR(parameters_coupled, 'firstname=')  = 1 THEN REPLACE(parameters_coupled, 'firstname=')  ELSE NULL END) AS firstname
,       MAX(CASE WHEN INSTR(parameters_coupled, 'lastname=')   = 1 THEN REPLACE(parameters_coupled, 'lastname=')   ELSE NULL END) AS lastname
,       MAX(CASE WHEN INSTR(parameters_coupled, 'occupation=') = 1 THEN REPLACE(parameters_coupled, 'occupation=') ELSE NULL END) AS occupation
FROM    parameters_table;
于 2013-07-01T13:20:31.270 回答
1

我的答案与已针对此问题发布的两个答案非常相似,但我尝试解释选项,并尝试提供准确的答案。

使用 Postgres 时,您可以使用psql命令行实用程序来获取预期的输出

psql -F = -A -x -X <other options> -c 'select a.fname as firstname, a.lname as lastname from names as a ... ;'

选项包括:

-F : Use '=' sign as the field separator, instead of the default pipe '|'
-A : Do not align the output; so there is no space between the column header, separator and the column value.
-x : Use expanded output, so column headers are on left (instead of top) and row values are on right.
-X : Do not read $HOME/.psqlrc, as it may contain commands/options that can affect your output.
-c : The SQL command to execute
<other options> : Any other options, such as connection details, database name, etc.
于 2013-06-29T18:28:43.597 回答
1

既然你提到spool了,我会假设你在 Oracle 上运行。这应该会产生所需格式的结果,您可以spool立即使用。

SELECT
    'firstname=' || firstname || CHR(10) ||
    'lastname=' || lastname || CHR(10) -- and so on for all fields
FROM your_tables;

如果您知道乱七八糟的换行符的正确咒语和字符串连接的语法,那么所有数据库引擎都应该可以使用相同的方法。

于 2013-06-29T23:46:54.743 回答
1

可以从命令行 SQL 客户端执行此操作,但正如 STTLCU 指出的那样,最好让查询以“标准”(如 CSV)的形式输出,然后使用 shell 脚本转换结果。否则,由于您将使用的许多功能不是任何 SQL 标准的一部分,它们将取决于数据库服务器和客户端应用程序。将此步骤视为ETL的反面,您可以在其中清理“卸载”的数据,以便对其他应用程序有用。

肯定有办法将它构建到您的查询应用程序中:例如,如果您使用类似perl DBI::Shell客户端的东西(它允许您使用该模块连接到许多不同的服务器DBI),您可以以各种方式使您的输出更加生动。但是,如果可以将查询输出发送到文本文件并通过awk.

话虽如此……这就是 Postgresql 客户端如何做你想做的事。注意设置格式的命令不是SQL 而是特定于客户端的。

~/% psql -h 192.168.2.69 -d cropdusting -u stubblejumper
psql (9.2.4, server 8.4.14)
    WARNING: psql version 9.2, server version 8.4.
         Some psql features might not work.
You are now connected to database "cropdusting" as user "stubblejumper".

cropdusting=# \pset border 0 \pset format unaligned \pset t \pset fieldsep =
Border style is 0.
Output format is unaligned.
Showing only tuples.
Field separator is "=".
cropdusting=# select year,wmean_yld from bckwht where year=1997 AND freq > 13 ;
1997=19.9761904762
1997=14.5533333333
1997=17.9942857143
cropdusting=# 

对于psql客户端,该\pset命令设置影响查询结果表输出的选项。您可能可以弄清楚哪个选项在做什么。如果您想使用您的 SQL 客户端执行此操作,请告诉我们它是哪一个或阅读手册页以获取有关如何格式化查询输出的提示。

于 2013-06-26T14:02:55.727 回答