【OSS-DB Silver】問題集(黒本)には出てくるけれど教科書(緑本)には出てこない事項

OSS-DB Silver 取得に向けて勉強中です。

『OSS教科書 OSS-DB Silver ver.2.0対応(翔泳社)』（緑本）と
『徹底攻略OSS-DB Silver 問題集 ver2.0対応(インプレス)』（黒本）
に取り組んでいます。

問題集で間違えたポイント、あやふやな点を教科書で補いつつ進めているのですが、
「問題集には出てくるが、教科書には出てこない」事項があったので、復習用にメモしておきます。
（単に見落としていただけかもしれないけれど）

尚、公式ドキュメントはOSSDBの出題範囲である「PostgreSQL 11」のものを参照しました。
（英）https://www.postgresql.org/docs/11/index.html
（日）https://www.postgresql.jp/document/11/html/

# INHERITS（継承）
問題集p69（4章　SQL）問27 
公式ドキュメント ：　
https://www.postgresql.org/docs/11/tutorial-inheritance.html

（2022/4/13追記：
Pingにも出てきた。（問題ID : 12270）Onenoteに詳細メモ）

# SQL99
問題集p99 （4章　SQL）問33の解説
いきなり
>SQL99の結合に関する問題です。

って出てきた。**99って何？**

→SQLには版があるようだ。国際標準SQL言語の国際規格制定年度に基づいて版名が付けられている模様。
1999~2000年度に制定されたのがSQL99。
その前の版はSQL92。
問題集に出てきたということは、SQL99が最新版なのかな？「SQL:2016」というのも見かけた。
大きな節目になったのがSQL92とSQL99だという情報もある。
詳細については今は深追いせず、
・SQLには版がある
・SQL99はメジャーな版
だということだけ覚えておこう。

# カーソルのクローズって何？
問題集p80 （4章　SQL）問43
問題文
>カーソルのクローズに関する説明として適切でないものを選びなさい。

→カーソルって何？クローズって何？初耳。教科書を見てみるも、何の記載も無い。

→ https://www.youtube.com/watch?v=zic2Tbd0ZHA
→https://atmarkit.itmedia.co.jp/ait/articles/1703/01/news193.html

→つまり、例えばUPDATEしたい行が3種類あったとして・・・
通常は・・・「WHERE句でどの行かを指定してUPDATEする（3種それぞれについて行なう）」必要がある。
カーソルを使うと・・・「最初に3種それぞれの条件とUPDATEしたい内容」を変数として定義しておく。カーソルを実行することでループ処理で1行ずつ条件を判定し、条件に応じてデータを自動で更新することができる。
・・・ということかな？ただ、この変数（「条件」と「UPDATEしたい内容」）の指定方法がいまいちよくわからない。

（2022/4月メモ：→カーソルについて、Ping-tで出てきた！解説Onenoteに記録した。）

# EXECUTE・USING
黒本6章問12・13・15で出てきた。
緑本p238 8章SQLとオブジェクト　トリガの作成　で
書式の中にさらっと「EXECUTE」が出てくるも、USINGは見当たらなかった。
EXECUTEも詳しい説明は無し。

# %type , %rowtypeとは？
黒本10章（総仕上げ問題）問32
公式ドキュメント：[43.3.3. 型のコピー・43.3.4. 行型](https://www.postgresql.jp/document/11/html/plpgsql-declarations.html)

◆%type◆
データ型の変数を宣言。
参照される項目のデータ型が将来変更された場合でも、関数定義を変更する必要をなくすことができる！！

◆%rowtype◆
複合型の変数を宣言。
（複合型の変数＝行変数（または行型変数））
table_name%ROWTYPEという記法を使用して、既存のテーブルやビューの行と同じ型を持つ行変数を宣言することができる。
もしくは、複合型の名前を付与して宣言することができる。

◆例（%type）◆
> 例えば、usersテーブルにuser_idという列があるものとします。 users.user_idと同じデータ型の変数を宣言するには、以下のように記述します。
`user_id users.user_id%TYPE;`
%TYPEを使用することで、参照する構造のデータ型を把握する必要がなくなります。 また、これが最も重要なことですが、参照される項目のデータ型が将来変更された（例えば、user_idのテーブル定義をintegerからrealに変更した）場合でも、関数定義を変更する必要をなくすことができます。
（引用元：[PostgreSQL 11.5文書　第43章 PL/pgSQL - SQL手続き言語	43.3. 宣言　43.3.3. 型のコピー](https://www.postgresql.jp/document/11/html/plpgsql-declarations.html#PLPGSQL-DECLARATION-TYPE)　）

# STRICT
黒本p227 （10章　総仕上げ問題）問34で
いきなり`STRICT`って出てきた。

>問題(p227)：
CREATE FUNCTION myfune(INTEGER) RETURNS text
LANGUAGE plpgsql STRICT AS '
(後略)

>解説(p250)：
（前略）引数にNULLが渡されたときの動作としてSTRICTが設定されているため、中のコードは実行されずNULLが戻されます。

**STRICTって何？**

公式ドキュメント ：　
https://www.postgresql.jp/docs/9.2/sql-createfunction.html
↓
>CALLED ON NULL INPUT
RETURNS NULL ON NULL INPUT
STRICT
<br>CALLED ON NULL INPUT（デフォルト）を指定すると、引数にNULLが含まれていても、関数が通常通り呼び出されます。 
その場合は、必要に応じてNULL値を確認し、適切な対応をすることは関数作成者の責任です。
RETURNS NULL ON NULL INPUTもしくはSTRICTを指定すると、関数の引数にNULLがある場合、常にNULLを返します。 
このパラメータが指定されると、NULL引数がある場合、関数は実行されません。 代わりに、NULLという結果が自動的に与えられます。

「STRICTを指定すると、関数の**引数にNULLがある場合、常にNULLを返します**」

# CASE

Ping-t（問題ID : 11980）でCASEが出てきたので緑本を引いたが、掲載されておらず。
黒本（p152 6章関数）には1問出題されていた。構文も記載されていた。

条件分岐の記述ができる関数。

【構文】[]内は省略可能
CASE [カラム名] WHEN 条件式 THEN 結果
　[WHEN...]
　[ELSE 結果]
END 

# 追記記録
・（2022.03.03）STRICT
・（2022.4.13）CASE