Wsparcie Techniczne

SAS/ACCESS interface to DBMS

Najczęstsze problemy i pytania związane z SAS/ACCESS interface to DBMS

Dowiedz się więcej na temat współpracy SASa z DBMS oraz samych funkcji bazy danych.

Gdzie znajdę informacje na temat wspieranych wersji baz danych?

Szczegółowe informacje na temat wspieranych wersji baz danych są zawarte w wymaganiach systemowych System Requirements dla odpowiedniego systemu operacyjnego i wersji SASa.

Czy moduły SAS/ACCESS wymagają instalacji dodatkowego oprogramowania i konfiguracji?

Tak, większość modułów SAS/ACCESS korzysta z natywnych bibliotek klienta bazy danych (np. OCI dla Oracle'a, CLIv2 dla Teradaty, CLI dla DB2). Dlatego klient bazy danych musi być zainstalowany na tej samej maszynie, co SAS Foundation (z modułem SAS/ACCESS), przy czym SAS 64-bitowy wymaga klienta 64-bitowego, SAS 32-bitowy - klienta 32-bitowego.

Szczegółowe informacje na temat konfiguracji najpopularniejszych baz danych można znaleźć w dokumencie SAS i zewnętrzne źródła danych.

Co sprawdzić, jeżeli przy próbie podpięcia biblioteki pojawiają się błędy?

W przypadku błędów należy sprawdzić kolejno:

  • Czy istnieje licencja na odpowiedni moduł SAS/ACCESS.
  • Czy moduł został zainstalowany (Nota 35968).
  • Czy został zainstalowany klient bazy danych i czy za jego pomocą można połączyć się z bazą. Przykładowo dla Oracle'a do tego celu najlepiej wykorzystać sqlplus, dla Teradaty – BTEQ.
  • Czy zostały poprawnie zdefiniowane wymagane zmienne środowiskowe i czy są widoczne dla SASa (zgodnie z dokumentem SAS i zewnętrzne źródła danych): %put %quote(%sysget(nazwa_zmiennej_środowiskowej));
  • Czy instrukcja LIBNAME odwołującej się do DBMS wykonana w SAS Foundation (lub z edytora SAS Enterprise Guide) jest poprawnie podpinana.
  • W SAS Management Console zdefiniować bibliotekę, a następnie wykonać polecenie 'Display libname' dla nowej biblioteki. Porównać, czy wygenerowana instrukcja jest taka sama, jak ta, która była wykonywana w punkcie 5.

Co zrobić, żeby w danych z zewnętrznej bazy widzieć polskie znaki?

Szczegółowe informacje znajdują się w dokumencie SAS i zewnętrzne źródła danych.

Jak zobaczyć, jakie zapytania są przesyłane z SASa do zewnętrznej bazy danych?

Przy dostępie do danych zewnętrznych SAS generuje kod SQL, który przesyła do bazy w celu pobrania danych. Przesyłany kod można podejrzeć w logu SASa korzystając z opcji SASTRACE: options sastrace=',,,d' sastraceloc=saslog nostsuffix;

Informacje wypisane w logu:

2 options sastrace=',,,d' sastraceloc=saslog nostsuffix;
3 proc print data=ora.class;

ORACLE_1: Prepared: on connection 0
SELECT * FROM CLASS

4 where age=15;
5 run;

ORACLE_2: Prepared: on connection 0
SELECT "AGE", "NAME", "SEX", "HEIGHT", "WEIGHT" FROM CLASS WHERE ("AGE" = 15 )

ORACLE_3: Executed: on connection 0
SELECT statement ORACLE_2

Najważniejsze są wyrażenia oznaczone jako Executed, gdyż to one są wykonywane w DBMS. Wyrażenia oznaczone jako Prepared na ogół są wykorzystywane tylko w czasie procesu zbierania informacji i nie mają wpływu na czas przetwarzania. W powyższym przykładzie pierwsze zapytanie 'SELECT * FROM CLASS' jest użyte tylko do sprawdzenia, czy tabela istnieje i odczytania informacji o kolumnach.

Dokładne informacje o opcji SASTRACE można znaleźć m.in. w SAS/ACCESS(R) 9.4 for Relational Databases: Reference.

Opcję można wyłączyć wykonując kod:

option SASTRACE="";

Uwaga! Opcja sastrace powinna być stosowana tylko w przypadku wystąpienia problemów. W środowisku produkcyjnym powinna być wyłączona.

Jak skonfigurować w metadanych bibliotekę do zewnętrznej bazy?

Bibliotekę w metadanych definiuje się za pomocą SAS Management Console. Definicja biblioteki do DBMS w metadanych wymaga kilku elementów:

  • serwera bazy danych
  • biblioteki, odwołującej się do zdefiniowanego serwera
  • loginu w domenie autentykacji zdefiniowanego serwera.

Serwer można albo zdefiniować wcześniej albo podczas definiowania biblioteki. Login definiowany jest niezależnie od biblioteki. Może to być wspólny login dla wielu użytkowników - wtedy będzie definiowany jako login grupowy, dostępny dla wszystkich członków grupy. Ale każdy użytkownik może mieć swój własny login, który będzie przypisany do niego.

Czy używając instrukcji LIBNAME zawsze trzeba podawać użytkownika i hasło?

Począwszy od wersji 9.2 przy nawiązywaniu połączenia z bazą danych zamiast bezpośredniego podawania użytkownika i hasła, można wykorzystać opcję AUTHDOMAIN=. Wartość opcji wskazuje na domenę autentykacji w metadanych, z którą jest stowarzyszony serwer DBMS. Serwer metadanych wyszuka dostępny dla użytkownika login w tej domenie. libname ora oracle path= authdomain="autentication-domain";
proc sql;
connect to oracle(path= authdomain="authentication-domain");
...
Żeby powyższy mechanizm zadziałał, serwer metadanych musi być uruchomiony, a użytkownik musi być z nim połączony. Jeżeli przetwarzanie jest uruchomione na workspace serwerze lub stored process serwerze, wówczas połączenie z serwerem metadanych jest nawiązywane automatycznie. Jeżeli program jest uruchamiany z sesji interaktywnej albo batchowej, należy zdefiniować opcje globalne pozwalające na połączenie z serwerem metadanych (METASERVER=, METAPORT=, METAUSER=, METAPASS=).

Uruchamiając zapytanie w SASie otrzymuję inne wyniki niż uruchamiając je bezpośrednio w Teradacie. Dlaczego?

Z Teradatą można się łączyć w 2 trybach – ansi lub teradata. Tryb połączenia ma wpływ na niektóre operacje wykonywane na danych. Przykładowo przy trybie teradata może być pomijana wielkość liter. SAS domyślnie używa trybu ansi, narzędzia Teradaty – trybu teradata. To powoduje, że to samo zapytanie uruchamiane w SASie może wybrać mniej rekordów (rozróżniana jest wielkość liter) niż uruchomione w narzędziu Teradaty (np. BTEQ).
Tryb można ustawić poprzez opcję mode biblioteki lub połączenia w SQL Explicit Pass-Through.

Czy w SASie mogę czytać/ładować dane do Teradaty korzystając z mechanizmu TPT (Teradata Parallel Transporter)?

Tak, TPT API musi być zainstalowane na tym samym serwerze, co SAS, przy czym SAS 64-bitowy wymaga TPT w wersji 64-bitowej (SAS 32-bitowy – TPT 32-bitowego). TPT musi być skonfigurowane, tzn. biblioteki TPT muszą być widoczne dla SASa (czyli być na zmiennej środowiskowej PATH). W zależności od systemu operacyjnego może się okazać, że powinny być zdefiniowane dodatkowe zmienne środowiskowe. Szczegóły można znaleźć w dokumencie konfiguracyjnym dla danego systemu operacyjnego - UNIX, Windows 64-bit.

Czy z SASa mogę ładować dane do Oracle'a korzystając z mechanizmu bulkload?

Tak, SAS/ACCESS Interface to Oracle może wykorzystywać SQL Loader do ładowania danych do Oracle'a. W tym celu SQL Loader musi być zainstalowany na tej samej maszynie, co SAS, i dostępny dla SASa, tzn. jego lokalizacja (domyślnie $ORACLE_HOME/bin) musi być dodana do odpowiedniej zmiennej środowiskowej (zależnej od systemu operacyjnego). Począwszy od wersji SAS 9.4M2 możliwe jest także wykorzystanie Oracle Direct Path API do ładowania danych.

Jak w SAS BASE sprawdzić dni świąteczne w danym roku?

Poniżej prezentujemy przykładowy program, jak w SAS-4GL zdefiniować polskie święta i skorzystać z tej definicji. Program działa w wersji 9.4M1 lub nowszej.

data holiday_pl;
infile cards missover;
input name $32. ; /* No Space - Case-Insensitive */
input desc $char64. ; /* Description / Localizable */
length category $32;
category='pl_PL';
input month day rule ;
begin=.; end=.;
cards;
NEWYEAR
Nowy Rok
1 1 0
Epiphany
Trzech Króli
1 6 0
EASTER
Wielkanoc
0 0 11
Easter Monday
Poniedziałek Wielkanocny
0 1 11
PENTECOST
Zesłanie Ducha Świętego (Zielone Świątki)
0 49 11
Corpus Christi
Boże Ciało
0 60 11
LABOR
Święto Pracy
5 1 0
Constitution
Święto Konstytucji 3-ego Maja
5 3 0
Assumption
Wniebowzięcie Najświętszej Marii Panny
8 15 0
AllSaintsv
Wszystkich Świętych
11 1 0
PolandsIndependence
Narodowe Święto Niepodległości
11 11 0
Christmas
Boże Narodzenie
12 25 0
Christmas2
Boże Narodzenie, drugi dzień świąt.
12 26 0
;
run;
*Boże Ciało between (including) May21 and Jun24 spełnione?;

proc datasets nolist force;
delete holiday;
change holiday_pl=holiday;
quit;

data _null_;
start='1jan2015'd;
do d=start to '31dec2015'd;
desc=NHOLIDESC(d);
if desc^='' then
put d=date7. d poldfdwn. ', ' desc;
end;
run;

Jak sprawdzić, jakie funkcje SAS są przesyłane do bazy danych?

W ramach zapytań do bazy danych mogą pojawiać się funkcje SAS. Część z nich będzie przesłana do wykonania w DBMS, część będzie wykonywana w SASie. Przesyłanie funkcji zależy przede wszystkim od tego, gdzie i jak została użyta. Domyślnie przesyłane są funkcje użyte w warunku, które mają swoje odpowiedniki w DBMS, tzn. funkcje, które wykonują dokładnie takie same przetwarzania i mają takie same argumenty. Lista funkcji dla każdej bazy jest opisana w SAS/ACCESS® 9.4 for Relational Databases Reference. Można ją również sprawdzić korzystając z opcji SQL_FUNCTIONS_COPY w definicji biblioteki:
libname nazwa mechanizm opcje_połączeniowe
SQL_FUNCTIONS_COPY=>libref.member< | SASLOG;

libref.member


Lista funkcji będzie zapisana w zbiorze o podanej nazwie.

SASLOG
Lista funkcji zostanie wypisana w logu.

Szczegóły o przesyłaniu funkcji do DBMS są zawarte w nocie 42934.

Czy można rozszerzyć listę funkcji przesyłanych do bazy danych?

Administrator może rozszerzyć listę przesyłanych funkcji, dodając funkcje specyficzne dla danej bazy lub zdefiniowane przez użytkownika. Nowe funkcje muszą być zdefiniowane w zbiorze, który będzie podany w definicji biblioteki:
libname nazwa mechanizm opcje_połączeniowe SQL_FUNCTIONS=ALL | "libref.member" | "EXTERNAL_APPEND=libref.member";
ALL
Domyślna lista funkcji zostanie rozszerzona o kilka dodatkowych, które jednak mogą się różnić w szczegółach działania od funkcji wykonywanych w SASie.
libref.member
Podaje nazwę zbioru, w którym znajdują się definicje funkcji, które będą przesyłane do DBMS.

EXTERNAL_APPEND
definiuje zbiór zawierający funkcje, które zostaną dołączone do podstawowej listy. Struktura zbioru jest opisana we wspomnianym powyżej dokumencie.
Może się okazać, że dodatkowo oprócz powyższych kroków, trzeba będzie zdefiniować nową funkcję w SASie, żeby przetwarzanie nie kończyło się błędem, że funkcja jest nieznana. W tym celu można użyć proc FCMP, która pozwoli zarejestrować nową funkcję (jej działanie może być dowolne), ważne, żeby miała tyle samo argumentów i takiego samego typu, np.:

proc fcmp outlib=work.funkcje.p;
function remainder(num1, num2);
return (1);
endsub;
run;
options cmplib=work.funkcje;

libname ora2 oracle user=scott password=tiger path=splibm
sql_functions="test.f";

proc sql;
create table x as
select name, remainder(age,3) from ora2.class order by name;
quit;

Uwaga! Należy pamiętać, że muszą być spełnione pewne warunki, żeby funkcja była przesłana do DBMS. Szczegóły w nocie 42934.

Na czym polega optymalizacja Implicit SQL Pass Through?

Implicit SQL Pass Through to optymalizacja, która może być wykonywana w procedurze SQL w wyrażeniach SELECT, odwołujących się do danych zewnętrznych. Zapytanie zapisane w składni SAS, może zostać zamienione w całości na składnię DBMS i przesłane do wykonania do bazy danych. Jeżeli w zapytaniu występują elementy, których baza danych nie potrafi wykonać, wówczas zapytanie zostanie uproszczone i nastąpi ponowna próba wykonania go w bazie danych. Te części, które nie mogą być wykonane w DBMS, będą wykonane przez SASa.

Czy każde zapytanie w proc SQL podlega optymalizacji Implicit SQL Pass Through?

Nie. Zapytanie musi spełniać co najmniej jeden z następujących warunków, żeby być kandydatem do optymalizacji IPT:

  • zawiera wyrażenie DISTINCT
  • zawiera funkcję agregującą
  • zawiera wyrażenie GROUP BY
  • zawiera wyrażenie HAVING
  • zawiera wyrazenie ORDER BY
  • łączy tabele z tej samej biblioteki lub bibliotek o tych samych parametrach połączenia (m.in. serwer, użytkownik, hasło)
  • zawiera operację SET, inną niż OUTER UNION
  • wyrażenie WHERE zawiera podzapytanie.

Optymalizacja IPT nie będzie użyta, nawet jeśli zapytanie spełnia jeden z powyższych warunków, w przypadku gdy:

  • zapytanie zawiera mechanizm Explicit SQL Pass Through
  • wykorzystywane są opcje zbioru
  • zapytanie zawiera operator SAS OUTER UNION
  • w zapytaniu występuje funkcja, która nie została zamapowana na funkcję DBMS
  • zapytanie wymaga ponownego przetworzenia danych (remerging)
  • w połączeniu podane zostało użyte słowo kluczowe ANSIMISS lub NOMISS
  • opcja biblioteki zabrania wykonywania optymalizacji IPT.

Czym różni się Explicit od Implicit SQL Pass Through?

Implicit SQL Pass Through jest wykonywane niejawnie przez moduł SAS/ACCESS, który zamienia składnię SAS na składnię DBMS i próbuje wykonać zapytanie w bazie danych. Explicit SQL Pass Through to jawne użycie specjalnych wyrażeń w proc SQL, które zagwarantują, że zapytanie bądź polecenie zostanie w całości przekazane do wykonania w bazie danych. Takie zapytanie, czy polecenie, musi być zgodne ze składnią DBMS.

proc SQL;
connect to dbms(parametry połączeniowe);
select * from connection to dbms(
wyrażenie_SELECT);
execute(
wyrażenie_inne_niż_select
) by teradata;
disconnect from dbms;
quit;

W jaki sposób mogę z SASa przesyłać hinty do Oracle'a?

Oracle pozwala przy dostępie do danych na definiowanie hintów, czyli wskazówek, jak przetworzyć dane. Hinty są umieszczane w kodzie pomiędzy '/*+' i '*/'. W kodzie SAS ten zapis oznacza komentarz. Jeżeli przy odwołaniu do zbioru ma być przesłany do Oracle hint, należy skorzystać z opcji zbioru ORHINTS:
13 proc print data=ora.class(orhints='/*+ ALL_ROWS */');
14 run;

ORACLE_5: Prepared: on connection 0
SELECT /*+ ALL_ROWS */ * FROM CLASS

ORACLE_6: Executed: on connection 0

Hinty można przesyłać również w ramach mechanizmu Explicit SQL Pass-Through:

22 proc sql;
23 connect to oracle (user= password= path= preserve_comments);

24 select *
25 from connection to oracle
26 (select /*+ all_rows */ count(*) from class);

ORACLE_7: Prepared: on connection 2
select /* +all_rows */ count(*) from class

ORACLE_8: Executed: on connection 2
SELECT statement ORACLE_7

W przypadku wyrażenia execute do przesłania hintów należy użyć specjalnej składni:

29 proc sql;
30 connect to oracle (user=scott password=XXXXX path=orcl preserve_comments);

31 execute by oracle
32 ( delete /*+ FIRST_ROWS */ from class where age=12);

ORACLE_9: Executed: on connection 2
delete /*+ FIRST_ROWS */ from class where age=12

Co oznacza pojęcie In-database i jak jest realizowane w SASie?

In-database to możliwość wykonywania funkcji, procesów i przetwarzań SAS po stronie bazy danych. Realizowane jest poprzez:

  • mechanizm Implicit SQL Pass Through (przesyłanie zapytań do DBMS), rozszerzanie listy funkcji przesyłanych do DBMS
  • możliwość wykonywania całości lub części niektórych procedur SAS Foundation (FREQ, RANK, REPORT, SORT, SUMMARY/MEANS, TABULATE ) przez bazę danych
  • wykorzystywanie formatów SAS po stronie bazy danych
  • możliwość wykonywania całości lub części procedur analitycznych przez DBMS (SAS Analytics Accelerator)
  • wykonywanie scoringów po stronie DBMS (SAS Scoring Accelerator).
  • wykonywanie kodów DS2 po stronie DBMS (SAS Code Accelerator)
  • czyszczenie danych w DBMS (SAS Quality Accelerator).

Nie wszystkie z powyższych mechanizmów są wspierane dla wszystkich baz danych. Trzy pierwsze funkcjonalności zapewnia moduł SAS/ACCESS, kolejne wymagają dodatkowych licencji. Wszystkie funkcjonalności poza Implicit SQL Pass Through oraz wykonywaniem procedur SAS Foundation w DBMS, wymagają instalacji dodatkowych pakietów po stronie bazy danych.

Szczegóły na temat wsparcia poszczególnych elementów w konkretnej bazie danych można znaleźć w SAS(®) 9.4 In-Database Products: User's Guide.

Więcej informacji można również znaleźć w dokumencie Technologia In-Database.

Czy może się zdarzyć, że procedury FREQ, RANK, REPORT, SORT, SUMMARY/MEANS, TABULATE nie wykonają się w bazie danych?

W procedurach mogą pojawić się opcje, które spowodują, że przetwarzanie nie będzie mogło być zapisane w postaci zapytania SQL. Przetwarzanie po stronie bazy danych może również zostać wyłączone przez opcję SQLGENERATION (opcja globalna lub biblioteki).
Szczegóły opisane są w nocie 43144.

Gdzie mogę znaleźć więcej informacji na temat współpracy SASa z DBMS?