はじめに
みなさん SQLcl は使っていますか?
「身体がsqlplus xxx/xxx…を覚えていて中々抜け出せない…」という方もまだたくさんいらっしゃるんじゃないでしょうか。
便利な機能を知って使えば逆に SQL*Plus には戻れなくなると思うので、n番煎じではありますがアラカルトで紹介します。(できるだけマイナーなものに絞ったつもりです)
オブジェクトの DDL 取得
SQL*Plus でオブジェクトの DDL を取得するときにはdbms_metadata.get_ddlを使う方が多いと思います。
SQL> select dbms_metadata.get_ddl('TABLE','CUSTOMERS','SOE') from dual;
DBMS_METADATA.GET_DDL('TABLE','CUSTOMERS','SOE')
________________________________________________________________________________________________________
CREATE TABLE "SOE"."CUSTOMERS"
( "CUSTOMER_ID" NUMBER(12,0) CONSTRAINT "CUST_CUSTID_NN" NOT NULL ENABLE,
"CUST_FIRST_NAME" VARCHAR2(40) COLLATE "USING_NLS_COMP" CONSTRAINT "CUST_FNAME_NN" NOT NULL ENABLE,
"CUST_LAST_NAME" VARCHAR2(40) COLLATE "USING_NLS_COMP" CONSTRAINT "CUST_LNAME_NN" NOT NULL ENABLE,
"NLS_LANGUAGE" VARCHAR2(3) COLLATE "USING_NLS_COMP",
"NLS_TERRITORY" VARCHAR2(90) COLLATE "USING_NLS_COMP",
"CREDIT_LIMIT" NUMBER(9,2),
"CUST_EMAIL" VARCHAR2(100) COLLATE "USING_NLS_COMP",
"ACCOUNT_MGR_ID" NUMBER(12,0),
"CUSTOMER_SINCE" DATE,
"CUSTOMER_CLASS" VARCHAR2(40) COLLATE "USING_NLS_COMP",
"SUGGESTIONS" VARCHAR2(40) COLLATE "USING_NLS_COMP",
"DOB" DATE,
"MAILSHOT" VARCHAR2(1) COLLATE "USING_NLS_COMP",
"PARTNER_MAILSHOT" VARCHAR2(1) COLLATE "USING_NLS_COMP",
"PREFERRED_ADDRESS" NUMBER(12,0),
"PREFERRED_CARD" NUMBER(12,0),
CONSTRAINT "CUSTOMER_CREDIT_LIMIT_MAX" CHECK (credit_limit <= 50000) DEFERRABLE ENABLE NOVALIDATE,
CONSTRAINT "CUSTOMER_ID_MIN" CHECK (customer_id > 0) DEFERRABLE ENABLE NOVALIDATE
) DEFAULT COLLATION "USING_NLS_COMP" SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 10 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA"
CREATE UNIQUE INDEX "SOE"."CUSTOMERS_PK" ON "SOE"."CUSTOMERS" ("CUSTOMER_ID") REVERSE
PCTFREE 10 INITRANS 20 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA"
PARALLEL 2
ALTER TABLE "SOE"."CUSTOMERS" ADD CONSTRAINT "CUSTOMERS_PK" PRIMARY KEY ("CUSTOMER_ID")
USING INDEX "SOE"."CUSTOMERS_PK" ENABLE NOVALIDATE
SQL>
SQLcl では、ddl オブジェクト名で DDL を取得できるようになりました。
長ったらしいプロシージャ名を覚える必要がなくなりました。
SQL> ddl soe.customers
CREATE TABLE "SOE"."CUSTOMERS"
( "CUSTOMER_ID" NUMBER(12,0) CONSTRAINT "CUST_CUSTID_NN" NOT NULL ENABLE,
"CUST_FIRST_NAME" VARCHAR2(40) COLLATE "USING_NLS_COMP" CONSTRAINT "CUST_FNAME_NN" NOT NULL ENABLE,
"CUST_LAST_NAME" VARCHAR2(40) COLLATE "USING_NLS_COMP" CONSTRAINT "CUST_LNAME_NN" NOT NULL ENABLE,
"NLS_LANGUAGE" VARCHAR2(3) COLLATE "USING_NLS_COMP",
"NLS_TERRITORY" VARCHAR2(90) COLLATE "USING_NLS_COMP",
"CREDIT_LIMIT" NUMBER(9,2),
"CUST_EMAIL" VARCHAR2(100) COLLATE "USING_NLS_COMP",
"ACCOUNT_MGR_ID" NUMBER(12,0),
"CUSTOMER_SINCE" DATE,
"CUSTOMER_CLASS" VARCHAR2(40) COLLATE "USING_NLS_COMP",
"SUGGESTIONS" VARCHAR2(40) COLLATE "USING_NLS_COMP",
"DOB" DATE,
"MAILSHOT" VARCHAR2(1) COLLATE "USING_NLS_COMP",
"PARTNER_MAILSHOT" VARCHAR2(1) COLLATE "USING_NLS_COMP",
"PREFERRED_ADDRESS" NUMBER(12,0),
"PREFERRED_CARD" NUMBER(12,0),
CONSTRAINT "CUSTOMER_CREDIT_LIMIT_MAX" CHECK (credit_limit <= 50000) DEFERRABLE ENABLE NOVALIDATE,
CONSTRAINT "CUSTOMER_ID_MIN" CHECK (customer_id > 0) DEFERRABLE ENABLE NOVALIDATE
) DEFAULT COLLATION "USING_NLS_COMP" SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 10 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA" ;
CREATE UNIQUE INDEX "SOE"."CUSTOMERS_PK" ON "SOE"."CUSTOMERS" ("CUSTOMER_ID") REVERSE
PCTFREE 10 INITRANS 20 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA"
PARALLEL 2 ;
ALTER TABLE "SOE"."CUSTOMERS" ADD CONSTRAINT "CUSTOMERS_PK" PRIMARY KEY ("CUSTOMER_ID")
USING INDEX "SOE"."CUSTOMERS_PK" ENABLE NOVALIDATE;
CREATE INDEX "SOE"."CUST_ACCOUNT_MANAGER_IX" ON "SOE"."CUSTOMERS" ("ACCOUNT_MGR_ID")
PCTFREE 10 INITRANS 20 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA"
PARALLEL 2 ;
CREATE INDEX "SOE"."CUST_DOB_IX" ON "SOE"."CUSTOMERS" ("DOB")
PCTFREE 10 INITRANS 20 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA"
PARALLEL 2 ;
CREATE INDEX "SOE"."CUST_EMAIL_IX" ON "SOE"."CUSTOMERS" ("CUST_EMAIL")
PCTFREE 10 INITRANS 20 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA"
PARALLEL 2 ;
CREATE INDEX "SOE"."CUST_FUNC_LOWER_NAME_IX" ON "SOE"."CUSTOMERS" (LOWER("CUST_LAST_NAME"), LOWER("CUST_FIRST_NAME"))
PCTFREE 10 INITRANS 20 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA"
PARALLEL 2 ;
SQL>
CTAS文の生成
ctas 既存テーブル名 新規テーブル名で CTAS文を生成できます。
CTAS文を生成するだけで、実行はされません。
SQL> ctas warehouses wh
CREATE TABLE "SOE"."WH"
( "WAREHOUSE_ID",
"WAREHOUSE_NAME",
"LOCATION_ID"
) DEFAULT COLLATION "USING_NLS_COMP" SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 10 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA"
CREATE UNIQUE INDEX "SOE"."WAREHOUSES_PK" ON "SOE"."WH" ("WAREHOUSE_ID")
PCTFREE 10 INITRANS 20 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA"
PARALLEL 2
ALTER TABLE "SOE"."WH" ADD CONSTRAINT "WAREHOUSES_PK" PRIMARY KEY ("WAREHOUSE_ID")
USING INDEX "SOE"."WAREHOUSES_PK" ENABLE NOVALIDATE
as
select * from WAREHOUSES
SQL>
SQL> select table_name from user_tables order by 1;
TABLE_NAME
_______________________
ADDRESSES
CARD_DETAILS
CUSTOMERS
INVENTORIES
LOGON
ORDERENTRY_METADATA
ORDERS
ORDER_ITEMS
PRODUCT_DESCRIPTIONS
PRODUCT_INFORMATION
WAREHOUSES
11 rows selected.
SQL>
SQL のエイリアス作成
SQL のエイリアスを作成して実行することができます。
秘伝の SQL が書かれたテキストファイルを用意しておく必要がなくなります。
SQL> alias ashcnt = select count(1) from dba_hist_active_sess_history;
Alias ashcnt added
SQL>
SQL> ashcnt
COUNT(1)
___________
28679
SQL>
SQL> alias list
ashcnt
SQL>
SQL> alias drop ashcnt
Alias ashcnt dropped
SQL> alias list
ALIAS-026: No user defined aliases found
SQL>
SELECT結果の出力フォーマットの変更
set sqlformat フォーマット名で SELECT結果の出力フォーマットを変更可能です。
csv や json を指定可能です。
SQL> sho sqlformat
SQL Format : ansiconsole
SQL>
SQL>
SQL> select * from soe.warehouses fetch first 5 rows only;
WAREHOUSE_ID WAREHOUSE_NAME LOCATION_ID
_______________ _______________________________ ______________
1 80lweAGBlE6T6W7NLJrVwgvPmkpt 2375
2 asx12Iu 3556
3 mnLSG4FwFPyBodgN 9055
4 i1P1lQT 7084
5 95fW8 3112
SQL>
SQL> set sqlformat csv
SQL> select * from soe.warehouses fetch first 5 rows only;
"WAREHOUSE_ID","WAREHOUSE_NAME","LOCATION_ID"
1,"80lweAGBlE6T6W7NLJrVwgvPmkpt",2375
2,"asx12Iu",3556
3,"mnLSG4FwFPyBodgN",9055
4,"i1P1lQT",7084
5,"95fW8",3112
SQL>
SQL> set sqlformat json
SQL> select * from soe.warehouses fetch first 5 rows only;
{"results":[{"columns":[{"name":"WAREHOUSE_ID","type":"NUMBER"},{"name":"WAREHOUSE_NAME","type":"VARCHAR2"},{"name":"LOCATION_ID","type":"NUMBER"}],"items":
[
{"warehouse_id":1,"warehouse_name":"80lweAGBlE6T6W7NLJrVwgvPmkpt","location_id":2375}
,{"warehouse_id":2,"warehouse_name":"asx12Iu","location_id":3556}
,{"warehouse_id":3,"warehouse_name":"mnLSG4FwFPyBodgN","location_id":9055}
,{"warehouse_id":4,"warehouse_name":"i1P1lQT","location_id":7084}
,{"warehouse_id":5,"warehouse_name":"95fW8","location_id":3112}
]}]}
SQL>
SQL>
SQL> set sqlformat html
SQL>
SQL> select * from soe.warehouses fetch first 5 rows only;
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Result Data</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
* {
margin: 0;
padding: 0;
}
body {
font: 14px/1.4 Palatino, Serif;
}
/*
Generic Styling, for Desktops/Laptops
*/
table {
width: 100%;
border-collapse: collapse;
}
/* Zebra striping */
tr:nth-of-type(odd) {
background: #eee;
}
th {
background: #333;
color: white;
font-weight: bold;
}
td, th {
padding: 6px;
border: 1px solid #9B9B9B;
text-align: left;
}
@media
only screen and (max-width: 760px),
(min-device-width: 768px) and (max-device-width: 1024px) {
table, thead, tbody, th, td, tr { display: block; }
thead tr { position: absolute;top: -9999px;left: -9999px;}
tr { border: 1px solid #9B9B9B; }
td { border: none;border-bottom: 1px solid #9B9B9B; position: relative;padding-left: 50%; }
td:before { position: absolute;top: 6px;left: 6px;width: 45%; padding-right: 10px; white-space: nowrap;}
/*
Label the data
*/
td:nth-of-type(1):before { content: "WAREHOUSE_ID"; }
td:nth-of-type(2):before { content: "WAREHOUSE_NAME"; }
td:nth-of-type(3):before { content: "LOCATION_ID"; }
}
/* Smartphones (portrait and landscape) ----------- */
@media only screen
and (min-device-width : 320px)
and (max-device-width : 480px) {
body {
padding: 0;
margin: 0;
width: 320px; }
}
/* iPads (portrait and landscape) ----------- */
@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
body {
width: 495px;
}
}
</style>
<!--<![endif]-->
<script type="text/javascript">
function search(){
var s = document.getElementById('search').value;
rows = document.getElementById('data').getElementsByTagName('TR');
for(var i=0;i<rows.length;i++){
if ( rows[i].textContent.indexOf(s)>0 || s.length==0 ) {
rows[i].style.display ='';
} else {
rows[i].style.display ='none';
}
}
}
var timer;
function delayedSearch() {
clearTimeout(timer);
console.log('delay-ing')
timer = setTimeout(function () {
console.log('delay-running')
search();
}, 500);
}</script>
</head>
<body>
<div><input type="text" size="30" maxlength="1000" value="" id="search" onkeyup="delayedSearch();" /><input type="button" value="Go" onclick="lsearch();"/> </div>
<table><thead><tr> <th>WAREHOUSE_ID</th>
<th>WAREHOUSE_NAME</th>
<th>LOCATION_ID</th>
</tr></thead>
<tbody id="data">
<tr>
<td align="right">920</td>
<td>f0B9u40FctuuhoXz0sBOxc5BoxuEvVy</td>
<td align="right">783</td>
</tr>
<tr>
<td align="right">921</td>
<td>lBQ86IKvPOa8ccgUoEsrcackRKsVi1M27</td>
<td align="right">6289</td>
</tr>
<tr>
<td align="right">922</td>
<td>vF6txK</td>
<td align="right">1556</td>
</tr>
<tr>
<td align="right">923</td>
<td>LnDN7YIPtUfWGPrpc6Q</td>
<td align="right">3842</td>
</tr>
<tr>
<td align="right">924</td>
<td>h6eC</td>
<td align="right">8251</td>
</tr>
</tbody></table><!-- SQL:
select * from soe.warehouses fetch first 5 rows only--></body></html>
SQL>
SQL>
簡易的なデータロード
loadを使うことで簡易的なデータロードが可能です。
SQL> !ls -la *csv
-rw-r--r--. 1 opc opc 322 Oct 15 05:23 sales_channels.csv
SQL> !cat sales_channels.csv
"CHANNEL_ID","CHANNEL_DESC","CHANNEL_CLASS","CHANNEL_CLASS_ID","CHANNEL_TOTAL","CHANNEL_TOTAL_ID"
3,"Direct Sales","Direct",12,"Channel total",1
9,"Tele Sales","Direct",12,"Channel total",1
5,"Catalog","Indirect",13,"Channel total",1
4,"Internet","Indirect",13,"Channel total",1
2,"Partners","Others",14,"Channel total",1
SQL>
SQL>
SQL> create table testtab(CHANNEL_ID number, CHANNEL_DESC varchar2(20), CHANNEL_CLASS varchar2(20), CHANNEL_CLASS_ID number, CHANNEL_TOTAL varchar2(20),CHANNEL_TOTAL_ID number);
Table TESTTAB created.
SQL> load testtab sales_channels.csv
csv
column_names on
delimiter ,
enclosures ""
double
encoding UTF8
row_limit off
row_terminator default
skip_rows 0
skip_after_names
Load data into table ADMIN.TESTTAB
#INFO Number of rows processed: 5
#INFO Number of rows in error: 0
#INFO Last row processed in final committed batch: 5
SUCCESS: Processed without errors
SQL>
SQL>
SQL> select * from testtab;
CHANNEL_ID CHANNEL_DESC CHANNEL_CLASS CHANNEL_CLASS_ID CHANNEL_TOTAL CHANNEL_TOTAL_ID
_____________ _______________ ________________ ___________________ ________________ ___________________
3 Direct Sales Direct 12 Channel total 1
9 Tele Sales Direct 12 Channel total 1
5 Catalog Indirect 13 Channel total 1
4 Internet Indirect 13 Channel total 1
2 Partners Others 14 Channel total 1
SQL>
SQL を指定回数・指定間隔で繰り返し実行
repeat 回数 間隔(秒)で、直後に実行した SQL を繰り返し実行することが可能です。
監視が必要になった時などに重宝します。
SQL> select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.36.33.907154000 AM GMT
SQL> repeat 10 1
Running 1 of 10 @ 06:36:57.013 with a delay of 1s
1* select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.36.57.027012000 AM GMT
Running 2 of 10 @ 06:36:58.037 with a delay of 1s
1* select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.36.58.050173000 AM GMT
Running 3 of 10 @ 06:36:59.057 with a delay of 1s
1* select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.36.59.063320000 AM GMT
Running 4 of 10 @ 06:37:00.070 with a delay of 1s
1* select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.37.00.078294000 AM GMT
Running 5 of 10 @ 06:37:01.083 with a delay of 1s
1* select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.37.01.090794000 AM GMT
Running 6 of 10 @ 06:37:02.101 with a delay of 1s
1* select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.37.02.109918000 AM GMT
Running 7 of 10 @ 06:37:03.118 with a delay of 1s
1* select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.37.03.124997000 AM GMT
Running 8 of 10 @ 06:37:04.132 with a delay of 1s
1* select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.37.04.141545000 AM GMT
Running 9 of 10 @ 06:37:05.149 with a delay of 1s
1* select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.37.05.154024000 AM GMT
Running 10 of 10 @ 06:37:06.158 with a delay of 1s
1* select systimestamp from dual;
SYSTIMESTAMP
______________________________________
15-OCT-26 06.37.06.164075000 AM GMT
SQL>
SQL>
SQLcl の便利機能を使いこなして、SQL*Plus を卒業しましょう!
1.1 SQLclコマンド(アルファベット順)
