Az Oracle adatbáziskezelőjének legújabb verziója hamarosan érkezik. Az Oracle eközben folyamatosan publikálja a várható újdonságok egy részét. Most ezek közül mutatnánk be pár olyan SQL fejlesztést, amit mi nagyon izgalmasnak találtunk.

Update parancs közvetlen kötéssel

Tábla update során másik táblából eddig csak alselecttel tudtuk megoldani az értékek töltését. Mostantól egyetlen UPDATE paranccsal a forrás tábla megadható és az oszlopok megfeleltethetőek egymással. Kiindulásként fogjuk a jól ismert EMP, DEPT táblákat és adjuk hozzá a DEPT_NAME oszlopot, ami a department name mezőt jelenti. Ekkor az új mező feltöltése a DEPT táblából a következő módon lehetséges:

SQL> alter table emp add(dept_name varchar2(30));

Table altered.

SQL> update emp e
     set dept_name = d.dname
     from dept d
     where e.deptno = d.deptno;

14 rows updated.

SQL> select empno, ename, job, dept_name from emp where rownum < 6;

     EMPNO ENAME      JOB       DEPT_NAME
---------- ---------- --------- --------------
      7839 KING       PRESIDENT ACCOUNTING
      7698 BLAKE      MANAGER   SALES
      7782 CLARK      MANAGER   ACCOUNTING
      7566 JONES      MANAGER   RESEARCH
      7788 SCOTT      ANALYST   RESEARCH

SQL>

Delete parancs közvetlen kötéssel

Az UPDATE-hez hasonlóan a törlés is elvégezhető közvetlenül egy tábla összekapcsolásával. Feladatunk az EMP táblából azon sorok törlése, ahol az adott department DALLAS-ban található. Ezt az információt a DEPT tábla LOC mezője tartalmazza, így azt tudjuk felhasználni a szűréshez:

SQL> select * from emp;

 EMPNO ENAME      JOB        MGR HIREDATE    SAL    COMM  DEPTNO DEPT_NAME
------ ---------- --------- ---- --------- ----- ------- ------- --------------
  7839 KING       PRESIDENT      17-NOV-81  5000              10 ACCOUNTING
  7698 BLAKE      MANAGER   7839 01-MAY-81  2850              30 SALES
  7782 CLARK      MANAGER   7839 09-JUN-81  2450              10 ACCOUNTING
  7566 JONES      MANAGER   7839 02-APR-81  2975              20 RESEARCH
  7788 SCOTT      ANALYST   7566 19-APR-87  3000              20 RESEARCH
  7902 FORD       ANALYST   7566 03-DEC-81  3000              20 RESEARCH
  7369 SMITH      CLERK     7902 17-DEC-80   800              20 RESEARCH
  7499 ALLEN      SALESMAN  7698 20-FEB-81  1600     300      30 SALES
  7521 WARD       SALESMAN  7698 22-FEB-81  1250     500      30 SALES
  7654 MARTIN     SALESMAN  7698 28-SEP-81  1250    1400      30 SALES
  7844 TURNER     SALESMAN  7698 08-SEP-81  1500       0      30 SALES
  7876 ADAMS      CLERK     7788 23-MAY-87  1100              20 RESEARCH
  7900 JAMES      CLERK     7698 03-DEC-81   950              30 SALES
  7934 MILLER     CLERK     7782 23-JAN-82  1300              10 ACCOUNTING

14 rows selected.

SQL>  delete from emp e
      from dept d
      where e.deptno=d.deptno
      and d.loc='DALLAS';

5 rows deleted.

SQL> select * from emp;

 EMPNO ENAME      JOB        MGR HIREDATE    SAL   COMM  DEPTNO DEPT_NAME
------ ---------- --------- ---- --------- ----- ------ ------- --------------
  7839 KING       PRESIDENT      17-NOV-81  5000             10 ACCOUNTING
  7698 BLAKE      MANAGER   7839 01-MAY-81  2850             30 SALES
  7782 CLARK      MANAGER   7839 09-JUN-81  2450             10 ACCOUNTING
  7499 ALLEN      SALESMAN  7698 20-FEB-81  1600    300      30 SALES
  7521 WARD       SALESMAN  7698 22-FEB-81  1250    500      30 SALES
  7654 MARTIN     SALESMAN  7698 28-SEP-81  1250   1400      30 SALES
  7844 TURNER     SALESMAN  7698 08-SEP-81  1500      0      30 SALES
  7900 JAMES      CLERK     7698 03-DEC-81   950             30 SALES
  7934 MILLER     CLERK     7782 23-JAN-82  1300             10 ACCOUNTING

9 rows selected.

SQL>

IF [NOT] EXISTS szintaxis támogatás

Tábla létrehozásakor eddig probléma volt, hogy ha a tábla már létezett, akkor hibaüzenetet kaptunk. Ezért létrehozás előtt valamilyen módszerrel vizsgálni kellett a helyzetet. Most ezt kényelmesen, a kiterjesztett CREATE TABLE paranccsal megtehetjük IF EXISTS / IF NOT EXISTS záradék használatával:

SQL> create table if not exists xx1(name varchar2(200),value number);

Table created.

A szintaxis DROP TABLE esetén is működik:

SQL> drop table if exists xx1;

Table dropped.

GROUP BY oszlop másodlagos név

A GROUP BY záradék egy nagyon hasznos lehetőséggel bővült: használhatóak a SELECT részben megadott aliasok, nem kell az eredeti mező neveket használni:

SQL> select d.deptno department, count(*)
     from emp e, dept d
     where e.deptno=d.deptno
     group by department;

DEPARTMENT   COUNT(*)
---------- ----------
        10          3
        30          6
        20          5

A másodlagos név a HAVING záradékban is használható.

Multivalue INSERT utasítás

A multivalue insert egy újabb kényelmi extra az új verzióban. Több sort eddig egyesével, vagy alselecttel tudtunk beszúrni, mostanáig. A VALUES részben, vesszővel elválasztva, lehetőségünk nyílik több sor megadására:

SQL> insert into DEPT (DEPTNO, DNAME, LOC) values
     (10, 'ACCOUNTING', 'NEW YORK'),
     (20, 'RESEARCH',   'DALLAS'),
     (30, 'SALES',      'CHICAGO'),
     (40, 'OPERATIONS', 'BOSTON');

4 rows created.

Opcionális FROM záradék

A FROM záradék mostantól opcionális. Ezt más adatbáziskezelők eddig is tudták, a 23c-től felfele pedig már az Oracle is támogatja, még jobb kompatibilitást biztosítva így sql szinten az egyéb rendszerekkel. A FROM DUAL záradék elhagyható a következő kifejezés használható ezentúl:

SQL> select 1 col1, 2 col2 union
     select 1,3 union
     select 1,3 union
     select 2,1 union
     select 3,1
     ;

      COL1       COL2
---------- ----------
         1          2
         1          3
         2          1
         3          1

Az Oracle 23c adatbáziskezelő OCI (Oracle Cloud) platformon 2023 szeptemberétől elérhető. Egyéb verziói csak később jelennek meg, várhatóan 2024 első félévében. Addig is letölthető egy ún. Fejlesztői (Developer) ingyenes verzió, amivel a 23c újdonságai kipróbálhatók.