แสดงบทความที่มีป้ายกำกับ ออราเคิล แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ ออราเคิล แสดงบทความทั้งหมด

วันจันทร์ที่ 12 พฤษภาคม พ.ศ. 2557

ทำไมต้องศึกษาออราเคิล Statspack

บ่อยครั้งที่ผมจะบอกเพื่อนที่ทำงานกับผลิตภัณฑ์ที่เกี่ยวกับฐานข้อมูลออราเคิล และไม่เชี่ยวชาญนักในฐานข้อมูลออราเคิล เมื่อมีปัญหาให้สร้างรายงานจาก AWR แล้วส่งมาให้ผมช่วยในการวิเคราะห์ วันนี้เพื่อนผมที่ใช้ Oracle Standard Edition 11G ส่งปัญหา WARNING: Since the DB Time is less than one second, there was minimal foreground activity in the snapshot period. Some of the percentage values will be invalid. ผมจึงแนะนำเพื่อนให้ติดตั้ง Oracle Statspack
ข้อดีในการใช้ Statspack อาจไม่ใช่แค่เพราะไม่เสียค่าใช้จ่ายในการใช้งาน แต่อาจเพราะว่า เราใช้ Oracle Standard One หรือ Standard Edition นั่นเป็นเหตุที่ต้องติดตั้งใช้งาน Oracle Statspack

ผมเลยเริ่มเขียนบทความ ออราเคิล (Oracle) Statspack (ติดตั้งและใช้งานเบื้องต้น)

อย่างไรก็ดีสิ่งที่สำคัญเราควรสามารถวิเคราะห์รายงานที่เกิดจาก Statspack หรือ AWR ได้

ตัวอย่างการติดตั้ง
SQL> connect / as sysdba
SQL> CREATE TABLESPACE PERFSTAT_TS DATAFILE '/u01/app/oracle/oradata/orcl/perfstat_ts01.dbf' size 50M autoextend on maxsize unlimited;
SQL> define default_tablespace='PERFSTAT_TS'
SQL> define temporary_tablespace='TEMP'
SQL> define perfstat_password='password'
SQL> @?/rdbms/admin/spcreate.sql
SQL> undefine perfstat_password
SQL> @?/rdbms/admin/spauto.sql
ตัวอย่างสร้าง Report
SQL> connect perfstat/password
SQL> define begin_snap=9
SQL> define end_snap=10
SQL> define report_name=report_name.txt
SQL> @?/rdbms/admin/spreport.sql

วันพุธที่ 19 มีนาคม พ.ศ. 2557

ติดตั้ง Oracle Database บน CentOS?

บางครั้งในมุมมองของคนทำงานไอทีอาจถามว่าเราติดตั้ง Oracle Database บน CentOS ได้หรือไม่? ผมต้องขอบอกเลยว่าได้แน่นอน แต่อย่างไรนั้นผมไม่ขอกล่าวในบทความนี้ สิ่งที่สำคัญคือ ผมควรติดตั้ง Oracle Database บน CentOS สำหรับ Production หรือไม่?
CentOS เป็นระบบปฏิบัติการ Linux ที่เป็น open source community ดังนั้นเราจะไม่เสียค่าใช้จ่ายเรื่อง License เมื่อนำมาใช้กับระบบ แต่สิ่งที่เราควรคำนึงอย่างยิ่ง CentOS นั้น certify กับ Oracle Database หรือไม่? เราสามารถเข้าไปตรวจสอบได้ที่ http://support.oracle.com จากนั้นเลือก "Certifications" (ในกรณีนี้ผม ขอใช้ Oracle Database 12.1.0.1 บน Linux 64bits)
หลังจากการค้นหาก็พบว่า CentOS ไม่ certify ในการติดตั้ง Oracle Database 12.1 นั่นหมายถึง Oracle ไม่รับรองการติดตั้ง Oracle Database 12.1 บนระบบปฏิบัติการ CentOS ดังนั้นเราไม่ควรติดตั้งในกรณีแบบนี้บน Production เพราะเมื่อเกิดปัญหาอะไรก็ตาม หลังการติดตั้งและใช้งาน Oracle จะไม่สามารถช่วยเหลือได้ 
12.1
OS versions and minimum levels: 
Oracle Linux 6.x
Red Hat compatible Kernel
Update 2 or higher - Oracle Unbreakable Enterprise Kernel (UEK R2) 2.6.39-100.5.1 or higher
Update 4 or higher - Oracle Unbreakable Enterprise Kernel (UEK R3) 3.8.13-16 or higher
Oracle Linux 5 Update 6
Red Hat Enterprise Linux 6
Red Hat Enterprise Linux 5 Update 6
SLES 11 SP2: 3.0.13-0.27 or later
See Oracle Database Installation Guide 12c Release 1 (12.1) for Linux, Chapter 3.7.1 for supported kernels and package information for all the above Linux versions
ผมขอแนะนำให้เช็ค Certification Information for Oracle Database on Linux x86-64 (Doc ID 1304727.1)

ในมุมมองของผมเราควรใช้ Oracle Linux หากท่านมี Account บน Oracle Technology Network สามารถดาวน์โหลดได้ที่ https://edelivery.oracle.com/linux จากนั้นเมื่อใช้งานบนระบบจริง เราก็ดำเนินการในการซื้อ Support.





วันพฤหัสบดีที่ 12 ธันวาคม พ.ศ. 2556

Oracle SQL Developer 4.0 ใหม่! เพิ่มประสิทธิภาพการใช้งานกับ Oracle Database 12c

วันนี้ผมได้อ่านบทความบท tweeter และ Marketwactch - ออราเคิลได้เปิดตัว Oracle SQL Developer 4.0  (4.0.0.13.80). เราสามารถ Download เพื่อมาทดสอบได้จาก OTN เว็บ. Oracle SQL Developer 4.0 ตัวใหม่นี้ได้แก้ปัญหาเกียวกับบักมากกว่า 500 ตัว เราสามารถอ่านได้ที่...
ผู้ใช้จะพบกับฟีเจอร์ใหม่ๆ อันได้แก่
Database Performance Monitoring
Find Database Object - Search
Command Line
Cart
Reports
UI Enhancements
Data Modeler 4.0
JDK 7 Support
อ้างอิง
http://www.marketwatch.com/story/oracle-sql-developer-40-enhances-support-for-oracle-database-12c-2013-12-12
http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html

