実現したいこと
- エラーを解消する
- 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

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。