Temat: Eskport danych do plików zewnętrznych

Witam,

Jetem początkującym użytkownikiem systemu bazodanowego Oracle.
Mam nadzieję, że ktoś będzie mi w stanie pomóc.
Chodz mi o mechanizm eksportu danych (wedle konretnego sql) do pliku zewnętrznego (whatever - csv, txt, flat ), czy Oracle czymś takim dysponuje ? Ja znalazłem tylko mechanizm imp/exp, ale nie chozi mi o zrzucanie bazy...
Jeśli tak, to istenieje odpowiednik Oracle'a do MS Sql'owych job'ów ?
By np zrzucanie informacji do plików było jakoś zsychnronizowane, mogłbo np odbywać się każdego dnia o wytyczonej godzinie ?

Z góry dziękuję za wszelkie odpowiedzi,
Paweł

konto usunięte

Temat: Eskport danych do plików zewnętrznych

W Oraclu też masz joby: pakiet dbms_job. W data pump też możesz sobie wybierać co ma zrzucać.
Mariusz Masewicz

Mariusz Masewicz Prawie wszysko o
bazach danych Oracle
:-)

Temat: Eskport danych do plików zewnętrznych

Adam Michalski:
W Oraclu też masz joby: pakiet dbms_job. W data pump też możesz sobie wybierać co ma zrzucać.

cron + sqlplus + spool

oraclowy scheduler ew. joby i utl_file (a moze utl_smtp :-)
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: Eskport danych do plików zewnętrznych

Witam,
trochę PL/SQL'a - wykorzystaj pakiety DBMS_SCHEDULER (w bazie 10 i wyżej) lub DBMS_JOB (poniżej 10) w połączeniu z UTL_FILE (jak radził Mariusz :)).

Przykład:

declare
v_file utl_file.file_type;

cursor c_get_data is
select first_name || ';' || last_name || ';' salary as vdata
from hr.employees;

begin
begin
execute immediate 'create directory temp_export_user_dir as ''/home/oracle''';
exception
when others then
execute immediate 'drop directory temp_export_user_dir';
execute immediate 'create directory temp_export_user_dir as ''/home/oracle''';
end;

v_file := utl_file.fopen('TEMP_EXPORT_USER_DIR', 'nazwa_pliku_eksportu.txt, 'w');

for v_data in c_get_data loop
utl_file.put_line(p_file, v_data);
end loop;

utl_file.fclose(v_file);
end;
/



Potem możesz sobie coś takiego zapisać jako procedurę składowaną, funkcję lub jako część pakietu i użyć DBMS_SCHEDULER'a do uruchamiana skryptu cyklicznie.

Temat: Eskport danych do plików zewnętrznych

Ok, dzięki wielkie, ogarnąłem z wykorzystaniem jobs i utl_file.
Natomiast pojawił się drugi problem :)

Potrzebuję dostać się / odczytać / zapisać plik w lokalizacji sieciowe.
Działam w domenie, użytkownik w kontekście jakiegoś bracuje jako bda ma dostęp do lokazacji sieciowej, ale wywala mi błąd:
ORA-06512 ble ble ble. "Invalid file operation", "An attempt was made to read from a file or directory that does not exist, or file or directory access was denied by the system".