วันพุธที่ 18 กันยายน พ.ศ. 2556

APEX 4.2.3 บน CDB

ครั้งที่แล้วได้ลองทดสอบใช้ Patch set 17347169 ในการอัพเกรดฐานข้อมูลออราเคิล 12c CDB - APEX 4.2.3 - อัพเกรด APEX บนฐานข้อมูล 12c (Oracle Multitenant). วันนี้เป็นโอกาสดีในการทดสอบติดตั้ง APEX 4.2.3 บน CDB.
เริ่มต้นด้วยการใช้ apexins_con.sql ติดตั้ง APEX แบบ development บน CDB.
SQL> select CON_ID, NAME, OPEN_MODE from v$pdbs;

    CON_ID NAME                           OPEN_MODE
---------- ------------------------------ ----------
         2 PDB$SEED                       READ ONLY
         3 PDB_OPUN                       READ WRITE

SQL>  select COMP_ID, VERSION, CON_ID from cdb_registry where COMP_ID='APEX';

no rows selected

SQL>
[oracle@test12c ~]$ unzip -l apex_4.2.3.zip|tail
     2256  08-22-2012 10:46   apex/apxconf.sql
     4301  08-15-2013 04:08   apex/apxdvins.sql
     1150  08-22-2012 10:46   apex/apxchpwd.sql
        5  08-22-2012 10:46   apex/apxexit.sql
     4706  03-02-2013 22:19   apex/catapx.sql
      538  03-07-2008 21:20   apex/apxe102.sql
     3271  03-02-2013 22:19   apex/apxxepwd.sql
    13889  06-18-2011 00:08   apex/apexvalidate.sql
---------                     -------
989017663                     12307 files
[oracle@test12c ~]$ ls -la apex_4.2.3.zip
-rw-r--r--. 1 oracle oinstall 162660590 Sep 18 13:15 apex_4.2.3.zip
[oracle@test12c ~]$ cd /tmp/
[oracle@test12c tmp]$ man unzip
[oracle@test12c tmp]$ unzip /home/oracle/apex_4.2.3.zip ^C
[oracle@test12c tmp]$ pwd
/tmp
[oracle@test12c tmp]$ cd apex/
[oracle@test12c apex]$ ls
apex_epg_config_con.sql    apex_rest_config.sql  apxdevrm.sql      apxexit.sql       apxremov2.sql     apxxepwd.sql  images
apex_epg_config_core.sql   apexvalidate.sql      apxdvins_con.sql  apxldimg_con.sql  apxremov_con.sql  builder       load_trans.sql
apex_epg_config.sql        appins.sql            apxdvins.sql      apxldimg.sql      apxremov.sql      catapx.sql    owa
apexins_con.sql            apxchpwd.sql          apxe101.sql       apxpatch.sql      apxrtins_con.sql  core          utilities
apexins.sql                apxconf.sql           apxe102.sql       apxprereq.sql     apxrtins.sql      coreins.sql
apex_rest_config_con.sql   apxdbmig.sql          apxe111.sql       apxrelod.sql      apxsqler.sql      devins.sql
apex_rest_config_core.sql  apxdevrm_con.sql      apxe112.sql       apxremov1.sql     apxxemig.sql      endins.sql
[oracle@test12c apex]$
[oracle@test12c apex]$ ls -l apexins_con.sql
-rw-r--r--. 1 oracle oinstall 2042 Aug 31 13:38 apexins_con.sql
[oracle@test12c apex]$ sqlplus /nolog

SQL*Plus: Release 12.1.0.1.0 Production on Wed Sep 18 14:12:33 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

SQL> connect / as sysdba
Connected.
SQL> @apexins_con.sql SYSAUX SYSAUX TEMP /i/

PL/SQL procedure successfully completed.

Performing installation in multitenant container database in the background.
The installation progress is spooled into apexins_con*.log files.

Please wait...

Installation completed. Log files for each container can be found in:

apexins_con*.log

You can quickly scan for ORA errors or compilation errors by using a utility
like grep:

grep ORA- *.log
grep PLS- *.log

SQL> select CON_ID, NAME, OPEN_MODE from v$pdbs;

    CON_ID NAME                           OPEN_MODE
---------- ------------------------------ ----------
         2 PDB$SEED                       READ ONLY
         3 PDB_OPUN                       READ WRITE

SQL> select COMP_ID, VERSION, CON_ID from cdb_registry where COMP_ID='APEX';

COMP_ID                        VERSION                            CON_ID
------------------------------ ------------------------------ ----------
APEX                           4.2.3.00.08                             1
APEX                           4.2.3.00.08                             2
APEX                           4.2.3.00.08                             3
เนื่องจากต้องการใช้ Embedded PL/SQL Gateway เลยเซต HTTP port บน PDB (PDB_OPUN) และเปลี่ยน Password + unlock ให้กับ ANONYMOUS
SQL> alter session set container = PDB_OPUN;

Session altered.

SQL> @apxconf

      PORT
----------
      8080

Enter values below for the XDB HTTP listener port and the password for the Application Express ADMIN user.
Default values are in brackets [ ].
Press Enter to accept the default value.


Enter a value below for the password for the Application Express ADMIN user.


Enter a password for the ADMIN user              []

Session altered.

...changing password for ADMIN

PL/SQL procedure successfully completed.

Enter a port for the XDB HTTP listener [      8080] 8000
...changing HTTP Port

PL/SQL procedure successfully completed.

SQL>
SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;

Session altered.

SQL> ALTER USER ANONYMOUS IDENTIFIED BY PASSWORD ACCOUNT UNLOCK;

