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

Podobne dokumenty