1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ChatGPTを活用したOracleDB技術検証

Last updated at Posted at 2023-08-10

ChatGPTを活用すればSQLが書けなくてもOracleDBの技術検証ができるのか!

1. ルール

  • ChatGPT3.5(無償版)が出力したコマンドのみを実行
  • OracleDB 19c
  • 前提となる設定やオブジェクトは無し

2.検証内容

AWRレポートの分析でも重要なSQLの実行回数(executions)や実行時間(elapsed_time)。
これはどのタイミングでカウントされるのか。

3_1_実行回数.png

  1. 実行開始時
  2. 実行完了時
  3. コミット時
  4. 実行中にロック待ちで待機したら?
  5. 実行がエラー・キャンセルされたら?
  6. 実行完了後にロールバックされたら?

3.検証結果

最初に結果。
Chat-GPTを利用すれば、SQLやSQL*Plusのコマンドが分からなくても技術検証が可能。

No. 処理 実行回数 実行時間
1 実行開始時
2 実行完了時
3 コミット時
4 ロック待ち
5 キャンセル
6 ロールバック

(○:カウントアップ、-:変化なし)

4.検証

凡例

Chat-GPTに対する質問

Chat-GPTからの回答

OracleDBに対するコマンド実行

検証結果

初期状態準備

OracleDBで以下2カラムを持つt1表を作成するSQLを作成してください。
・c1:数値型・主キー
・c2:時刻型

OracleDBで以下のSQL文を使用して、2つのカラム(c1とc2)を持つt1テーブルを作成できます。c1は数値型の主キーであり、c2は時刻型です。

CREATE TABLE t1 (
  c1 NUMBER PRIMARY KEY,
  c2 TIMESTAMP
);

このSQL文によって、t1テーブルが作成されます。c1カラムは数値型の主キーとなりますので、重複した値を持つことができません。c2カラムは時刻型であり、日付と時間の情報を格納することができます。

SQL> CREATE TABLE t1 (
  2    c1 NUMBER PRIMARY KEY,
  3    c2 TIMESTAMP
  4  );

表が作成されました。

t1表に以下のデータを挿入するSQLを作成してください。
c1:1
c2:実行時点の時間

以下のSQL文を使用して、t1テーブルに指定されたデータを挿入できます。実行時点の時間はSYSTIMESTAMPを使用して取得します。

INSERT INTO t1 (c1, c2)
VALUES (1, SYSTIMESTAMP);

このSQL文によって、c1カラムに1が、c2カラムに現在の実行時点の時間が挿入されます。SYSTIMESTAMP関数はデータベースのシステム日付と時間を返します。

SQL> INSERT INTO t1 (c1, c2)
  2  VALUES (1, SYSTIMESTAMP);

1行が作成されました。

SQLPLUSで以下の通り設定するコマンドを作成してください。
横幅:300文字
表示行数:1000行

SQL*Plusで横幅を300文字、表示行数を1000行に設定するコマンドは以下のようになります。

SET LINESIZE 300
SET PAGESIZE 1000

これにより、SQL*Plusの出力結果が300文字幅で表示され、1ページに1000行まで表示されるようになります。

SQL> SET LINESIZE 300
SQL> SET PAGESIZE 1000

t1表の全てのデータを表示するSQLを作成してください。

t1表のすべてのデータを表示するためのSQL文は次の通りです。

SELECT * FROM t1;

このSQL文を実行すると、t1表内のすべての行と列が表示されます。ただし、実際のデータベース内に多くの行がある場合、すべてのデータを表示すると出力が大きくなることに注意してください。必要な情報だけを表示するために、適切なカラムを選択するか、適切な条件を使用してデータをフィルタリングすることも考慮してください。

SQL> SELECT * FROM t1;

        C1 C2
---------- ---------------------------------------------------------------------------
         1 23-05-01 17:58:03.087448

検証用SQL

t1表に対し、c1が1である行のc2を実行時の時間に更新するSQLを作成してください。

以下のSQL文を使用して、t1表においてc1が1である行のc2を実行時の時間に更新できます。

UPDATE t1
SET c2 = SYSTIMESTAMP
WHERE c1 = 1;

このSQL文によって、t1表のc1が1である行のc2カラムが現在の実行時点の時間に更新されます。UPDATE文では、SET句で更新対象のカラムと新しい値を指定し、WHERE句で更新する行を絞り込みます。上記のSQL文では、c1が1である行だけが対象となります。