User altered.

SQL> select con_id, account_status from cdb_users where username='ANONYMOUS';

    CON_ID ACCOUNT_STATUS
---------- --------------------------------
         3 OPEN
         2 EXPIRED & LOCKED
         1 OPEN

SQL>
SQL> !lsnrctl status |grep 8000
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test12c)(PORT=8000))(Presentation=HTTP)(Session=RAW))

SQL>
จากนั้นก็ได้เวลาติดตั้ง Embedded PL/SQL Gateway
- apex_epg_config_con.sql ติดตั้ง Embedded PL/SQL Gateway ให้กับ CDB$ROOT, PDB$SEED และ PDB...
- apex_epg_config.sql ใช้ติดตั้งบน PDB ต้องการ
ในตัวอย่างนี้ ผมติดตั้ง Embedded PL/SQL Gateway ใน PDB_OPUN
[oracle@test12c apex]$ ls -l apex_epg_config_con.sql
-rw-r--r--. 1 oracle oinstall 2130 Aug 31 13:38 apex_epg_config_con.sql
[oracle@test12c apex]$ ls -l apex_epg_config.sql
-rw-r--r--. 1 oracle oinstall 831 Apr  6 13:09 apex_epg_config.sql
[oracle@test12c apex]$
[oracle@test12c apex]$
[oracle@test12c apex]$ sqlplus /nolog

SQL*Plus: Release 12.1.0.1.0 Production on Wed Sep 18 18:21:05 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

SQL> conn / as sysdba
Connected.
SQL>  alter session set container = PDB_OPUN;

Session altered.

SQL> show con_name

CON_NAME
------------------------------
PDB_OPUN
SQL> @apex_epg_config /tmp

PL/SQL procedure successfully completed.


PL/SQL procedure successfully completed.

. Loading images directory: /tmp/apex/images

Directory created.

PL/SQL procedure successfully completed.

PL/SQL procedure successfully completed.

Commit complete.

Directory dropped.

timing for: Load Images
Elapsed: 00:02:13.11

PL/SQL procedure successfully completed.


Commit complete.

SQL>
หลังจากนั้นทดสอบเรียกจาก Browser ...
ตอนนี้เราสามารถใช้ APEX 4.2.3 ใน PDB (PDB_OPUN) ผ่าน Embedded PL/SQL Gateway.
จากนั้นเราอาจอนุญาติให้ APEX_040200 นั้นสามารถติดต่อไป Network ข้างนอก
SQL> conn / as sysdba
Connected.
SQL> alter session set container=pdb_opun;

Session altered.

SQL> show con_name

CON_NAME
------------------------------
PDB_OPUN
SQL> DECLARE
  2    ACL_PATH  VARCHAR2(4000);
  3  BEGIN
  4    -- Look for the ACL currently assigned to '*' and give APEX_040200
  5    -- the "connect" privilege if APEX_040200 does not have the privilege yet.
  6
  7    SELECT ACL INTO ACL_PATH FROM DBA_NETWORK_ACLS
  8     WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;
  9
 10    IF DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(ACL_PATH, 'APEX_040200',
 11       'connect') IS NULL THEN
 12        DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH,
 13       'APEX_040200', TRUE, 'connect');
 14    END IF;
 15
 16  EXCEPTION
 17    -- When no ACL has been assigned to '*'.
 18    WHEN NO_DATA_FOUND THEN
 19    DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('power_users.xml',
 20      'ACL that lets power users to connect to everywhere',
 21      'APEX_040200', TRUE, 'connect');
 22    DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('power_users.xml','*');
 23  END;
 24  /
COMMIT;

PL/SQL procedure successfully completed.

SQL>
Commit complete.

SQL>
 อ่านเพิ่มเติม http://docs.oracle.com/cd/E16655_01/install.121/e17958/toc.htm

วันอังคารที่ 17 กันยายน พ.ศ. 2556

APEX 4.2.3 - อัพเกรด APEX บนฐานข้อมูล 12c (Oracle Multitenant)

วันนี้ได้อ่าน Oracle Application Express 4.2.3 now available ผมได้เห็นการอัพเกรด APEX บนฐานข้อมูล 12c (Oracle Multitenant). ล่าสุดก่อนหน้านี้ผมได้ลองใช้ patch ที่มีแต่ก็ยังไม่สามารถทำการอัพเกรด APEX ทีเดียวใน CDB$ROOT, PDB$SEED และ PDB... หลังจากผมได้ดาวน์โหลด patch 17347169 ก็ได้เวลาในการทดสอบ
ขั้นตอนแรกก็คือติดตั้ง Patch Set ใน CDB.
SQL> select CON_ID, NAME, OPEN_MODE from v$pdbs;

    CON_ID NAME                           OPEN_MODE
---------- ------------------------------ ----------
         2 PDB$SEED                       READ ONLY
         3 TESTPDB01                      READ WRITE

SQL> select COMP_ID, VERSION, CON_ID from cdb_registry where COMP_ID='APEX';

COMP_ID                        VERSION                            CON_ID
------------------------------ ------------------------------ ----------
APEX                           4.2.0.00.27                             1
APEX                           4.2.0.00.27                             2
APEX                           4.2.0.00.27                             3

[oracle@test12c ~]$ ls -l p17347169_423_Generic.zip
-rw-r--r--. 1 oracle oinstall 77044627 Sep 17 17:25 p17347169_423_Generic.zip
[oracle@test12c ~]$ unzip -l p17347169_423_Generic.zip |tail
     1197  09-11-2013 02:16   patch/patches/4_2_3/prereq.sql
     1812  07-13-2013 01:55   patch/patches/4_2_3/syspatch.sql
   144074  09-17-2013 00:45   patch/readme.htm
   220231  09-17-2013 00:45   patch/readme.pdf
        0  09-11-2013 04:59   patch/utilities/
     1621  08-31-2013 13:38   patch/utilities/reset_image_prefix.sql
     2804  08-31-2013 13:38   patch/utilities/reset_image_prefix_con.sql
     2575  08-31-2013 13:38   patch/utilities/reset_image_prefix_core.sql
