Pokazywanie postów oznaczonych etykietą Oracle. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Oracle. Pokaż wszystkie posty

wtorek, 16 listopada 2010

dual

Tabela dual w bazie Oracle jest tabelą w schemacie SYS do którego uprawnienia odczytu na rola PUBLIC wprowadzonym by pomóc rozwiązać problemy z zapytaniami nie operującymi na zbiorach. Oracle inaczej niż SQL Server nie pozwala na użycie klauzuli SELECT bez FROM.
Używamy jej gdy chcemy wyciągnąć zmienne systemowe, pobrania nowej wartości sekwencji i wielu innych miejscach.

SQL> select sysdate from dual;

SYSDATE
-------------------
2010-11-15 15:22:13

SQL> select user from dual;

USER
------------------------------
SYS

Tabelę jako taka możemy obejrzeć przy pomocy DESC

SQL> desc dual;

 Name       Null?    Type
 ---------- -------- --------------
 DUMMY               VARCHAR2(1)

Możemy również obejrzeć jej zawartość

SQL> select * from dual;

D
-
X

Jednym z podstawowych założeń jest fakt że tabela dual ma jeden rekord w kolumnie DUMMY

SQL> select count(*) from dual;

  COUNT(*)
----------
         1

O tyle ciekawym wydaje się fakt, że bez większych problemów możemy go usunąć lub dodać następne a nawet zmienić samą tabelę co nie jest dobrą praktyką.
Po dodaniu wiersza do tabeli

SQL> select count(*) from dual;

  COUNT(*)
----------
         1

Ale musimy się liczyć z błędami

ORA-01422: exact fetch returns more than requested number of rows
Podczas operacji pozornie nie związanymi z ta tabela np

SQL> Drop table test

ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01422: exact fetch returns more than requested number of rows

Ciekawostką jest to że tabela dual jest dostępna również przed otwarciem  bazy ale zwraca inne wyniki

SQL> select * from  dual;

ADDR           INDX    INST_ID D
-------- ---------- ---------- -
0A6231A7          0          1 X

wtorek, 9 listopada 2010

linked SQL Server

Linkowanie SQL Server w Oracle jest możliwe dzięki Oracle Transparent Gateway for MS SQL Server, jeżeli nie zainstalowałeś go przy instalacji serwera można go ściągnąć ze strony oracla.
Edytujemy plik konfiguracyjny

$ORACLE_HOME/tg4msql/admin/inittg4msql.ora

Wypełniając sekcje

HS_FDS_CONNECT_INFO="SERVER=name_server;DATABASE=name_db"
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=user
HS_FDS_RECOVERY_PWD=pass

Skonfiguruj listnera  $ORACLE_HOME/network/admin/listener.ora

(SID_DESC =
 (PROGRAM = tg4msql)
 (SID_NAME = SQLServer)
 (ORACLE_HOME = /home/oracle/product/10.2.0/db_1/
 )
 )
Restartujemy serwis listera

lsnrctl stop
lsnrctl start

edytujemy plik $ORACLE_HOME/network/admin/tnsnames.ora

SQLServer=
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)
  (HOST = sqlserver)
  (PORT = 1521)))
 (CONNECT_DATA =
 (SID = SQLServer)
 )
 (HS=OK)
 )

Z konsoli SQL*Plus wykonujemy polecenie

SQL> create database link msql
connect to user
identified by pass
using 'SQLServer';

Do bazy odwołujemy się przy pomocy zapytania ze składnią T-SQL dodając na końcu nazwę linka „@mssql”

SQL> select count(*) from tabela_test@msql;

  COUNT(*)
----------
     12237

SQL>