SQL> UPDATE t1
  2  SET c2 = SYSTIMESTAMP
  3  WHERE c1 = 1;

1行が更新されました。

v$sqlから上記UPDATE文を対象に、以下の情報を出力するSQLを作成してください。
SQL_ID・SQL全文・解析回数・実行回数・実行時間

以下のSQL文を使用して、v$sqlビューから指定したSQLを対象に、SQL_ID、SQL全文、解析回数、実行回数、実行時間を出力できます。

SELECT sql_id AS "SQL_ID",
       sql_fulltext AS "SQL全文",
       executions AS "実行回数",
       parse_calls AS "解析回数",
       elapsed_time / 1000000 AS "実行時間(秒)"
FROM v$sql
WHERE sql_fulltext LIKE '%UPDATE t1%SET c2 = SYSTIMESTAMP%WHERE c1 = 1%';

このSQL文では、v$sqlビューからSQL全文に指定したUPDATE文の部分を含むレコードを検索し、SQL_ID、SQL全文、解析回数、実行回数、実行時間を取得しています。%はワイルドカードを表すため、UPDATE文の中間に他の文字列があっても対象となります。ただし、この方法はSQL文が完全に一致しない場合にもマッチする可能性があるため、注意が必要です。必要に応じて正確なSQL文に合わせて適切にパターンマッチを調整してください。

SQL> SELECT sql_id AS "SQL_ID",
  2         sql_fulltext AS "SQL全文",
  3         executions AS "実行回数",
  4         parse_calls AS "解析回数",
  5         elapsed_time / 1000000 AS "実行時間(秒)"
  6  FROM v$sql
  7  WHERE sql_fulltext LIKE '%UPDATE t1%SET c2 = SYSTIMESTAMP%WHERE c1 = 1%';

SQL_ID        SQL全文                          実行回数   解析回数 実行時間(秒)
------------- ------------------------------ ---------- ---------- --------------
6g4afgxw08xm0 UPDATE t1                               1          1        .003307
              SET c2 = SYSTIMESTAMP
              WHERE c1 = 1

※不要な行は削除
実行後(commit前)に実行回数・実行時間がカウント
その後、commitを実行しても値に変更なし。

ロールバック時の動作確認

2回ほどupdate文を実行し、ロールバック。
→値はロールバックされるが、実行回数・実行時間は影響なし。

SQL_ID        SQL全文                          実行回数   解析回数 実行時間(秒)
------------- ------------------------------ ---------- ---------- --------------
6g4afgxw08xm0 UPDATE t1                               3          3        .003919
              SET c2 = SYSTIMESTAMP
              WHERE c1 = 1

ロック待ちで待機

別セッションで同様のupdate文を実行し、commitしない行ロックで待機します。
待機しているSQLの実行回数は増えませんが、実行時間は増えます。

SQL_ID        SQL全文                          実行回数   解析回数 実行時間(秒)
------------- ------------------------------ ---------- ---------- --------------
6g4afgxw08xm0 UPDATE t1                               4          5     239.078055
              SET c2 = SYSTIMESTAMP
              WHERE c1 = 1

実行キャンセル

Ctrl+C で実行をキャンセル
実行回数・実行時間が増えてます。
正常実行と同様の扱いになるようです。

SQL> UPDATE t1
  2  SET c2 = SYSTIMESTAMP
  3  WHERE c1 = 1;
^CUPDATE t1
*
1でエラーが発生しました。:
ORA-01013: ユーザーによって現行の操作の取消しがリクエストされました
SQL_ID        SQL全文                          実行回数   解析回数 実行時間(秒)
------------- ------------------------------ ---------- ---------- --------------
6g4afgxw08xm0 UPDATE t1                               5          5     404.896718
              SET c2 = SYSTIMESTAMP
              WHERE c1 = 1

5.まとめ

DB操作にChat-GPTを利用するメリット

  • SQL・SQL*Plusコマンド・PL/SQLなどが分からなくてもOracleDBを扱える。
  • 分かる場合でも、自身で組むより早くて正確
  • 知らない方法や関数を提示されることで新しい発見がある。

注意点

  • 誤ったコマンドを提示する場合がある(あった)。
    そのため、コマンドの内容や実行結果は要確認。

最後に、
今回、一番苦労したのは 「Chat-GPTとのやり取りをQiita上でどのように表現するか」でした。
画像(スクリーンショット)は分かりやすいですが、
文字情報が落ちてしまうのはイヤだなーということで今回の表記になりました。

6.関連リンク

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?