---------                     -------
184039056                     11743 files
[oracle@test12c ~]$ unzip -l p17347169_423_Generic.zip
[oracle@test12c ~]$ ls patch/
apex_rest_config_con.sql   apex_rest_config.sql  apxldimg.sql      apxpatch.sql  images   readme.htm  utilities
apex_rest_config_core.sql  apxldimg_con.sql      apxpatch_con.sql  core          patches  readme.pdf
[oracle@test12c ~]$ cd patch/
[oracle@test12c patch]$

[oracle@test12c patch]$ ls -l apxpatch_con.sql
-rw-r--r--. 1 oracle oinstall 2496 Aug 31 13:38 apxpatch_con.sql
[oracle@test12c patch]$ pwd
/home/oracle/patch
[oracle@test12c patch]$ sqlplus  /nolog

SQL*Plus: Release 12.1.0.1.0 Production on Tue Sep 17 22:32:46 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

SQL> connect / as sysdba
Connected.
SQL> @apxpatch_con.sql
PL/SQL procedure successfully completed.

Performing installation in multitenant container database in the background.
The installation progress is spooled into *patch_con*.log files.

Please wait...

PL/SQL procedure successfully completed.

PL/SQL procedure successfully completed.

timing for: Complete Patch
Elapsed: 01:29:21.57

Installation completed. Log files for each container can be found in:

syspatch_con*.log
ddlpatch_con*.log
deppatch_con*.log
corepatch_con*.log

You can quickly scan for ORA errors or compilation errors by using a utility
like grep:

grep ORA- *.log
grep PLS- *.log

SQL>
SQL> !grep ORA- *.log

SQL>
!grep PLS- *.log

SQL> select COMP_ID, VERSION, CON_ID from cdb_registry where COMP_ID='APEX';

COMP_ID                        VERSION                            CON_ID
------------------------------ ------------------------------ ----------
APEX                           4.2.3.00.08                             1
APEX                           4.2.3.00.08                             3
APEX                           4.2.3.00.08                             2
หลังจากนั้นอัพเดทรูปใน CDB ถ้าใช้ Embedded PL/SQL Gateway.
SQL> @apxldimg_con.sql /home/oracle/patch

PL/SQL procedure successfully completed.

Performing installation in multitenant container database in the background.
The installation progress is spooled into apxldimg_con*.log files.

Please wait...

/bin/bash: -c: line 0: syntax error near unexpected token `&'
/bin/bash: -c: line 0: `&OH_HOME/perl/bin/perl -I &OH_HOME/rdbms/admin &OH_HOME/rdbms/admin/catcon.pl -b apxldimg_con apxldimg.sql --p&1'


Installation completed. Log files for each container can be found in:

apxldimg_con*.log

You can quickly scan for ORA errors or compilation errors by using a utility
like grep:

grep ORA- *.log
grep PLS- *.log

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
[oracle@test12c patch]$ less apxldimg_con.sql
[oracle@test12c patch]$ less  apxpatch_con.sql
[oracle@test12c patch]$ sqlplus  /nolog

SQL*Plus: Release 12.1.0.1.0 Production on Wed Sep 18 00:08:06 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

SQL> conn / as sysdba
Connected.
SQL>  @apxldimg_con.sql /home/oracle/patch

PL/SQL procedure successfully completed.

Performing installation in multitenant container database in the background.
The installation progress is spooled into apxldimg_con*.log files.

Please wait...

Installation completed. Log files for each container can be found in:

apxldimg_con*.log

You can quickly scan for ORA errors or compilation errors by using a utility
like grep:

grep ORA- *.log
grep PLS- *.log

SQL>

เป็นอันสำเร็จด้วยดี

วันอาทิตย์ที่ 11 สิงหาคม พ.ศ. 2556

ทดสอบ 12c Default Values สำหรับคอลัมน์ (Sequence และ Explicit NULL Insertion)

บทความนี้ไม่ต้องการเกริ่นอะไรมาก ดังที่เราทราบกันดีว่า ฐานข้อมูลออราเคิล 12c เราสามารถเซตคอลัมน์กับ default values (บน Sequence และ Explicit NULL Insertion).
ออราเคิล sequence - เราสามารถระบุ sequence.CURVAL หรือ sequence.NEXTVAL
ออราเคิล Explicit NULL Insertion (ON NULL...) - เราสามารถระบุค่า default ที่เราต้องการเมื่อ INSERT กับค่า NULL  
ตัวอย่าง ผมขอใช้ทั้งสองกรณีในทีเดียวเลยนะครับ
SQL> CREATE SEQUENCE S1 START WITH 1;

Sequence created.

SQL> CREATE TABLE TB (ID NUMBER DEFAULT S1.NEXTVAL NOT NULL, NAME VARCHAR2(30), ADDR VARCHAR2(50) DEFAULT ON NULL 'N/A' NOT NULL);

Table created.

SQL> DESC TB
 Name                                                                                Null?    Type
 --------------- -------- --------------------------------------------------------
 ID                                                                                  NOT NULL NUMBER
 NAME                                                                                         VARCHAR2(30)
 ADDR                                                                                NOT NULL VARCHAR2(50)

SQL> INSERT INTO TB(NAME) VALUES('SURACHART OPUN');

1 row created.

SQL> INSERT INTO TB(NAME) VALUES('TEST!!!');

1 row created.

SQL> SELECT * FROM TB;

        ID NAME                           ADDR
---------- ------------------------------ --------------------------------------------------
         1 SURACHART OPUN                 N/A
         2 TEST!!!                        N/A

อ่านเพิ่มเติม Oracle Documents.

เรียนสร้างเทเบิลบนฐานข้อมูลออราเคิล 12c กับ Identity Column

