-- まずはTRANSLATE
with s(n) as (
select 1 n from dual
union all
select n + 1 from s where s.n < 10000
)
select * from s
where translate(to_char(n),'3','3') = '3333';
-- 次にREPLACE
with s(n) as (
select 1 n from dual
union all
select n + 1 from s where s.n < 10000
)
select * from s
where replace(to_char(n),'3','3') = '3333';
--【実測します!】--
SQL> with s(n) as (
2 select 1 n from dual
3 union all
4 select n + 1 from s where s.n < 10000
5 )
6 select * from s
7 where translate(to_char(n),'3','3') = '3333';
N
----------
3333
経過: 00:00:00.15
SQL> with s(n) as (
2 select 1 n from dual
3 union all
4 select n + 1 from s where s.n < 10000
5 )
6 select * from s
7 where replace(to_char(n),'3','3') = '3333';
N
----------
3333
経過: 00:00:00.15
SQL>
DECLARE
-- カーソルの定義
CURSOR C IS SELECT ... ;
-- FETCHしたときにデータを取得する変数
C_DATA C%ROWTYPE; -- 受け取る変数は%ROWTYPEを使いましょう。取得カラムに対して一個ずつ変数定義しないように!
BEGIN
OPEN C; -- カーソルをオープンします
LOOP
FETCH C INTO C_DATA; -- データを1件フェッチします
EXIT WHEN C%NOTFOUND; -- データがなくなった時にループから抜け出します
-- なにかの処理
END LOOP;
CLOSE C; -- カーソルをクローズします
EXCEPT
WHEN OTHERS THEN -- 想定外のエラーが発生したとき
IF C%ISOPEN THEN -- カーソルがオープンしていたら
CLOSE C; -- カーソルを閉じます
END IF;
RAISE; -- 想定外のエラーを呼び出し元に渡します
END;
/
LOOPから、END LOOPまでの間を繰り返します。
二つ目、カーソルFORループを使用した場合の例を示します。
DECLARE
-- カーソルの定義
CURSOR C IS SELECT ... ;
BEGIN
FOR i IN C LOOP
-- なにかの処理
END LOOP;
EXCEPT
WHEN OTHERS THEN
RAISE;
END;
/
-- ■CURRENT OF カーソルの使い方 スクリプト
SET NULL NL
CREATE TABLE POI (n NUMBER, v VARCHAR2(20));
INSERT INTO POI(N) SELECT N FROM (
WITH S(N) AS (
SELECT 1 N FROM DUAL
UNION ALL
SELECT N + 1 FROM S
WHERE N < 10)
SELECT N FROM S
); -- このINSERT SELECTで10行作成しています。数字を変えれば好きなだけデータが作れます。
SELECT * FROM POI;
DECLARE
n NUMBER;
CURSOR C IS SELECT N, V FROM POI FOR UPDATE;
BEGIN
FOR i IN C LOOP
UPDATE POI SET V = 'RECORD IS No.'||i.N
WHERE CURRENT OF C;
END LOOP;
END;
/
SELECT * FROM POI;
DROP TABLE POI PURGE;
実行結果です。できました!
-- ■実行結果
SQL> SET NULL NL
SQL> CREATE TABLE POI (n NUMBER, v VARCHAR2(20));
表が作成されました。
経過: 00:00:00.01
SQL> INSERT INTO POI(N) SELECT N FROM (
2 WITH S(N) AS (
3 SELECT 1 N FROM DUAL
4 UNION ALL
5 SELECT N + 1 FROM S
6 WHERE N < 10)
7 SELECT N FROM S
8 );
10行が作成されました。
経過: 00:00:00.00
SQL>
SQL> SELECT * FROM POI;
N V
---------- --------------------
1 NL
2 NL
3 NL
4 NL
5 NL
6 NL
7 NL
8 NL
9 NL
10 NL
10行が選択されました。
経過: 00:00:00.01
SQL>
SQL> DECLARE
2 n NUMBER;
3 CURSOR C IS SELECT N, V FROM POI FOR UPDATE;
4 BEGIN
5 FOR i IN C LOOP
6 UPDATE POI SET V = 'RECORD IS No.'||i.N
7 WHERE CURRENT OF C;
8 END LOOP;
9 END;
10 /
PL/SQLプロシージャが正常に完了しました。
経過: 00:00:00.01
SQL>
SQL> SELECT * FROM POI;
N V
---------- --------------------
1 RECORD IS No.1
2 RECORD IS No.2
3 RECORD IS No.3
4 RECORD IS No.4
5 RECORD IS No.5
6 RECORD IS No.6
7 RECORD IS No.7
8 RECORD IS No.8
9 RECORD IS No.9
10 RECORD IS No.10
10行が選択されました。
経過: 00:00:00.00
SQL>
SQL> DROP TABLE POI PURGE;
表が削除されました。
経過: 00:00:00.04
SQL>
ちなみに、カーソル変数名を指定すると以下の通り、エラーになりました。
-- ■カーソル名ではなく、変数名を指定した場合は、エラーです
SQL> DECLARE
2 n NUMBER;
3 CURSOR C IS SELECT N, V FROM POI FOR UPDATE;
4 BEGIN
5 FOR i IN C LOOP
6 UPDATE POI SET V = 'RECORD IS No.'||i.N
7 WHERE CURRENT OF i;
8 END LOOP;
9 END;
10 /
WHERE CURRENT OF i;
*
行7でエラーが発生しました。:
ORA-06550: 行7、列23:
PLS-00413: CURRENT OF句の識別子はカーソル名ではありません。
ORA-06550: 行7、列23:
PL/SQL: ORA-00904: : 無効な識別子です。
ORA-06550: 行6、列5:
PL/SQL: SQL Statement ignored
経過: 00:00:00.01
SQL>
結果としては、カーソル名を指定すればオッケーということですね!
まとめ
PL/SQLでカーソルをつくってデータを取得するときは、カーソルFORループを使いましょう。取得したデータを更新するときは、CURRENT OF カーソルを使いましょう。
-- テーブルを作成します。POIに意味はありませんが、キーボード上に並んでいて、「ポイ」という感じが気に入っていてテストのときによく使っています。
SQL> create table poi (
2 a number,
3 b number,
4 e number,
5 d number
6 );
表が作成されました。
-- 「C」列を追加し忘れました。よく見ると「E」「D」の列の順番も間違っていました。
SQL> desc poi
名前 NULL? 型
----------------------------------------- -------- ----------------------------
A NUMBER
B NUMBER
E NUMBER
D NUMBER
-- 「C」列を追加します。
SQL> alter table poi add (c number);
表が変更されました。
-- 確認すると、最後に追加されています。
SQL> desc poi
名前 NULL? 型
----------------------------------------- -------- ----------------------------
A NUMBER
B NUMBER
E NUMBER
D NUMBER
C NUMBER
-- 「E」「D」列を「invisible」に設定します。
SQL> alter table poi modify ( e invisible, d invisible );
表が変更されました。
-- 確認すると、確かに「E」「D」列が見えなくなっています。ちなみにこの状態でINSERT INTO POI VALUES ( 1, 2, 3 );を実行すると、見えない列はNULLになりました。
SQL> desc poi
名前 NULL? 型
----------------------------------------- -------- ----------------------------
A NUMBER
B NUMBER
C NUMBER
-- 順番が大事ですので、まずは「D」列を見えるようにします。
SQL> alter table poi modify ( d visible );
表が変更されました。
-- そして、次に「E」列を見えるようにします。
SQL> alter table poi modify ( e visible );
表が変更されました。
-- 確認すると、順番が正しく入れ替わりました。
SQL> desc poi
名前 NULL? 型
----------------------------------------- -------- ----------------------------
A NUMBER
B NUMBER
C NUMBER
D NUMBER
E NUMBER
SQL> insert into poi values ( 1, 2, 3, 4, 5 );
1行が作成されました。
-- INSERT文を実行するときに項目を省略してみましたが、入れ替わった順番どおり値がセットされていました!
SQL> select * from poi;
A B C D E
---------- ---------- ---------- ---------- ----------
1 2 3 4 5
経過: 00:00:00.01
SQL>
一言でAngularとは何か、というと、ステキなWebアプリを開発するためのフレームワーク、と言ってよいのかな、と、思います。ステキなWebアプリと書きましたが、流行の専門用語ではこれをPWA(Progressive Web Application)と呼んでいて、デスクトップアプリケーションのような体験ができるWebアプリ、ということのようです。これらはGoogleが開発を進めているオープンソースのフロントエンドフレームワークで、半年に一度はメジャーバージョンが更新される、という活発な開発状況です。書籍の数が比較的少ないのは、この頻繁なバージョンアップのせいではないか、ということをぼくは勝手に疑っています。
「Start editing to see some magic happen :)」と記載がありますので、ここの部分、さっそく直してみましょう。まずは、日本語使えるのかな、ということでこの部分を日本語にしてみます。左側の「app.component.html」ファイルをクリックして中央に開きます。英語部分を日本語にしてみましょう。
と、いうのも、Angularのホームページのチュートリアルに感動して、これは本格的に取り組まねば、という気持ちになりました。まず、実行できるチュートリアルがすべてWebで完結しているのですよね。Visual Studio CodeのようなIDEが自動的に開始します。先日gitPodでも体験していましたがブラウザだけで開発できるのは素晴らしいですね!そして、コンポーネント指向開発という新しい開発方法もなかなか面白いですね。部品が多くなり過ぎたら再利用が難しくなるかも知れないなぁ、という気持ちになりましたが、もうちょっとやれば、何かつかめるかも知れませんね。
Sub test()
'B1セルの内容がA1セルより小さいとき、B1セルの背景をグレーにしてフォントを太字にする条件付き書式を設定します
With Range("B1").FormatConditions.Add(Type:=xlExpression, Formula1:="=AND($B1<$A$1)")
.Font.Bold = True
.Interior.Color = RGB(166, 166, 166)
End With
End Sub
必須入力は、「インスタンスID」と「パスワード」のみですね。今回はお試しで作ってみるだけなので、最小構成にしたいですね。データベースのバージョンは、8.0、5.7、5.6から選べました。おそらく初期値の「5.7」は安定したバージョンなのでしょうね。今回はお試しなので、8.0を選択しておくことにします。インスタンスが作成され、常時存在することになるので、インスタンスを起動している間は使用料がかかります。金額については、概算ですが、Cloud SQL for MySQL の料金で、計算できるようです。リージョンの選択によって若干金額が変わってきます。現時点のアイオワでは、1仮想CPUあたり、1か月で$30.15、1GBあたり、1ヶ月で$5.11です。東京は$39.19、$6.64なので、やはり若干高くなっていますね。業務で利用する場合は、ネットワークの距離の影響もあるので、慎重に選ぶ必要があるかと思いますが、今回は安い方のアイオワで問題ありませんね。そして「ゾーンの可用性」ですがこちらは「シングルゾーン」に変更しましょう。複数のゾーン(高可用性)を選択すると、およそ料金が二倍になります。ま、二台用意しておいて、一台がダメになったとき切り替えてダウンタイムを極小にしよう、という取り組みですから、ま、そうなりますよね。そして、vCPU数が4に、メモリ、26GBもいらないでしょう。こちらは、「構成オプションを表示」を選択することで設定できるようになっていました。