Wydział Elektrotechniki, Informatyki i Telekomunikacji
Transkrypt
Wydział Elektrotechniki, Informatyki i Telekomunikacji
Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki Instrukcja do zajęć laboratoryjnych Nr ćwiczenia: 3 Temat: Eksport danych do postaci plików tekstowych Napisać w języku PL/SQL procedurę(y), która będzie tworzyła „zrzut danych” podanej jako parametr tabeli. Zakładamy, że system powinien prawidłowo obsługiwać przynajmniej kolumny podstawowych typów, czyli NUMBER, VARCHAR2, CHAR, DATE. System powinien potrafić generować pliki w formatach csv, insert, text oraz xml (taka dokładnie funkcjonalność istnieje w używanym przez Ciebie programie SQLDeveloper. Czy wiesz, gdzie jej szukać i jak używać?). Wykonując to zadanie należy korzystać w odpowiedni sposób z funkcjonalności oferowanej przez program SQL*Plus oraz z odpowiednich tabel słownikowych. Przykładowo dla tabeli REGION wyniki powinny wyglądać następująco: Format csv: "ID","NAME" "1","North America" "2","South America" "3","Africa / Middle East" "4","Asia" "5","Europe" Format insert: REM INSERTING into Insert into REGION Insert into REGION Insert into REGION Insert into REGION Insert into REGION REGION (ID,NAME) (ID,NAME) (ID,NAME) (ID,NAME) (ID,NAME) values values values values values (1 (2 (3 (4 (5 'North America'); 'South America'); 'Africa / Middle East'); 'Asia'); 'Europe'); Format text: "ID" "1" "2" "3" "4" "5" "NAME" "North America" "South America" "Africa / Middle East" "Asia" "Europe" Format xml: <?xml version='1.0' encoding='Cp1250' ?> <RESULTS> <ROW> <COLUMN NAME="ID"><![CDATA[1]]></COLUMN> <COLUMN NAME="NAME"><![CDATA[North America]]></COLUMN> </ROW> opracował: dr inż. Artur Gramacki 1 <ROW> <COLUMN <COLUMN </ROW> <ROW> <COLUMN <COLUMN </ROW> <ROW> <COLUMN <COLUMN </ROW> <ROW> <COLUMN <COLUMN </ROW> </RESULTS> NAME="ID"><![CDATA[2]]></COLUMN> NAME="NAME"><![CDATA[South America]]></COLUMN> NAME="ID"><![CDATA[3]]></COLUMN> NAME="NAME"><![CDATA[Africa / Middle East]]></COLUMN> NAME="ID"><![CDATA[4]]></COLUMN> NAME="NAME"><![CDATA[Asia]]></COLUMN> NAME="ID"><![CDATA[5]]></COLUMN> NAME="NAME"><![CDATA[Europe]]></COLUMN> W następnym kroku należy rozbudować program w taki sposób, aby system automatycznie pobierał z pewnej tabeli pomocniczej nazwy tabel oraz nazwy kolumn, których dane chcemy wyeksportować do plików tekstowych, oraz aby po podaniu stosownego parametru eksportował dane ze wszystkich tabel i wszystkich kolumn w bieżącym schemacie użytkownika. Za pomocą komendy spool skierować wyniki do pliku tekstowego. Pamiętaj również, aby w czasie eksportowania danych typu DATE zapewnić prawidłowy ich format (dotyczy tylko formatu insert). Gdy w komórkach nie ma danych (NULL), powinno to być również prawidłowo obsłużone. Przykładowo dla tabeli EMP wyniki powinny być jak poniżej (ze względu na wielkość danych po eksporcie pokazano tylko pierwszy rekord): "COMMENTS","COMMISSION_PCT","DEPT_ID","FIRST_NAME","ID","LAST_NAME","MANAGER_ID","SALA RY","START_DATE","TITLE","USERID" "","","50","Carmen","1","Velasquez","","2500","1990-03-03 08:30:00","President","cvelasqu" REM INSERTING into EMP Insert into EMP (COMMENTS,COMMISSION_PCT,DEPT_ID,FIRST_NAME,ID,LAST_NAME,MANAGER_ID,SALARY,START_DATE, TITLE,USERID) values (null null 50 'Carmen' 1 'Velasquez' null 2500 to_timestamp('1990-03-03 08:30:00','RR/MM/DD HH24:MI:SSXFF') 'President' 'cvelasqu'); "COMMENTS" "COMMISSION_PCT" "DEPT_ID" "MANAGER_ID" "SALARY" "START_DATE" "" "" "50" "Carmen" "1" "Velasquez" "FIRST_NAME" "ID" "LAST_NAME" "TITLE" "USERID" "" "2500" "1990-03-03 08:30:00" <?xml version='1.0' encoding='Cp1250' ?> <RESULTS> <ROW> <COLUMN NAME="COMMENTS"><![CDATA[]]></COLUMN> <COLUMN NAME="COMMISSION_PCT"><![CDATA[]]></COLUMN> <COLUMN NAME="DEPT_ID"><![CDATA[50]]></COLUMN> <COLUMN NAME="FIRST_NAME"><![CDATA[Carmen]]></COLUMN> <COLUMN NAME="ID"><![CDATA[1]]></COLUMN> <COLUMN NAME="LAST_NAME"><![CDATA[Velasquez]]></COLUMN> <COLUMN NAME="MANAGER_ID"><![CDATA[]]></COLUMN> opracował: dr inż. Artur Gramacki 2 <COLUMN <COLUMN <COLUMN <COLUMN </ROW> </RESULTS> NAME="SALARY"><![CDATA[2500]]></COLUMN> NAME="START_DATE"><![CDATA[1990-03-03 08:30:00]]></COLUMN> NAME="TITLE"><![CDATA[President]]></COLUMN> NAME="USERID"><![CDATA[cvelasqu]]></COLUMN> UWAGI Poniżej pokazano procedurę PL/SQL, która tworzy skrypt wyświetlający szczegóły budowy tabeli podanej jako parametr wywoływanej procedury (jest to de facto dość dokładny odpowiednik polecenia desc). Widać więc, że możliwości budowy generatorów kodu są w zasadzie nieograniczone. Wymagana jest tylko znajomość języków SQL, PL/SQL oraz szczegółów budowy odpowiednich tabel słownika bazy danych. Wzorując się poniższym przykładzie zrealizować zadanie podane wyżej. CREATE OR REPLACE PROCEDURE desc_table (in_tab_name VARCHAR2) AS header VARCHAR2(2000); header2 VARCHAR2(2000); BEGIN -- Nagłówek SELECT RPAD('Column',30)||RPAD('Null?',7) ||RPAD('Type',20)|| RPAD('Length',8) ||RPAD('Precision',11)||RPAD('Scale',7) INTO header FROM DUAL; SELECT RPAD('-',29,'-')||' '||RPAD('-',6,'-')||' '|| RPAD('-',19,'-')||' '||RPAD('-',7,'-')||' '|| RPAD('-',10,'-')||' '||RPAD('-',6,'-') INTO header2 FROM DUAL; DBMS_OUTPUT.PUT_LINE(header); DBMS_OUTPUT.PUT_LINE(header2); -- Kolejne kolumny FOR kursor IN ( SELECT * FROM user_tab_columns WHERE table_name = UPPER(in_tab_name) ORDER BY column_ID) LOOP DBMS_OUTPUT.PUT_LINE ( RPAD(kursor.column_name,30) ||RPAD(kursor.nullable,7) || RPAD(kursor.data_type,20) ||RPAD(kursor.data_length,8) || RPAD(kursor.data_precision,11)||RPAD(kursor.data_scale,7) ); END LOOP; END; / Przykład działania powyższego kodu jest następujący: SQL> set linesize 100 SQL> execute desc_table('EMP'); Column Null? ----------------------------- -----ID N LAST_NAME N FIRST_NAME Y USERID Y START_DATE Y COMMENTS Y MANAGER_ID Y TITLE Y DEPT_ID Y SALARY Y COMMISSION_PCT Y SQL> opracował: dr inż. Artur Gramacki Type ------------------NUMBER VARCHAR2 VARCHAR2 VARCHAR2 DATE VARCHAR2 NUMBER VARCHAR2 NUMBER NUMBER NUMBER Length ------22 25 25 8 7 255 22 25 22 22 22 Precision Scale ---------- -----7 0 7 0 7 11 4 0 2 2 3