วันนี้ได้มีโอกาสอ่านเกี่ยวกับการสร้างเทเบิลกับ  Identity คอลัมน์ ผมเกิดความสงสัยเลยลองหาข้อมูลและลองทดสอบดู จริงๆ แล้วคล้ายกับการที่เราสร้างเทเบิลแล้วมีการระบุ Sequence ให้กับคอลัมน์ที่ต้องการ อย่างไร? คิดง่ายๆ ว่า Option นี้ เข้ามาช่วยเราในการที่ไม่ต้องสร้าง Sequence เอง...

จะเห็นว่าเราสามารถเลือก ALWAYS (Oracle จะ generate ค่าของ sequence ทุกๆครั้ง เราไม่สามารถระบุค่าเองให้กับคอลัมน์นี้) และ BY DEFAULT (Oracle จะ generate ค่าของ sequence และเรายังสามารถระบุค่าในคอลัมน์นี้ได้เอง แต่ไม่สามารถระบุค่า NULL ยกเว้นเราใช้ BY DEFAULT ON NULL)
จำไว้ว่า  Identity คอลัมน์คือการสร้าง Sequence ดังนั้น USER ต้องมีสิทธิ์ในการสร้าง Sequence นะครับ

ขอใช้ตัวอย่างจาก Oracle Document มานำเสนอนะครับ
SQL> grant create table to demo;

Grant succeeded.

SQL> conn demo
Enter password:
Connected.
SQL> CREATE TABLE t1 (id NUMBER GENERATED AS IDENTITY, name varchar2(20));
CREATE TABLE t1 (id NUMBER GENERATED AS IDENTITY, name varchar2(20))
*
ERROR at line 1:
ORA-01031: insufficient privileges


SQL> conn / as sysdba
Connected.
SQL> grant create sequence to demo;

Grant succeeded.

SQL> conn demo
Enter password:
Connected.
SQL> CREATE TABLE t1 (id NUMBER GENERATED AS IDENTITY, name varchar2(20));

Table created.

SQL> select * from USER_TAB_IDENTITY_COLS;

TABLE_NAME                     COLUMN_NAME                    GENERATION
------------------------------ ------------------------------ ----------
IDENTITY_OPTIONS
------------------------------------------------------------------------------------------------------------------------------------------------------
T1                             ID                             ALWAYS
START WITH: 1, INCREMENT BY: 1, MAX_VALUE: 9999999999999999999999999999, MIN_VALUE: 1, CYCLE_FLAG: N, CACHE_SIZE: 20, ORDER_FLAG: N

SQL> select * from user_sequences;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER PARTITION_COUNT S K
------------------------------ ---------- ---------- ------------ - - ---------- ----------- --------------- - -
ISEQ$$_92172                            1 1.0000E+28            1 N N         20           1                 N N

SQL> select * from T1;

no rows selected

SQL> desc T1
 Name                                                                                Null?    Type
 ----------------------------------------------------------------------------------- -------- --------------------------------------------------------
 ID                                                                                  NOT NULL NUMBER
 NAME                                                                                         VARCHAR2(20)

SQL> insert into T1(name) values('Surachart Opun');
1 row created.

SQL> select * from T1;

        ID NAME
---------- --------------------
         1 Surachart Opun

SQL> select * from user_sequences;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER PARTITION_COUNT S K
------------------------------ ---------- ---------- ------------ - - ---------- ----------- --------------- - -
ISEQ$$_92172                            1 1.0000E+28            1 N N         20          21                 N N

SQL> insert into T1(name) values('Test Again!');

1 row created.

SQL>  select * from T1;

        ID NAME
---------- --------------------
         1 Surachart Opun
         2 Test Again!

SQL> select * from user_sequences;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER PARTITION_COUNT S K
------------------------------ ---------- ---------- ------------ - - ---------- ----------- --------------- - -
ISEQ$$_92172                            1 1.0000E+28            1 N N         20          21                 N N
ตัวอย่างอื่นๆ
SQL> CREATE TABLE t2 (id NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 100 INCREMENT BY 10), Name varchar2(20));

Table created.

SQL> select * from USER_TAB_IDENTITY_COLS where table_name='T2';

TABLE_NAME                     COLUMN_NAME                    GENERATION
------------------------------ ------------------------------ ----------
IDENTITY_OPTIONS
------------------------------------------------------------------------------------------------------------------------------------------------------
T2                             ID                             BY DEFAULT
START WITH: 100, INCREMENT BY: 10, MAX_VALUE: 9999999999999999999999999999, MIN_VALUE: 1, CYCLE_FLAG: N, CACHE_SIZE: 20, ORDER_FLAG: N


SQL> select * from t2;

no rows selected

SQL> insert into T2(name) values ('Chart');

1 row created.

SQL> select * from t2;

        ID NAME
---------- --------------------
       100 Chart

***************************************************************************
SQL> CREATE TABLE t3 (id NUMBER  GENERATED BY DEFAULT AS IDENTITY  , name varchar2(20));

Table created.

SQL> CREATE TABLE t4 (id NUMBER  GENERATED BY DEFAULT ON NULL AS IDENTITY , name varchar2(20));

Table created.

SQL>
SQL>
SQL> insert into T3 values(10,'TEST');

1 row created.

SQL> insert into T4 values(10,'TEST');

1 row created.

SQL> select * from T3;

        ID NAME
---------- --------------------
        10 TEST

SQL> c/3/4
  1* select * from T4
SQL> /

        ID NAME
---------- --------------------
        10 TEST

SQL> insert into T3(name) values ('Chart');

1 row created.

SQL> c/3/4
  1* insert into T4(name) values ('Chart')
SQL> /

1 row created.

SQL>  select * from T3;

        ID NAME
---------- --------------------
        10 TEST
         1 Chart

SQL> select * from T4
  2  /

        ID NAME
---------- --------------------
        10 TEST
         1 Chart

SQL>  insert into T3 values(NULL,'AAA');
 insert into T3 values(NULL,'AAA')
                       *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("DEMO"."T3"."ID")


SQL> c/3/4
  1*  insert into T4 values(NULL,'AAA')
