2013-06-26 10 views
5

Próbuję utworzyć plik właściwości jak ten ...wygenerować plik właściwości przy użyciu skryptu powłoki i wynika z kwerendy SQL

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

... z zapytaniem jak to ...

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

Jak mogę to zrobić? Skoro mam świadomość, że używam tylko pliku CSV, który nie będzie tutaj działać?

Te pliki właściwości zostaną pobrane przez skrypty powłoki w celu uruchamiania zautomatyzowanych zadań. Używam Oracle DB

+0

dlaczego nie zbudować nowy skrypt, który buduje plik pod specyfikacji, jak również, zamiast polegać na czystym SQL? Ponadto, myślę, że musisz określić, który DB używasz, a nie ogólny znacznik SQL. –

+1

Byłoby bardzo przydatne, aby doradzić, co twój DBMS jest. – RandomSeed

+1

Dziękujemy za aktualizację. Zwróć uwagę, jak oznaczono Twoje pytanie. Powinieneś ostrożnie oznaczyć swoje pytania, ponieważ większość osób odpowiadających na pytania przegląda pytania według tagów. – RandomSeed

Odpowiedz

1

Ponieważ wymieniono spool będę zakładać jesteś działa na Oracle.Powinno to dać wynik w pożądanym formacie, który można od razu odczytywać: spool.

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

To samo podejście powinno być możliwe w przypadku wszystkich silników baz danych, jeśli znasz poprawną zaklęcie dla litteral nowej linii i składnię dla łańcuchów znaków.

1

Można to zrobić z klienta SQL wiersza poleceń, ale jak STTLCU zauważa, może być lepiej, aby zapytanie do wyjścia w coś "standardowego" (jak CSV), a następnie przekształcić wyniki z skrypt powłoki. W przeciwnym razie, ponieważ wiele funkcji, których można użyć, nie należy do żadnego standardu SQL, zależą one od serwera bazy danych i aplikacji klienckiej. Pomyśl o tym kroku jako o awersie z ETL, w której wyczyszczasz dane, które "rozładowujesz", aby były przydatne dla innych aplikacji.

Na pewno istnieją sposoby na zbudowanie tego w aplikacji zapytań: np. jeśli używasz czegoś takiego jak perlDBI::Shell jako klienta (który pozwala ci łączyć się z wieloma różnymi serwerami za pomocą modułu DBI), możesz poprawić brzmienie na różne sposoby. Ale prawdopodobnie najlepiej byłoby wysłać wynik zapytania do pliku tekstowego i przeprowadzić go przez awk.

Powiedziawszy, że ... oto jak klient PostgreSQL mógł robić, co chcesz. Zauważ, że polecenia konfigurowania formatowania są specyficzne dla klienta 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=# 

Z psql Client \pset zestawy komend opcji wpływających na produkcję wyników zapytania stoły. Prawdopodobnie możesz dowiedzieć się, która opcja działa. Jeśli chcesz to zrobić za pomocą klienta SQL, powiedz nam, który to jest lub przeczytaj stronę podręcznika, aby uzyskać wskazówki dotyczące formatowania danych wyjściowych zapytań.

2

Być może coś takiego?

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

wyjścia byłoby jak:

id=1 
name=test1 

(Dla pełnej listy opcji. man psql)

1

Moja odpowiedź jest bardzo podobny do dwóch już pisał na to pytanie, ale ja spróbuj wyjaśnić opcje i spróbuj podać dokładną odpowiedź.

Podczas korzystania PostgreSQL, można użyć psql narzędzia wiersza polecenia, aby uzyskać oczekiwane wyjście

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

są następujące opcje:

-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

Musisz wybrać, czy chcesz zachować taki plik z powłoki lub z PL/SQL. Oba rozwiązania są możliwe i oba są poprawne.

Ponieważ Oracle musi odczytać i zapisać z pliku, zrobiłbym to ze strony bazy danych.

Możesz zapisać dane do pliku używając pakietu 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; 

przykład za źródło: http://psoug.org/snippet/Oracle-PL-SQL-UTL_FILE-file-write-to-file-example_538.htm

Jednocześnie można przeczytać z pliku przy użyciu zewnętrznego tabeli 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') 
); 

W tym momencie można zapisać danych na stole, który ma jedną kolumnę z połączonego parametru i wartości, czyli: „Imię = Jon”

Można go odczytać przez Oracle

Można przeczytaj go za pomocą dowolnego skryptu powłoki, ponieważ jest to zwykły tekst.

Wtedy jest to tylko kwestia zapytaniu, tj .:

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;