2013-06-26 39 views
5
SQLクエリからシェルスクリプトと結果を使用して

</p> ...このようなクエリから... ...私はこのようなプロパティファイルを作成しようとしています<p>

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

どうすればいいですか?ここではうまくいかないCSVファイルにspoolを使用することのみを認識していますか?

これらのプロパティファイルは、自動化されたタスクを実行するためにシェルスクリプトによって選択されます。私はOracle DBを使用しています

+0

ではなく、純粋なSQLに頼るよりも、同様にあなたの仕様の下にファイルを構築する新しいシェルスクリプトを構築していないなぜですか?また、一般的なSQLタグではなく、どのDBを使用しているのかを指定する必要があると思います。 –

+1

DBMSが何であるかをアドバイスすることは非常に便利です。 – RandomSeed

+1

更新いただきありがとうございます。あなたの質問にどのようにタグを付けたかを確認してください。ほとんどの回答者は質問だけをタグで参照するため、質問には慎重にタグを付ける必要があります。 – RandomSeed

答えて

1

あなたは私はあなたがいると仮定しますspool mentionnedので、 Oracle上で動作します。これにより、希望の形式の結果が生成されます。spoolはすぐに実行できます。あなたはlitteral新しい行の正しい呪文や文字列の連結のための構文を知っていれば

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

同じアプローチでは、すべてのデータベースエンジンで可能でなければなりません。

1

コマンドラインSQLクライアントからこれを実行することはできますが、STTLCUノートでは、クエリを「標準」(CSVなど)で出力してから結果を変換する方が良い場合がありますシェルスクリプト。それ以外の場合は、使用する機能の多くがSQL標準の一部ではないため、データベースサーバーとクライアントアプリケーションに依存します。このステップをETLの表面のようなものと考えると、「アンロード」したデータをクリーンアップして他のアプリケーションに役立てることができます。

これをクエリアプリケーションに組み込む方法があります。クライアントとしてperlDBI::Shellなどを使用すると(DBIモジュールを使用して多数の異なるサーバーに接続できるようになります)、さまざまな方法で出力をジャズアップできます。しかし、ここでは、クエリ出力をテキストファイルに送信し、awkを実行すると、おそらく最適です。

これは、PostgreSQLクライアントがあなたが望むことができる方法を示しています。書式を設定するコマンドがではなく、 SQLでクライアントに固有のものであることに注意してください。クエリ結果テーブルの出力に影響を与えるpsqlクライアント\psetコマンドセットのオプション付き

~/% 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=# 

。おそらく、どのオプションが何をしているのか分かります。 SQLクライアントを使用してこれを実行したい場合は、手動ページからどのクエリを読み込むかをお読みください。クエリの出力形式を設定するヒントがあります。

2

おそらくこのようなものでしょうか?

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

出力は次のようになります:

id=1 
name=test1 

(オプションの完全なリストについては:。man psql

1

私の答えは、すでにこの質問のために投稿2と非常によく似ていますが、Iオプションを説明し、正確な答えを提供しようとする。

のPostgresを使用する場合は、あなたが意図した出力

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

に取得するにはpsqlコマンドラインユーティリティを使用することができます

オプションは次のとおりです。

-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. 
1

このようなファイルをシェルまたは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; 

例のソース:あなたはOracleの外部表を使用してファイルから読み込むと同時にhttp://psoug.org/snippet/Oracle-PL-SQL-UTL_FILE-file-write-to-file-example_538.htm

。あなたが結合されたパラメータと値、すなわちを持つ一つの列を持っているあなたのテーブルにデータを書き込むことができます。この時点で、

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は=ジョン」

あなたは

あなたができるOracle

でそれを読むことができますこれはプレーンテキストなので、どのシェルスクリプトでも読み込みます。

そして、それはすなわち、クエリするだけです。:

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; 
関連する問題