SQL> /

1 row created.

SQL> select * from t4;

        ID NAME
---------- --------------------
        10 TEST
         1 Chart
         2 AAA

SQL> CREATE TABLE t5  (id NUMBER  GENERATED ALWAYS AS IDENTITY , name varchar2(20));

Table created.

SQL> insert into T5 values(NULL,'AAA')
  2  /
insert into T5 values(NULL,'AAA')
*
ERROR at line 1:
ORA-32795: cannot insert into a generated always identity column


SQL> insert into T5 values(1,'AAA')
  2  /
insert into T5 values(1,'AAA')
*
ERROR at line 1:
ORA-32795: cannot insert into a generated always identity column


SQL>  insert into T5(name) values('TEST');

1 row created.

SQL> select * from T5;

        ID NAME
---------- --------------------
         1 TEST

หวังว่าจะมีประโยชน์กับเพื่อนๆ นะครับ

12c กับคอลัมน์ INVISIBLE และ set colinvisible

ฐานข้อมูลออราเคิล 12c นั้นเราสามารถเซต COLUMN ที่เราไม่ต้องการนั้น Invisible (ไม่ปรากฏหรือโชว์เมื่อเราดึงข้อมูล) แต่เรายังสามารถ INSERT/UPDATE ข้อมูลใน COLUMN (Invisible) นั้นได้ ...แถมยังเอาไปใช้สร้าง INDEX ได้อีกด้วย
SET COLINVISIBLE
ใช้ในการโชว์ข้อมูล column ที่ invisible
ตัวอย่าง
SQL> show colinvisible
colinvisible OFF
SQL>
SQL>  create table mytable(col1 number, col2 varchar2(20) invisible);

Table created.

SQL> desc mytable
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                               NUMBER

SQL> insert into mytable (col1,col2) values (1,'Surachart Opun');

1 row created.

SQL> select * from mytable;

      COL1
----------
         1

SQL>
SQL> show colinvisible
colinvisible OFF
SQL>
SQL> set colinvisible on
SQL> show colinvisible
colinvisible ON
SQL>
SQL>
SQL> desc mytable
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                               NUMBER
 COL2 (INVISIBLE)                                   VARCHAR2(20)

SQL>
SQL>  select * from mytable;
      COL1
----------
         1

SQL> select COL1, COL2 from mytable;

      COL1 COL2
---------- --------------------
         1 Surachart Opun

SQL>
SQL> set colinvisible off
SQL> desc mytable
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                               NUMBER

SQL>
SQL>
SQL> select COL1, COL2 from mytable;

      COL1 COL2
---------- --------------------
         1 Surachart Opun
จะพบว่าเราสามารถ INSERT/UPDATE หรือ SELECT ข้อมูลจาก column ที่ invisible ได้ด้วยการระบุชื่อ column

อย่างไรก็ดี COLUMN ที่เราต้องการเซตเป็น INVISIBLE ไม่ควรมี default (NOT NULL)
SQL> create table mytable(col1 number, col2 varchar2(20) not null);

Table created.

SQL> alter table mytable modify (col2 invisible);

Table altered.

SQL> desc mytable
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                               NUMBER

SQL> insert into mytable values (1);
insert into mytable values (1)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("DEMO"."mytable"."COL2")


SQL>
SQL>
SQL> desc mytable
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                               NUMBER

SQL>
SQL> show colinvisible
colinvisible OFF
SQL> set colinvisible on
SQL>
SQL> desc mytable
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                               NUMBER
 COL2 (INVISIBLE)                          NOT NULL VARCHAR2(20)

SQL>
SQL> insert into mytable values (1,'Surachart Opun');
insert into mytable values (1,'Surachart Opun')
            *
ERROR at line 1:
ORA-00913: too many values


SQL> desc mytable
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                               NUMBER
 COL2 (INVISIBLE)                          NOT NULL VARCHAR2(20)


SQL>  insert into mytable (col1,col2) values (1,'Surachart Opun');

1 row created.
จะเห็นว่าเกิด Error ดังตัวอย่าง... เราจึงควรเช็คให้ดี หรือแจ้งให้ Developer ทราบ ^______________^

วันเสาร์ที่ 10 สิงหาคม พ.ศ. 2556

เรียน row_limiting_clause บนฐานข้อมูลออราเคิล 12c

ผมได้มีโอกาสในการอ่านเกี่ยวกับ row_limiting_clause บนฐานข้อมูลออราเคิล 12c ผมคิดว่าเป็นเรื่องที่น่าสนใจ ผมเลยนำมาแชร์ต่อเพื่อนๆ ดังที่ทราบกันว่าบนฐานข้อมูล 12c เราสามารถจำกัดจำนวนแถวที่ต้องการ จากการดึงข้อมูล หรือจำกัดเป็นเปอร์เซนต์ พร้อมกันนี้เรายังสามารถข้ามแถวของข้อมูลที่ไม่ต้องการ ก่อนที่จะทำการจำกัดแถวที่ต้องการ เพื่อแสดงข้อมูลออกมา


ตัวอย่าง
SQL> show user;
USER is "SCOTT"
SQL> select empno from emp
  2  ;

     EMPNO
----------
      7369
      7499
      7521
      7566
      7654
      7698
      7782
      7788
      7839
      7844
      7876
      7900
      7902
      7934

14 rows selected.

เริ่มต้นเพื่อดูข้อมูลก่อน
SQL> select empno from emp order by empno;

     EMPNO
----------
      7369
      7499
      7521
      7566
      7654
      7698
      7782
      7788
      7839
      7844
      7876
      7900
      7902
      7934

14 rows selected.

ดึงข้อมูล 5 แถวแรก
SQL>  select empno from emp order by empno fetch first 5 rows only;

     EMPNO
----------
      7369
      7499
      7521
      7566
      7654
อยากได้ข้อมูลแถวที่ 6 - 10
SQL>  select empno from emp order by empno offset 5 rows fetch first 5 rows only;

     EMPNO
