質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

Q&A

解決済

2回答

1407閲覧

【PL/SQL】対話式でコミットかロールバックを選ばせる

peto_123

総合スコア19

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

0グッド

0クリップ

投稿2023/04/19 11:32

実現したいこと

  • エラーを解消する
  • UPDATE結果をDB上で確認する
  • UPDATE結果をコミットせずにロールバックする

前提

お世話になっております。

ORACLE SQLのUPDATE文をテストをしています。
テストにあたっての要件は、UPDATE結果を確認できること、コミットせずにロールバックすることです。

それを実現するために処理の最後に対話式でロールバックを選択できるように記述しております。
その箇所にエラーが出てしまっています。

シェルから
SQLPLUS XXX.sql
で下記ソースコードを呼び出したところ、
エラーメッセージがいくつか出力されるのですが、その指摘内容が不明です。

エラーメッセージ中の行36は
DBMS_OUTPUT.PUT_LINE('Commit (C) or Rollback (R)?');
に該当します。
行50は
END;
に該当します。
(申し訳ありませんが列番号はコピーしたものと一致しません。)

発生している問題・エラーメッセージ

DBMS_OUTPUT.PUT_LINE('Commit (C) or Rollback (R)?'); * 行36でエラーが発生しました。 ORA-06550: 行36, 列14: PLS-00103: 記号"."が見つかりました。 次のうちの1つが入るとき: constant exception <an identifier> <a double-quoted delimited-identifier> table columns long double ref char time timestamp interval date binary national character nchar 記号"<an identifier" は続行のために"."に代わりました。 ORA-06550:行37, 列10: PLS-00103: 記号"="が見つかりました。 次のうちの1つが入るとき: constant exception <an identifier> <a double-quoted delimited-identifier> table columns long double ref char time timestamp interval date binary national character nchar 記号"<an identifier>" は続行のために"="に代わりました。 ORA-06550: 行38, 列3: PLS-80103: 記号 "IF" が見つかりました。 次のうちの1つが入るとき: begin function pragma procedure subtype type can identifier> <a double-quoted delimited-identifier> current cursor delete exists prior 記号 "begin" は続行のために "IF" に代わりました。 ORA-06550: 行50, 列4: PLS-88183: 記号 "end-of-file" が見つかりました。 次のうちの1つが入るとき: (begin case declare end exception exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge json_exists json_value json_query json_object json_array

該当のソースコード

PL/SQL

1WHENEVER SQLERROR EXIT 1 2SET ECHO ON 3SET SERVEROUTPUT ON 4SET PAUSE OFF 5SET PAGESIZE 0 6 7-- Description for testing 8SET AUTOCOMMIT OFF; 9 10-- Start transaction 11BEGIN 12 SAVEPOINT start_tran; 13 14 【UPDATE文です】 15 16 -- Commit or rollback 17 DECLARE 18 choice CHAR(1); 19 -- コミットまたはロールバックをユーザに入力させる 20 DBMS_OUTPUT.PUT_LINE('Commit (C) or Rollback (R)?'); 21 choice := UPPER(SUBSTR(TRIM('&1'), 1, 1)); 22 IF choice = 'C' THEN 23 -- コミットする 24 COMMIT; 25 DBMS_OUTPUT.PUT_LINE('Transaction committed'); 26 ELSIF choice = 'R' THEN 27 -- ロールバックする 28 ROLLBACK; 29 DBMS_OUTPUT.PUT_LINE('Transaction rolled back'); 30 ELSE 31 -- 不正な入力の場合はエラーメッセージを表示して終了する 32 DBMS_OUTPUT.PUT_LINE('Invalid input. Transaction aborted'); 33 END IF; 34END; 35/ 36EXIT 37/ 38

試したこと

DECLAREから END IF;までを「--」でコメントアウトして実行したところ C or R の入力をしたのち「プロシージャが正常に完了しました。」というメッセージが出力されました。
また前記箇所をsqlファイルから削除して実行したところ「プロシージャが正常に完了しました。」というメッセージが出力されました。

なぜエラーメッセージが出るのか、また個々のエラーメッセージが何に該当しているのか不明で行き詰ってしまいました。
コメントアウトの挙動も不思議です。
ご教示のほどどうぞよろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Red Hat Enterprise Linux 8.2
ORACLE 19c

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

選択式にしなくても、ROLLBACK前にPAUSEをかけられれば更新結果を確認するという目的は果たせました。
そのため、DECLAREブロック、BEGIN~ENDブロックともに不要となりました。
また、エラーメッセージが必ずしも的確な内容を返していないということを理解しました。

投稿2023/05/01 12:28

peto_123

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

質問のブロックの書き方が間違っています。
ブロック : DECLARE, BEGIN, END のサンプル BEGINとENDは必須だが、変数などの宣言がなければDECLAREは不要。ブロックは入れ子(ブロックの中にブロックが存在できる)

第III部 SQL*Plusリファレンス マニュアルに載っていない点はオラクル・サポートに質問します。要サポート契約

投稿2023/04/23 08:02

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問