Domyślam się, że muszę wykorzystać create directory, ale próbowałem w formacie: "\\Lokalizacja_sieciowa\folder" i nie poszło :(
Any ideas ?

konto usunięte

Temat: Eskport danych do plików zewnętrznych

Paweł Monastyrski:
Domyślam się, że muszę wykorzystać create directory, ale próbowałem w formacie: "\\Lokalizacja_sieciowa\folder" i nie poszło :(

Zmapuj ten dysk na stałe ....
Adam Orlik

Adam Orlik Starszy
Administrator Baz
Danych Oracle

Temat: Eskport danych do plików zewnętrznych

Paweł Monastyrski:
Działam w domenie, użytkownik w kontekście jakiegoś bracuje jako bda ma dostęp do lokazacji sieciowej, ale wywala mi błąd:
ORA-06512 ble ble ble. "Invalid file operation", "An attempt was made to read from a file or directory that does not exist, or file or directory access was denied by the system".

Witam,

Upewnij się że użytkownik z którego został uruchomiony serwis bazy ( zakładam że mówimy o windows) ma dostęp do lokalizacji do której chcesz zapisać.

Start -> uruchom -> services.msc -> wybierz serwis ( oracle_sid) -> właściwości -> logowanie. Jeżeli jest ustawione jako local system to możesz zmienić na inne konto i zrestartować serwis lub nadać do katalogu uprawnienia dla konta komputera ( konto nazwa_komputera$ )

Pozdrawiam,
Adam
Stefan Starzyński

Stefan Starzyński Specjalista, Nestle
Waters Polska S.A.

Temat: Eskport danych do plików zewnętrznych

Adam Gasik:
Paweł Monastyrski:
Działam w domenie, użytkownik w kontekście jakiegoś bracuje jako bda ma dostęp do lokazacji sieciowej, ale wywala mi błąd:
ORA-06512 ble ble ble. "Invalid file operation", "An attempt was made to read from a file or directory that does not exist, or file or directory access was denied by the system".

Witam,

Upewnij się że użytkownik z którego został uruchomiony serwis bazy ( zakładam że mówimy o windows) ma dostęp do lokalizacji do której chcesz zapisać.

Start -> uruchom -> services.msc -> wybierz serwis ( oracle_sid) -> właściwości -> logowanie. Jeżeli jest ustawione jako local system to możesz zmienić na inne konto i zrestartować serwis lub nadać do katalogu uprawnienia dla konta komputera ( konto nazwa_komputera$ )

Pozdrawiam,
Adam
ewentualnie zrób skrypt na poziomie windowsa w vbs/perl/python/.net czy coś tam jeszcze, pobierający dane z oracla po ado,odbc i zapisujący do pliku nasieci a urchamiany co jakiś tam czas
StefanStefan Starzyński edytował(a) ten post dnia 03.03.10 o godzinie 21:59
Robert R.

Robert R. Architect/Manager

Temat: Eskport danych do plików zewnętrznych

kiedys zrobilem to w ten sposob, moze sie komus przyda

--katalog na oracle'u gdzie chcemy zrzucac

CREATE OR REPLACE DIRECTORY SAP_DIR AS 'e:\sap'
/

--funkcja do zrzucania zapytan do pliczkow tekstowych , separator kolumn do ustawienia, funkcja z asktom.oracle.com

CREATE OR REPLACE FUNCTION dump_csv (P_QUERY IN VARCHAR2,
P_SEPARATOR IN VARCHAR2 DEFAULT ' ',
P_DIR IN VARCHAR2, P_FILENAME IN VARCHAR2)
RETURN NUMBER
IS
L_OUTPUT UTL_FILE.FILE_TYPE;
L_THECURSOR INTEGER DEFAULT DBMS_SQL.OPEN_CURSOR;
L_COLUMNVALUE VARCHAR2 (3000);
L_STATUS INTEGER;
L_COLCNT NUMBER DEFAULT 0;
L_SEPARATOR VARCHAR2 (10) DEFAULT ' ';
L_CNT NUMBER DEFAULT 0;
BEGIN
L_OUTPUT := UTL_FILE.FOPEN (P_DIR, P_FILENAME, 'w');
DBMS_SQL.PARSE (L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE);

FOR I IN 1 .. 255
LOOP
BEGIN
DBMS_SQL.DEFINE_COLUMN (L_THECURSOR, I, L_COLUMNVALUE, 3000);
L_COLCNT := I;
EXCEPTION
WHEN OTHERS
THEN
IF (SQLCODE = -1007)
THEN
EXIT;
ELSE
RAISE;
END IF;
END;
END LOOP;

DBMS_SQL.DEFINE_COLUMN (L_THECURSOR, 1, L_COLUMNVALUE, 3000);
L_STATUS := DBMS_SQL.EXECUTE (L_THECURSOR);

LOOP
EXIT WHEN (DBMS_SQL.FETCH_ROWS (L_THECURSOR) <= 0);
L_SEPARATOR := ' ';
FOR I IN 1 .. L_COLCNT
LOOP
DBMS_SQL.COLUMN_VALUE (L_THECURSOR, I, L_COLUMNVALUE);
UTL_FILE.PUT (L_OUTPUT, L_COLUMNVALUE || L_SEPARATOR );
L_SEPARATOR := P_SEPARATOR;
END LOOP;
UTL_FILE.NEW_LINE (L_OUTPUT);
L_CNT := L_CNT + 1;
END LOOP;
DBMS_SQL.CLOSE_CURSOR (L_THECURSOR);
UTL_FILE.FCLOSE (L_OUTPUT);
RETURN L_CNT;
END DUMP_CSV;
/

-- procedurka do eksportowania

CREATE OR REPLACE PROCEDURE exp_proc
AS
l_rows NUMBER;
BEGIN
select
dump_csv ('select * from customers_exp_vw', ' ', 'SAP_DIR',
'customers.txt') into l_rows from dual;
END;
/

-- potem tworzysz joba i gotowe :)

DECLARE
x NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT (x, 'begin exp_proc; end;',
TO_DATE ('04-08-2010 23:00:00', 'dd/mm/yyyy hh24:mi:ss'), 'SYSDATE+1', FALSE);
END;
/

Milego uzytkowania,

pozdrawiam
Robert

konto usunięte

Temat: Eskport danych do plików zewnętrznych

Toad->Utilities->App Designer=>Zakładka Import/Export
Po zdefiniowaniu eksportów można je zaharmogramować w ramach aplikacji

To jest dobre narzędzie dla użytkowników końcowych (nie wyłączających kompa na czas importu) - mogą sobie zaharmonogramować zrzucanie niezbyt dużej ilości danych do plików tekstowych lub trochę mniejszej ilości do Excela. Eksport do MS Excel działa przez mechanizm OLE - razem z TOAD musi zostać zainstalowany Excel, poza tym mechanizm ten jest powolny ( do kilkuset komórek /sek).
Narzędzie jest klikalne i przyjazne dla użytkowników nie posiadających wiedzy programistycznej ..

Średnio ogarnięty użytkownik, umiejący pisać zapytania opanuje bardzo szybko i nie będzie zatruwać życia IT...

konto usunięte

Temat: Eskport danych do plików zewnętrznych

Kazimierz Szpyt:
Toad->Utilities->App Designer=>Zakładka Import/Export

To temat sprzed roku ...

konto usunięte

Temat: Eskport danych do plików zewnętrznych

Najprościej bedzie zrobic to tak (Przykład który wykorzystałem kiedys):

CREATE OR REPLACE procedure z_lgetl_bum (i_output_path in varchar2)

is

s_output_file utl_file.file_type;

s_file_name varchar2(50) := 'kuba'||'.txt';

cursor c_lgetl_bum_endresult

is

select

cast(bumid as char(8)) as bumid,

cast(BUMGRUNDNAM as char(25)) as BUMGRUNDNAM,

cast(BUMSTASND as char(5)) as BUMSTASND,

cast(ARTID as char(25)) as ARTID,

cast(MNDNR as char(20)) as mndnr,

cast(WERK as char (20)) as werk,

cast(BUMMGVERB as char(20)) as BUMMGVERB,

cast(BUMMGWWS as char (20)) as BUMMGWWS,

cast(TENAM as char (20)) as tenam

from ptst.bum_t;



t_lgetl_bum_endresult c_lgetl_bum_endresult%rowtype;

begin

s_output_file := utl_file.fopen (i_output_path,s_file_name, 'W');

for t_lgetl_bum_endresult in c_lgetl_bum_endresult

loop

utl_file.put_line (s_output_file,

t_lgetl_bum_endresult .bumid

|| t_lgetl_bum_endresult .BUMGRUNDNAM

|| t_lgetl_bum_endresult .BUMSTASND

|| t_lgetl_bum_endresult .ARTID

|| t_lgetl_bum_endresult .mndnr

|| t_lgetl_bum_endresult .werk

|| t_lgetl_bum_endresult .BUMMGVERB

|| t_lgetl_bum_endresult .BUMMGWWS

|| t_lgetl_bum_endresult .tenam);

end loop;

utl_file.fclose(s_output_file);

exception

when others then

dbms_output.put_line(sqlcode||' '||sqlerrm);

end;

/

-Następnie procedurę taką mozesz sobie wrzucić do schedulera o którym poczytaj
http://www.oracleonline.info/scheduler_10gdba.html
-nie zapomnij o stworzeniu directoraJakub Suchocki edytował(a) ten post dnia 26.01.11 o godzinie 22:52

Następna dyskusja:

programista baz danych - Kr...




Wyślij zaproszenie do