----------
      7698
      7782
      7788
      7839
      7844
ผมจำได้ว่าผมเคยเขียน "query เอาข้อมูล max อันดับที่ 3 เท่านั้น"
SQL> create table test as select * from all_objects;

Table created.

SQL> column OBJECT_NAME format a30
SQL>
SQL>
SQL>  select * from (select * from (select object_name , object_id from test order by object_id desc) where rownum <=3 order by object_id) where rownum <=1;

OBJECT_NAME                     OBJECT_ID
------------------------------ ----------
BONUS                               91952
ว้าวกว่าจะได้! ดังนั้นขอใช้ 12c row_limiting_clause ^______________^
SQL> select object_name , object_id from test order by object_id desc offset 2  rows fetch first 1 rows only;

OBJECT_NAME                     OBJECT_ID
------------------------------ ----------
BONUS                               91952
จะเห็นว่าสะดวกขึ้นมากเลย...

เซต VARCHAR2 32767 byte (limit) บนฐานข้อมูลออราเคิล12c

ดังที่เราทราบกันดีว่าบนฐานข้อมูลออราเคิลนั้นเราสามารถเซต varchar2 ได้ 4000 ไบต์ แม้แต่บนฐานข้อมูลออราเคิล 12c อย่างไรก็ดีในบางครั้ง เราอาจต้องการให้ varchar2 มากกว่า 4000 ไบต์
ฐานข้อมูลออราเคิล 12c เราสามารถควบคุมขนาดของ VARCHAR2, NVARCHAR2, และ RAW ด้วยพารามิเตอร์ MAX_STRING (เปลี่ยนค่าในพารามิเตอร์นี้ ใน Upgrade โหมด นะครับ)
Syntax MAX_STRING_SIZE = { STANDARD | EXTENDED }
การเปลี่ยนแปลงค่า MAX_STRING_SIZE สามารถเปลี่ยนจาก STANDARD => EXTENDED แต่ไม่สามารถเปลี่ยนจาก EXTENDED => STANDARD

ดังนั้นควรพิจารณาให้ดีเสียก่อน!
การเปลี่ยนค่า MAX_STRING_SIZE ทำได้โดยการ startup ฐานข้อมูลที่ "UPGRADE" โหมด จากนั้น "ALTER SYSTEM" ตามด้วยรัน "utl32k.sql"... เมื่อเรียบร้อยก็ restart ฐานข้อมูลเข้าสู่โหมดปกติ

ตัวอย่าง
SQL> show user;
USER is "DEMO"
SQL>
SQL> show parameter max_string_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_string_size                      string      STANDARD
SQL>
SQL> create table mytest (a varchar2(32767));
create table mytest (a varchar2(32767))
                                *
ERROR at line 1:
ORA-00910: specified length too long for its datatype


SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL>
SQL> startup upgrade
ORACLE instance started.

Total System Global Area 1252663296 bytes
Fixed Size                  2287864 bytes
Variable Size             452986632 bytes
Database Buffers          788529152 bytes
Redo Buffers                8859648 bytes
Database mounted.
Database opened.
SQL>
SQL>
SQL> show parameter MAX_STRING_SIZE

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_string_size                      string      STANDARD
SQL> alter system set max_string_size=EXTENDED;

System altered.

SQL>
SQL>

SQL> @?/rdbms/admin/utl32k.sql

Session altered.

DOC>#######################################################################
DOC>#######################################################################
DOC>   The following statement will cause an "ORA-01722: invalid number"
DOC>   error if the database has not been opened for UPGRADE.
DOC>
DOC>   Perform a "SHUTDOWN ABORT"  and
DOC>   restart using UPGRADE.
DOC>#######################################################################
DOC>#######################################################################
DOC>#

no rows selected

DOC>#######################################################################
DOC>#######################################################################
DOC>   The following statement will cause an "ORA-01722: invalid number"
DOC>   error if the database does not have compatible >= 12.0.0
DOC>
DOC>   Set compatible >= 12.0.0 and retry.
DOC>#######################################################################
DOC>#######################################################################
DOC>#

PL/SQL procedure successfully completed.

Session altered.
.
.
.
SQL> select INSTANCE_NAME,STATUS from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
noncdb           OPEN MIGRATE

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL>
SQL> startup
ORACLE instance started.

Total System Global Area 1252663296 bytes
Fixed Size                  2287864 bytes
Variable Size             452986632 bytes
Database Buffers          788529152 bytes
Redo Buffers                8859648 bytes
Database mounted.
Database opened.
SQL>
SQL>
SQL> select INSTANCE_NAME,STATUS from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
noncdb           OPEN

SQL>
SQL> conn demo
Enter password:
Connected.
SQL>
SQL>
SQL> show user
USER is "DEMO"
SQL>
SQL> show parameter max_string_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_string_size                      string      EXTENDED
SQL>
SQL>
SQL> create table mytest (a varchar2(32767));

Table created.

SQL> desc mytest
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  VARCHAR2(32767)
หวังว่าตัวอย่างสามารถทำให้เพื่อนๆ เข้าใจได้ง่ายขึ้นนะครับ.

อ่านเพิ่มเติมได้ที่ Oracle Documents (Oracle Database Reference 12C) นะครับ

วันพุธที่ 26 มิถุนายน พ.ศ. 2556

ออราเคิลดาต้าเบส 12 Cloud (Oracle Database 12c)

ออราเคิลดาต้าเบส 12 Cloud (Oracle Database 12c) ออราเคิลได้เปิดตัวซอฟแวร์ Oracle Database 12c อย่างเป็นทางการเราสามารถเข้าไป ดาวน์โหลดได้ที่ OTN 
เริ่มต้นออราเคิลได้ปล่อยซอฟแวร์สำหรับ Linux x86-64, Solaris Sparc64 และ Solaris (x86-64)  เราจะเห็นว่ามีฟีเจอร์หลายๆ ตัวที่น่าสนใจ ตัวอย่างเช่น Consolidating multiple databases with Oracle Multitenant หรือที่เราเคยได้ยินมาก่อนนั้นเรื่องของ Pluggable Database ฟีเจอร์นี้ทำให้เราสามารถ plug in/plug out Oracle Database ได้อย่างง่ายดาย ส่วนฟีเจอร์อื่นๆ ก็หาอ่านได้จาก OTN


อ่านเพิ่มเติมที่  

http://www.oracle.com/pls/db121/homepage 

https://blogs.oracle.com/UPGRADE

 

วันพุธที่ 22 พฤษภาคม พ.ศ. 2556

เรามาสร้างฐานข้อมูลออราเคิลด้วย DBCA กันครับ

เมื่อคุณจะสร้างฐานข้อมูลสักตัว คุณควรต้องรู้เสียก่อนว่า คุณต้องการสร้างฐานข้อมูลเพื่อใช้งานกับระบบแบบใด OLTP (Online transaction Processing) เช่น ระบบ retail billing, ระบบเว็บที่มีการตอบสนอง realtime
Data Warehouse เช่น ระบบข้อมูล research และ marketing หรือระบบที่ต้องการข้อมูลไปทำ reporting และ data analysis

จากนั้นเรายังต้องรู้เกี่ยวกับ Character Set เพราะเมื่อคุณสร้างฐานข้อมูลแล้วมันจะเป็นการยากที่จะต้องเปลี่ยน Character Set หรือบางครั้งถึงกับต้องสร้างฐานข้อมูลใหม่ ก่อนการเลือก Character Set เราก็ควรที่จะรู้เกี่ยวข้อมูลที่จะเก็บในฐานข้อมูล ว่าเป็นภาษาอะไรบ้าง หรือใช้แค่ภาษาไทยอย่างเดียว

จากนั้นเรามาทำความรู้จัก Database Configuration Assistant (DBCA) คร่าวๆ กัน
DBCA เป็นเครื่องมือที่ช่วยในการสร้างฐานข้อมูออราเคิล ช่วยในการจัดการบางอย่างกับฐานข้อมูล ลบฐานข้อมูล พร้อมกันนี้ใช้ในการจัดการ templates อีกด้วย

อ้างอิง ติดตั้งฐานข้อมูลออราเคิล (Oracle) 11gR2 บน OEL6

ต่อไปนี้คือการใช้ DBCA สร้างฐานข้อมูลคร่าวๆ (เริ่มจากคำสั่ง "dbca" บน linux)


 จากรูปข้างล่าง SID = orcl
Global Database Name = orcl.surachartopun
เมื่อสร้างฐานข้อมูลเรียบร้อย เราจะพบว่า
SQL> select name from v$database;

NAME
---------
ORCL

SQL> show parameter domain

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string      surachartopun








 กรณีนี้ต้องเลือก File System เพราะผมไม่ได้ติดตั้ง Grid Infrastructure และไม่มี ASM

พร้อมระบุ path ที่ต้องการวาง database files
ตัวอย่างหลังติดตั้งเสร็จ
[oracle@oralearning ~]$ ls /u01/app/oradata/*/*
/u01/app/oradata/orcl/control01.ctl  /u01/app/oradata/orcl/redo02.log    /u01/app/oradata/orcl/system01.dbf   /u01/app/oradata/orcl/users01.dbf
/u01/app/oradata/orcl/example01.dbf  /u01/app/oradata/orcl/redo03.log    /u01/app/oradata/orcl/temp01.dbf
/u01/app/oradata/orcl/redo01.log     /u01/app/oradata/orcl/sysaux01.dbf  /u01/app/oradata/orcl/undotbs01.dbf




หมายเหตุ รูปเกี่ยวกับ Memory ใน ฐานข้อมูลออราเคิล 11g
ในส่วนนี้ว่างๆจะอธิบายให้อ่าน เกี่ยวกับ Memory ลองพิจารญาจากรูปข้างบน


จากรูปข้างล่างเราต้องเลือก Character Set ที่เราต้องการ








เป็นอันติดตั้งเรียบร้อย
[oracle@oralearning ~]$ ps -aef |grep pmon
oracle    1634     1  0 21:13 ?        00:00:00 ora_pmon_orcl

ไหนๆ ก็ไหนๆ เรามาลองใช้ NETCA เพื่อสร้าง LISTENER (netca) กัน








[oracle@oralearning ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 22-MAY-2013 21:29:03

Copyright (c) 1991, 2009, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oralearning)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date                22-MAY-2013 21:28:56
Uptime                    0 days 0 hr. 0 min. 6 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/oralearning/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oralearning)(PORT=1521)))
Services Summary...
Service "orcl.surachartopun" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB.surachartopun" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
ตอนนี้เราก็มีฐานข้อมูลเพื่อการทดสอบ หรือใช้งานจริงกันแล้วนะครับ
ทดสอบเล็กๆ น้อยๆ

SQL> create user demo identified by demo;

User created.

SQL> grant create session to demo;

Grant succeeded.

SQL> connect demo/demo@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.200)(PORT = 1521)))(CONNECT_DATA = (SID = orcl)))
Connected.
SQL> show user
USER is "DEMO"
SQL>
SQL> connect demo/demo@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = orcl.surachartopun)))
Connected.
SQL> show user;
USER is "DEMO"
SQL>
จากตัวอย่างข้างบนเราจะเห็นว่าการติดต่อฐานข้อมูลผ่าน LISTENER ด้วย SID และ SERVICE_NAME จะต่างกันเล็กน้อย ลองทบทวนการสร้างฐานข้อมูลข้างต้น หรือ ลองดูข้างล่าง

oracle@oralearning ~]$ ps -aef |grep pmon | grep -v grep
oracle    1634     1  0 21:13 ?        00:00:00 ora_pmon_orcl

[oracle@oralearning ~]$ lsnrctl service |grep Service
Services Summary...
Service "orcl.surachartopun" has 1 instance(s).
Service "orclXDB.surachartopun" has 1 instance(s).