簡體   English   中英

使用Shell腳本生成屬性文件和SQL查詢的結果

[英]Generate a Properties File using Shell Script and Results from a SQL Query

我正在嘗試創建這樣的屬性文件...

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 DB

也許是這樣的?

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

輸出如下:

id=1
name=test1

(有關選項的完整列表: man psql 。)

可以從命令行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客戶端執行此操作,請告訴我們它是哪一個或通過手冊頁閱讀有關如何格式化查詢輸出的提示。

我的答案非常類似於已經發布的兩個問題,但我嘗試解釋選項,並嘗試提供一個精確的答案。

使用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.

因為你提到了spool我會假設你在Oracle上運行。 這應該在所需的格式產生一個結果,你可以spool立竿見影。

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

如果您知道對於新行的正確咒語和字符串連接的語法,則所有數據庫引擎都應該采用相同的方法。

您必須選擇是否要從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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM