<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle &#8211; エンジニア見習い</title>
	<atom:link href="https://otonan-syusyoku.work/archives/category/learning/orcl/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Sun, 28 May 2023 03:25:14 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>Oracle &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>シーケンスがあまり好きになれない</title>
		<link>https://otonan-syusyoku.work/archives/1009</link>
					<comments>https://otonan-syusyoku.work/archives/1009#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sat, 22 Jan 2022 03:16:16 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1009</guid>

					<description><![CDATA[Contents シーケンスとはシーケンスのコードCREATE文取得文使用例複数セッションでのシーケンスの扱いシーケンスとは シーケンスとは連番を作り出す為にOracleが用意してくれているオブジェクトです。 1,2,3 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="1009" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">シーケンスとは</a></li><li class="rtoc-item"><a href="#rtoc-2">シーケンスのコード</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-3">CREATE文</a></li><li class="rtoc-item"><a href="#rtoc-4">取得文</a></li><li class="rtoc-item"><a href="#rtoc-5">使用例</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-6">複数セッションでのシーケンスの扱い</a></li></ol></div><h2 id="rtoc-1" >シーケンスとは</h2>
<p>シーケンスとは連番を作り出す為にOracleが用意してくれているオブジェクトです。</p>
<p>1,2,3,4,5…と連続したデータを発動するので、プライマリーキーやユニークキーなどによく使用されます。</p>
<p>MySQLで言うところのAutoIncrementと似たような機能となっています。</p>
<h2 id="rtoc-2" >シーケンスのコード</h2>
<h3 id="rtoc-3" >CREATE文</h3>
<pre class="line-numbers"><code class="language-other">CREATE SEQUENCE seqTest
  START WITH 1
  INCREMENT BY 1
  MAXVALUE 1000
  NOCYCLE;</code></pre>
<h3 id="rtoc-4" >取得文</h3>
<pre class="line-numbers"><code class="language-other">--連番発行
SQL&gt; select seqTest.nextval from dual;

   NEXTVAL
----------
	 1

--現在の番号取得
SQL&gt; select seqTest.currval from dual;

   CURRVAL
----------
	 1</code></pre>
<p>&nbsp;</p>
<h3 id="rtoc-5" >使用例</h3>
<pre class="line-numbers"><code class="language-markup">SQL&gt; desc TBLSEQ;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NO                                        NOT NULL NUMBER(3)
 NAME                                               VARCHAR2(10)

--==================
--test0テーブルの値を使用
--==================
SQL&gt; INSERT INTO TBLseq
select seqTest.nextval
           ,concat(TO_CHAR(no) , concat(name,TO_CHAR(no2)))
from test0;

20 rows created.


SQL&gt; select * from tblseq;

        NO NAME
---------- ----------
         1 0a0
         2 0b1
         3 0a2
         4 0b3
         5 1a0
         6 1b2
         7 1a3
         8 1b4
         9 2a0
        10 2b1
        11 2a2

        NO NAME
---------- ----------
        12 2b3
        13 7a0
        14 7b1
        15 7a2
        16 7b3
        17 9a0
        18 9b1
        19 9a2
        20 9b3

20 rows selected.
</code></pre>
<h2 id="rtoc-6" >複数セッションでのシーケンスの扱い</h2>
<p>先程の使用例で20までの連番を出力したシーケンスを別のセッションから参照すると、続きの連番から出力されます。</p>
<pre class="line-numbers"><code class="language-other">--別セッションに接続
SQL&gt;sqlplus〜〜〜

--シーケンスの発行
SQL&gt; select seqtest.nextval from dual;

   NEXTVAL
----------
        21</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1009/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Oracleの権限付与でハマった話(PDBとCDB)</title>
		<link>https://otonan-syusyoku.work/archives/1015</link>
					<comments>https://otonan-syusyoku.work/archives/1015#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sat, 22 Jan 2022 02:21:14 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1015</guid>

					<description><![CDATA[Contents 問題権限付与が出来なかった原因解決法問題 ローカルユーザーに権限付与を実行すると「ユーザーがいません」というエラーが出力されます。 SYSTEMユーザーでログインしているので権限付与が出来ない訳が無いの [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="1015" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">問題</a></li><li class="rtoc-item"><a href="#rtoc-2">権限付与が出来なかった原因</a></li><li class="rtoc-item"><a href="#rtoc-3">解決法</a></li></ol></div><h2 id="rtoc-1" >問題</h2>
<p>ローカルユーザーに権限付与を実行すると「ユーザーがいません」というエラーが出力されます。</p>
<p>SYSTEMユーザーでログインしているので権限付与が出来ない訳が無いのですが、思いもよらないところに落とし穴がありました。</p>
<pre class="line-numbers"><code class="language-markup">SQL&gt; GRANT CREATE SEQUENCE TO usr1;
GRANT CREATE SEQUENCE TO usr1
                         *
ERROR at line 1:
ORA-01917: user or role 'USR1' does not exist</code></pre>
<h2 id="rtoc-2" >権限付与が出来なかった原因</h2>
<p>権限付与が出来なかった原因は、PDBとCDBというOracle独自のマルチテナント構造が原因でした。</p>
<p>CDBが基盤となるDBとなり、その上にPDBと呼ばれるDBが存在するという奇妙な構造となっています。(Dockerのようにコンテナの上にイメージを作成するような感じです)</p>
<p><img fetchpriority="high" decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2022/01/PDB-300x180.png" alt="マルチテナント構造" width="300" height="180" class="aligncenter size-medium wp-image-1016" srcset="https://otonan-syusyoku.work/wp-content/uploads/2022/01/PDB-300x180.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2022/01/PDB.png 500w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>今回、SYSTEMユーザーはCDBに接続しており、権限付与されるUSR1ユーザーはPDBに接続していました。</p>
<p>CDB上にいるSYSTEMユーザーからPDB上にいるUSR1ユーザーに権限が付与は出来ないため、SYSTEMユーザーをPDBに接続する必要があります。</p>
<p>SYSTEMユーザーの接続先をPDBに切り替えることで権限付与の実行が可能になりました！</p>
<h2 id="rtoc-3" >解決法</h2>
<p>以下手順で解決できます。</p>
<p>①権限付与側のユーザーの接続先の確認</p>
<pre class="line-numbers"><code class="language-other">--SYSTEMユーザーの接続先確認
SQL&gt; show con_name 

CON_NAME
------------------------------
CDB$ROOT</code></pre>
<p>&nbsp;</p>
<p>②権限付与される側のユーザーの接続先の確認</p>
<pre class="line-numbers"><code class="language-other">--USR1の接続先確認
SQL&gt; show con_name   

CON_NAME
------------------------------
ORCLPDB1</code></pre>
<p>&nbsp;</p>
<p>③権限付与側のユーザーの接続先DB切り替え</p>
<pre class="line-numbers"><code class="language-other">--USR1が接続しているDBに切り替え
SQL&gt; alter session set container = orclPDB1;

Session altered.

</code></pre>
<p>&nbsp;</p>
<p>④GRANT文の発行</p>
<pre class="line-numbers"><code class="language-other">--SYSTEMユーザー権限付与
SQL&gt; GRANT CREATE SEQUENCE TO usr1;

Grant succeeded.

SQL&gt; commit;

Commit complete.

</code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1015/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Silver SQL試験対策】ビューについて</title>
		<link>https://otonan-syusyoku.work/archives/984</link>
					<comments>https://otonan-syusyoku.work/archives/984#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sun, 28 Nov 2021 08:22:05 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=984</guid>

					<description><![CDATA[Contents ビューについて作成構文使用方法SELECT文の共通化値を隠すマテリアライズドビュービューについて ビューとはSELECT文を格納しておく変数のようなものです。 プログラムを学んだ方ならしっくり来ると思う [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="984" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">ビューについて</a></li><li class="rtoc-item"><a href="#rtoc-2">作成構文</a></li><li class="rtoc-item"><a href="#rtoc-3">使用方法</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-4">SELECT文の共通化</a></li><li class="rtoc-item"><a href="#rtoc-5">値を隠す</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-6">マテリアライズドビュー</a></li></ol></div><h2 id="rtoc-1" >ビューについて</h2>
<p>ビューとは<span class="sc_marker blue"><strong>SELECT文を格納しておく変数</strong></span>のようなものです。</p>
<p>プログラムを学んだ方ならしっくり来ると思うのですが、変数に格納しておくことで共通化をすることでいろいろな場面で簡単に呼び出すことができます。</p>
<h2 id="rtoc-2" >作成構文</h2>
<pre class="line-numbers"><code class="language-other">SQL&gt; select * from test;

	NO NAME
---------- --------------------------------------------------
	 1 aaaaa
	 2 ooooo
	 3 oooaa
	 2 ooooo
	 3 oooaa

SQL&gt; create or replace view test_view as
  2  select * from test;

View created.

SQL&gt; select * from test_view;

	NO NAME
---------- --------------------------------------------------
	 1 aaaaa
	 2 ooooo
	 3 oooaa
	 2 ooooo
	 3 oooaa</code></pre>
<h2 id="rtoc-3" >使用方法</h2>
<h3 id="rtoc-4" >SELECT文の共通化</h3>
<p>ビューを作成することで、SELECT文の共通化を図ることができます。</p>
<p>システムの中で値を得る際にSELECT文を記述して値を取得するよりもSELECT文を格納したビューを呼び出すほうが効率が良く、記述ミスを防ぐことができます。</p>
<p>プログラムにおける変数と同等の扱いが可能ですね！</p>
<h3 id="rtoc-5" >値を隠す</h3>
<p>これは権限でもできる話なのですが、見られたくないデータを隠す際にもビューを使用することがあります。</p>
<p>例えば｛社員名、年齢、性別、給与、持病｝をもったテーブルがあると考えてください。</p>
<p>社員名や年齢、性別はデータを見られても問題ないのですが、給与や持病などのプライベートなデータは案件によっては隠したい場合があると思います。</p>
<p>そんなときに一般社員が業務に使用するデータとして｛社員名、年齢、性別｝をAビューに格納し、｛社員名、年齢、性別、給与、持病｝を格納したビューを管理者用にといった使い分けの方法があります。</p>
<h2 id="rtoc-6" >マテリアライズドビュー</h2>
<p>ビューには通常のビューとマテリアライズドビューの2種類のビューが存在します。</p>
<table style="border-collapse: collapse; width: 100%;">
<tbody>
<tr>
<td style="width: 24.5536%;">ビュー</td>
<td style="width: 75.4464%;">ビュー作成時のデータしか取得できない。</td>
</tr>
<tr>
<td style="width: 24.5536%;">マテリアライズドビュー</td>
<td style="width: 75.4464%;">ビュー作成後も作成に使用したテーブルに更新があれば更新したテーブルの値を取得できる。</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>マテリアライズドビューはビューとテーブルが同期している状態をイメージしてほしいです。</p>
<p>同期していることによってビュー作成時に使用したテーブルに更新がかかればマテビューも同時に更新処理が行われます。</p>
<p>下記の場合では、テーブルにTRUNCATEを実行するとそのテーブルを参照して作成したマテビューも同時に更新されます。(マテビューの更新は自動の場合と手動の場合をCREATE時に指定することができます。)</p>
<pre class="line-numbers"><code class="language-other">SQL&gt; create materialized view test_mat as
  2  select * from test;

Materialized view created.

SQL&gt; select * from test_mat;

	NO NAME
---------- --------------------------------------------------
	 1 aaaaa
	 2 ooooo
	 3 oooaa
	 2 ooooo
	 3 oooaa

SQL&gt; truncate table test;

Table truncated.

SQL&gt; select * from test_mat;

no rows selected</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/984/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Silver SQL試験対策】日付型が一番難しい</title>
		<link>https://otonan-syusyoku.work/archives/979</link>
					<comments>https://otonan-syusyoku.work/archives/979#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sun, 28 Nov 2021 04:39:57 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=979</guid>

					<description><![CDATA[Contents 日付型の種類タイムゾーンについて表示について日付型の種類 Oracleの日付型は以下6種類(期間データ型も含む)です。 DATE SYSDATE TIMESTAMP SYSTIMESTAMP TIMES [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="979" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">日付型の種類</a></li><li class="rtoc-item"><a href="#rtoc-2">タイムゾーンについて</a></li><li class="rtoc-item"><a href="#rtoc-3">表示について</a></li></ol></div><h2 id="rtoc-1" >日付型の種類</h2>
<p>Oracleの日付型は以下6種類(期間データ型も含む)です。</p>
<table style="border-collapse: collapse; width: 100%; height: 196px;">
<tbody>
<tr style="height: 49px;">
<td style="width: 37.1652%; height: 49px;">DATE</td>
<td style="width: 62.8348%; height: 49px;">SYSDATE</td>
</tr>
<tr style="height: 49px;">
<td style="width: 37.1652%; height: 49px;">TIMESTAMP</td>
<td style="width: 62.8348%; height: 49px;">SYSTIMESTAMP</td>
</tr>
<tr style="height: 49px;">
<td style="width: 37.1652%; height: 49px;">TIMESTAMP WITH TIME ZONE</td>
<td style="width: 62.8348%; height: 49px;">CURRENT_TIMESTAMP</td>
</tr>
<tr style="height: 49px;">
<td style="width: 37.1652%; height: 49px;">TIMESTAMP WITH LOCAL TIMEZONE</td>
<td style="width: 62.8348%; height: 49px;">LOCALTIMEStAMP</td>
</tr>
</tbody>
</table>
<table style="border-collapse: collapse; width: 100%;">
<tbody>
<tr>
<td style="width: 37.2768%;"> INTERVAL YEAR TO MONTH</td>
<td style="width: 62.7232%;">SYSDATE + INTERVAL &#8216;1-1&#8217; YEAR TO MONTH</td>
</tr>
<tr>
<td style="width: 37.2768%;">INTERVAL DAY TO SECOND</td>
<td style="width: 62.7232%;">SYSTIMESTAMP + INTERVAL &#8216;5 01:00:00&#8217; DAY TO SECOND</td>
</tr>
</tbody>
</table>
<p>DATE型とTIMESTAMP型の違い：<span class="sc_marker blue"><strong>ミリ秒単位を含むのがTIMESTAMP</strong>(</span>厳格なシステム以外は基本的に日付型はDATE型使うって言ってた。先輩が。)</p>
<p>&nbsp;</p>
<p>TIMESTAMP WITH TIME ZONE型とTIMESTAMP WITH TIME ZONE型の違い:</p>
<p>どちらもタイムゾーンの情報を格納するのですが、<span class="sc_marker blue"><strong>TIMESTAMP WITH TIME ZONE型がDBのタイムゾーンに変換されてデータが保存されます。</strong></span>例えばDBのタイムゾーンが「ASIA/TOKYO」の場合、ASIA/TOKYOのタイムゾーンに変換されて保存されます。</p>
<p>また、TIMESTAMP WITH TIME ZONE型を取得する時だけタイムゾーン名称が表示されます。「日付 時間 タイムゾーン名称」</p>
<p>&nbsp;</p>
<p>INTERVALの違い：どちらも時刻の差分を管理するデータ型。<span class="sc_marker blue"><strong>年月がINTERVAL YEAR TO MONTH</strong>。<strong>日と秒を管理するのがINTERVAL DAY TO SECOND。</strong></span></p>
<h2 id="rtoc-2" >タイムゾーンについて</h2>
<p>Oracleは世界的に使用されるRDBMSのため各地域に合わせた時刻を表示することができます。(素人目線での説明です。)</p>
<ol>
<li><strong>CURRENT_DATE</strong>(セッションのタイムゾーン)</li>
<li><strong>CURRENT_TIMESTAMP</strong>(セッションのタイムゾーン)</li>
<li><strong>SYSDATE</strong>(データベースのタイムゾーン)</li>
<li><strong>SYSTIMESTAMP</strong>(データベースのタイムゾーン)</li>
<li><strong>LOCALTIMESTAMP</strong>(セッションのタイムゾーン)</li>
</ol>
<pre class="line-numbers"><code class="language-other">SQL&gt;select systimestamp from dual;

SYSTIMESTAMP                   
-------------------------------
21-11-28 03:41:28.349648000 GMT

SQL&gt;alter session set time_zone='Asia/Tokyo';

SQL&gt;select current_timestamp from dual;
CURRENT_TIMESTAMP                     
--------------------------------------
21-11-28 12:41:28.360894000 ASIA/TOKYO</code></pre>
<div class="sc_frame_wrap inline orange">
<div class="sc_frame_title">補足</div>
<div class="sc_frame ">
<div class="sc_frame_text">下記構文で世界標準時刻との差が求めれます。自分のタイムゾーンが知りたいときなどにご使用を。</div>
<div>SELECT DBTIMEZONE FROM dual;</div>
</div>
</div>
<h2 id="rtoc-3" >表示について</h2>
<p>日付型には数値型や文字列型のように文字列を指定することができないのが特徴のひとつなのですが、システムによっては「年月のみ」「月と日のみ」といった表示をしたい時があると思います。</p>
<p>そんな時は<strong>NLS_DATE_FORMAT</strong>という書式設定を変更することで表示形式を変えることができます。</p>
<pre class="line-numbers"><code class="language-other">SQL&gt; select sysdate from dual;

SYSDATE
---------
27-NOV-21

SQL&gt; alter session set NLS_DATE_FORMAT='YYYY/MM/DD';

Session altered.

SQL&gt; select sysdate from dual;

SYSDATE
----------
2021/11/27</code></pre>
<p>NLS_DATE_FORMATで設定の変更を行うことで書式が変更されるのですが、<span class="sc_marker blue"><strong>日付型の書式は以下の設定にも影響を受けます。</strong></span></p>
<ul>
<li>NLS_DATE_LANGUAGE</li>
<li>NLS_TERRITORY</li>
</ul>
<p>NLS_DATE_LANGUAGEがAMERICANに設定されている場合、下記のようになります。</p>
<pre class="line-numbers"><code class="language-other">SQL&gt; alter session set NLS_DATE_FORMAT='yyyy-mm-dd-day';

Session altered.

SQL&gt; select sysdate from dual;

SYSDATE
--------------------
2021-11-28-sunday</code></pre>
<p>NLS_DATE_LANGUAGをJapaneseに変更すると下記のようになります。</p>
<pre class="line-numbers"><code class="language-other">SQL&gt;alter session set NLS_DATE_LANGUAGE='Japanese';

SYSDATE       
--------------
2021-11-28-日曜日</code></pre>
<p>&nbsp;</p>
<p>下記サイトが超わかりやすい解説をしてるので目を通してみてください。</p>
<p><a href="https://dev.classmethod.jp/articles/rds-for-oracle-nls-param/">知らないとチョットつまづく RDS for Oracle の NLS パラメータ</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/979/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Silver SQL試験対策】一時表の使い道や作成方法のまとめ</title>
		<link>https://otonan-syusyoku.work/archives/968</link>
					<comments>https://otonan-syusyoku.work/archives/968#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Tue, 23 Nov 2021 05:52:49 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=968</guid>

					<description><![CDATA[Contents 一時表GROBAL一時表とPRIVATE一時表作成方法一時表 一時表とは、名前の通り「データを一時的に預かってくれる表」のことを指します。 セッションやトランザクションを終了するとデータを削除してくれる [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="968" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">一時表</a></li><li class="rtoc-item"><a href="#rtoc-2">GROBAL一時表とPRIVATE一時表</a></li><li class="rtoc-item"><a href="#rtoc-3">作成方法</a></li></ol></div><h2 id="rtoc-1" >一時表</h2>
<p>一時表とは、名前の通り<span class="sc_marker blue"><strong>「データを一時的に預かってくれる表」</strong></span>のことを指します。</p>
<p>セッションやトランザクションを終了するとデータを削除してくれるので、構文を試したいときなどに使用します。</p>
<p>自分が使用した例としては同じDB内でデータ移行を行ったときに正しいデータ移行を行えているかについて確認するときに使用しました。</p>
<pre class="line-numbers"><code class="language-other">--時表TESTテーブルからデータ移行
CREATE GROBAL TEMPORARY TABLE TEST AS SELECT * FROM HOGE;
CREATE GROBAL TEMPORARY TABLE FUGA AS SELECT * FROM HOGE WHERE 1=2;

--データ移行
INSERT INTO FUGA
SELECT * FROM HOGE;</code></pre>
<h2 id="rtoc-2" >GROBAL一時表とPRIVATE一時表</h2>
<p>どちらも一時表であることに変わりはないのですが、下記の違いがあります。</p>
<table style="border-collapse: collapse; width: 100%;">
<tbody>
<tr>
<td style="width: 19.8661%;">共通部分</td>
<td style="width: 80.1339%;">・セッション、トランザクション終了時にデータが削除<br />
・自分のセッション以外からは一時表を参照できない<br />
・セッションごとに一時表は独立</td>
</tr>
<tr>
<td style="width: 19.8661%;">GROBAL</td>
<td style="width: 80.1339%;">・セッション、トランザクション終了後も<span class="sc_marker blue"><strong>テーブルの定義が残る。</strong></span>(データディクショナリに保存されるため)<br />
・テーブル定義はデータベース内に残る。(いつでも再利用可能)<br />
・テーブル定義はDROP TABLEで削除。(通常のテーブル削除と一緒)</td>
</tr>
<tr>
<td style="width: 19.8661%;">PRIVATE</td>
<td style="width: 80.1339%;">・セッション、トランザクション終了時に<span class="sc_marker blue"><strong>データと共にテーブル定義も削除。</strong></span><br />
・定義情報も削除されるので、隠れて色々なことが試せる。<br />
・<strong><span class="sc_marker blue">テーブル作成時には「ORA$PTT_」</span></strong>を付ける。(設定で切替可能)</td>
</tr>
</tbody>
</table>
<h2 id="rtoc-3" >作成方法</h2>
<pre class="line-numbers"><code class="language-other">--GROBAL一時表
CREATE GROBAL TABLE AAA(
型情報
)
オプション情報

--*オプション*
--セッション終了時に自動削除
ON COMMIT PRESERVE ROWS

--トランザクション終了時に自動削除
ON COMMIT DELETE ROWS</code></pre>
<pre class="line-numbers"><code class="language-other">--PRIVATE一時表
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_BBB(
型情報
)
オプション情報

--*オプション*
--セッション終了時に自動削除
ON COMMIT PRESERVE DEFINITION
--トランザクション終了時に自動削除
ON COMMIT DROP DEFINITION;
</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/968/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Silver SQL試験対策】Oracleの権限についてまとめてみたよ</title>
		<link>https://otonan-syusyoku.work/archives/955</link>
					<comments>https://otonan-syusyoku.work/archives/955#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sat, 20 Nov 2021 15:43:14 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=955</guid>

					<description><![CDATA[Contents 権限の目的権限の構文権限の種類システム権限オブジェクト権限ロール権限の目的 権限という概念がある目的は、ユーザーごとにできることを分けることでデータベースを安全に運用するためです。 &#160; 例えば [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="955" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">権限の目的</a></li><li class="rtoc-item"><a href="#rtoc-2">権限の構文</a></li><li class="rtoc-item"><a href="#rtoc-3">権限の種類</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-4">システム権限</a></li><li class="rtoc-item"><a href="#rtoc-5">オブジェクト権限</a></li></ul></li><li class="rtoc-item"><a href="#rtoc-6">ロール</a></li></ol></div><h2 id="rtoc-1" >権限の目的</h2>
<p>権限という概念がある目的は、<span class="sc_marker blue"><strong>ユーザーごとにできることを分けることでデータベースを安全に運用するため</strong></span>です。</p>
<p>&nbsp;</p>
<p>例えば、会社を想像してほしいのですが、社長と新卒の社員を想像してみてください。</p>
<p>社長が会社の最終決定権を持っているの対して、新卒の社員は雑用の仕事を任されるはずです。</p>
<p>雑用ですら手一杯の新卒の社員に会社の最終決定権を持たしてしまうと恐ろしいことが起きてしまうことは簡単に予想できます。</p>
<p>データベースも同じでデータ削除をして良い人、スキーマを作成していい人などの様に権限を切り分けることで安全に運用できます。</p>
<p>&nbsp;</p>
<p>また、別の切り口で考えると<span class="sc_marker blue"><strong>システム運用のために権限を振り分ける</strong></span>という理由もあります。</p>
<p>会社内で部署が存在するように、</p>
<p>Aユーザーはa業務関連のテーブルを操作でき、Bユーザーはb業務とc業務関連のテーブルを操作できる様にするために権限を振り分ける事もできます。</p>
<p>営業部が採用権限がないようなイメージですね！</p>
<p>&nbsp;</p>
<p>話がゴチャゴチャしてしまいましたが、権限はとにかく必要という事です！！</p>
<h2 id="rtoc-2" >権限の構文</h2>
<pre class="line-numbers"><code class="language-other">--権限の付与にはGRANT構文。
GRANT SELECT,INSERT,UPDATE ON usr1.TEST TO usr2;

--権限の剥奪にはREVOKE構文。
REVOKE SELECT,INSERT,UPDATE ON usr1.TEST from usr2;</code></pre>
<h2 id="rtoc-3" >権限の種類</h2>
<h3 id="rtoc-4" >システム権限</h3>
<p>システム権限とはデータベースに対する命令を行うための権限のことを指します。</p>
<p>言葉を柔らかくして説明すると<span class="sc_marker blue"><strong>Oracle様にお願いを聞いてもらうための装備</strong></span>のような感覚です。</p>
<p>例えば、社員証がないと会社に入れない様に命令ごとのシステム権限がないとOracle様が動いてくれずDBに対して何も実行することができません。(難しく感じた方ごめんなさい)</p>
<p>&nbsp;</p>
<p>システム権限の種類は数多くあるので、自分が勉強した時にイメージしやすかったものだけ紹介します。</p>
<table style="border-collapse: collapse; width: 100%; height: 206px;">
<tbody>
<tr style="height: 10px;">
<td style="width: 33.5938%; height: 10px;">ユーザーの作成</td>
<td style="width: 66.4062%; height: 10px;">CREATE　USER</td>
</tr>
<tr style="height: 49px;">
<td style="width: 33.5938%; height: 49px;">データベースへの接続</td>
<td style="width: 66.4062%; height: 49px;">CREATE　SESSION</td>
</tr>
<tr style="height: 49px;">
<td style="width: 33.5938%; height: 49px;">表の作成</td>
<td style="width: 66.4062%; height: 49px;">CREATE　TABLE</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>僕は初めてOracleでユーザーを作成した際にSESSION権限を付与するのを忘れてしまい、DB接続ができず3日ほど立ち往生した経験があります。最低限付与しなければいけない権限などもあるので一度は目を通したほうが良いかもしれません！</p>
<p>ちなみにこのページ見やすかったのでシステム権限の種類について確認したい方は呼んでみてください。</p>
<p><a href="http://itref.fc2web.com/oracle/system-privilege.html">Oracleシステム権限の一覧と確認</a></p>
<h4>ADMIN OPTION</h4>
<p>他のユーザーからシステム権限を付与され、その権限を別のユーザーに付与する場合は「GRANT ADMIN」を指定する必要があります。</p>
<p>下記コードでは、「GRANT ADMIN」を指定することでusr2は別のユーザーにオブジェクト権限を付与できるようになりました。</p>
<pre class="line-numbers"><code class="language-other">--usr2は接続権限を付与され、他人に譲渡できる。
GRANT CREATE SESSION TO usr2 WITH ADMIN OPTION; </code></pre>
<h3 id="rtoc-5" >オブジェクト権限</h3>
<p>オブジェクト権限とは<span class="sc_marker blue"><strong>自分以外のオブジェクトに対して命令を実行できる様にするため</strong></span>の権限です。</p>
<p>これはイメージしやすいと思うのですが、友達の物(パソコンでも車でも何でも良いです)に対して友達の許可がないと使用するのはNGのはずです。</p>
<p>Oracleも一緒で、自分以外のユーザーが保持しているオブジェクトに対して権限がないとそのオブジェクトには何も実行することができません。</p>
<p>※ちなみに、自分が作成したオブジェクトに対しては権限はいりません。</p>
<h4>GRANT OPTION</h4>
<p>他のユーザーからオブジェクト権限を付与され、その権限を別のユーザーに付与する場合は「GRANT OPTION」を指定する必要があります。</p>
<p>下記コードでは、「GRANT OPTION」を指定することでusr2は別のユーザーにオブジェクト権限を付与できるようになりました。</p>
<p>また、「GRANT OPTION」を指定して付与された権限は大元のユーザーによって権限が削除されると連鎖的に権限が削除されます。</p>
<pre class="line-numbers"><code class="language-other">--usr2は別のユーザーに権限を付与できるようになった
GRANT SELECT,INSERT ON usr1.TEST TO usr2 WITH GRANT OPTION; 

--usr2が実行。usr3にも同じ権限付与できる。
GRANT SELECT,INSERT,UPDATE ON usr1.TEST TO usr3;  

--usr1が実行。usr2の権限が消えると共に連鎖的にusr3の権限も消える。
REVOKE SELECT,INSERT,UPDATE ON usr1.TEST FROM usr2;</code></pre>
<h2 id="rtoc-6" >ロール</h2>
<p>ロールとは権限をまとめたもので、プログラミングでいうところの配列のような扱いです。</p>
<p>配列のように扱えることで<span class="sc_marker blue"><strong>一度定義しておけば繰り返し呼び出せる</strong></span>という利点があるため、実務ではよく使われているらしいです。（先輩が言ってた。）</p>
<p>また、ロールの凄いところはシステム権限とオブジェクト権限を同時に格納できるという点です。便利ですねー。</p>
<pre class="line-numbers"><code class="language-other">CREATE ROLE TEST_ROLL;
GRANT CREATE SESSION TO TEST_ROLL;  --システム権限付与
GRANT SELECT,INSERT ON TEST_ROLL;　　--オブジェクト権限付与
GRANT TEST_ROLL TO usr1;</code></pre>
<div class="sc_frame_wrap inline orange">
<div class="sc_frame_title">補足</div>
<div class="sc_frame ">
<div class="sc_frame_text">・ロールにロールを付与することもできる。<br />
・PUBLICロールと呼ばれる全ユーザーに適用されるロールがある。</div>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/955/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OracleのNVARCHAR2ってVARCHAR2より便利だね</title>
		<link>https://otonan-syusyoku.work/archives/889</link>
					<comments>https://otonan-syusyoku.work/archives/889#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Thu, 23 Sep 2021 00:11:13 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=889</guid>

					<description><![CDATA[Contents NVARCHAR2とはVARCHAR2をNVARCHAR2に変換するためには具体的な使い方NVARCHAR2とは NVARCHAR2とは、各国の国語文字を格納できるデータ型のことです。 「国語文字？なん [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="rtoc-mokuji-wrapper" class="rtoc-mokuji-content frame4 preset3 animation-fade rtoc_open noto-sans" data-id="889" data-theme="BlogArise">
			<div id="rtoc-mokuji-title" class=" rtoc_center">
			<button class="rtoc_open_close rtoc_open"></button>
			<span>Contents</span>
			</div><ol class="rtoc-mokuji decimal_ol level-1"><li class="rtoc-item"><a href="#rtoc-1">NVARCHAR2とは</a></li><li class="rtoc-item"><a href="#rtoc-2">VARCHAR2をNVARCHAR2に変換するためには</a><ul class="rtoc-mokuji mokuji_ul level-2"><li class="rtoc-item"><a href="#rtoc-3">具体的な使い方</a></li></ul></li></ol></div><h2 id="rtoc-1" >NVARCHAR2とは</h2>
<p>NVARCHAR2とは、各国の国語文字を格納できるデータ型のことです。</p>
<p>「国語文字？なんじゃそれ？？」と感じる方もいるかも知れませんが、国語文字とは日本なら日本語、中国なら中国語のように国固有の文字のことを指します。</p>
<p>そのため、NVARCHAR2（５）とすることで、「あいうえお」が格納できるようになります。</p>
<div class="sc_frame_wrap inline  orange">
<div class="sc_frame_title">文字コード</div>
<div class="sc_frame ">
<div class="sc_frame_text">パソコンは0と1の2つの文字を用いて情報を判別している。<br />
あ→00100110000100010</p>
<p>英語圏の人たちはアルファベットと数字や記号に対して日本は漢字、平仮名、カタカナ、数字、記号などがある。<br />
日本語は2〜3バイトで1文字を表しており、英語圏は1バイトで1文字を表している。<br />
このように文字コードは言語によって形態が違う。</p>
<p>なので文字コードの設定は大事！</p></div>
</div>
</div>
<p>&nbsp;</p>
<p>これがVARCHAR2（5）だと文字コードの設定にもよりますが、日本語だと一文字あたり2〜3Byteあたり使用されるので2文字から3文字までしか格納することができません。</p>
<p>Byteでデータを管理するよりも日本語としてデータを扱いたい場合はNVARCHAR2がおすすめですね。</p>
<div class="sc_frame_wrap inline orange">
<div class="sc_frame_title">注意！</div>
<div class="sc_frame ">
<div class="sc_frame_text">NVARCHAR2を使用したとしてDBには日本語1文字を1として扱えるのですが、容量的には2〜3Byteのデータを消費している点は注意してくださいね！</div>
</div>
</div>
<h2 id="rtoc-2" >VARCHAR2をNVARCHAR2に変換するためには</h2>
<p>型が違うと同じ文字列でも異なる値としてデータが扱われるので、同一の値として扱いたい時は型変換をしましょう。</p>
<p>OracleではVARCHAR2型やCHAR型をNVARCHAR2型やNCHAR型に変換するときには「TO_NCHAR」を使用します。</p>
<pre class="line-numbers"><code class="language-other">TO_NCHAR(変換したい値)</code></pre>
<p>変換したい値には数値も入れることが可能らしいです。</p>
<h3 id="rtoc-3" >具体的な使い方</h3>
<p>システム改修にあたり新規テーブルにNVARCHAR2を指定したカラムを用意し、既存テーブルでVARCHAR2が設定されているカラムをインサートしたい場面があったとします。</p>
<p>その新規テーブルに既存テーブルのデータを格納するときには型変換をしてデータを格納します。</p>
<pre class="line-numbers"><code class="language-other">CREATE TABLE newTable
                          (id NUMBER(2,0) NOT NULL AUTO_INCREMENT,
                           name NVARCHAR2(15));
</code></pre>
<pre class="line-numbers"><code class="language-other">INSERT INTO newTable(id,name)
SELECT id,TO_NCHAR(name)
FROM oldTable;</code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/889/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
