查看: 222|回復: 3

[每日一題] PL/SQL Challenge 每日一題:2020-9-7 SAVEPOINT

[復制鏈接]
論壇徽章:
527
奧運會紀念徽章:壘球
日期:2008-09-15 01:28:12生肖徽章2007版:雞
日期:2008-11-17 23:40:58生肖徽章2007版:馬
日期:2008-11-18 05:09:48數據庫板塊每日發貼之星
日期:2008-11-29 01:01:02數據庫板塊每日發貼之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春紀念徽章
日期:2009-01-04 14:52:28數據庫板塊每日發貼之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食紀念
日期:2009-07-22 09:30:00
跳轉到指定樓層
1#
發表于 2020-9-11 23:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
(原發表于2012-2-29)


最先答對且答案未經編輯的puber將獲得紀念章一枚(答案不可編輯但可發新貼補充或糾正),其他會員如果提供有價值的分析、討論也可獲得紀念章一枚。

每兩周的優勝者可獲得itpub獎勵的技術圖書一本。

以往舊題索引:
http://www.3490925.live/forum.php?m ... =typeid&typeid=1808

原始出處:
https://devgym.oracle.com/

作者:Steven Feuerstein

運行環境:SQLPLUS, SERVEROUTPUT已打開, 最低版本要求:10G
注:本題給出答案時候要求給予簡要說明才能得到獎品



我創建了這張員工表并填入數據:

CREATE TABLE plch_employees
(
   employee_id   INTEGER
,  last_name     VARCHAR2 (100)
,  salary        NUMBER
)
/

BEGIN
   INSERT INTO plch_employees VALUES (100, 'Picasso', 2500);
   INSERT INTO plch_employees VALUES (200, 'Mondrian', 3500);
   INSERT INTO plch_employees VALUES (300, 'O''Keefe', 5500);
   COMMIT;
END;
/

然后我創建了一個過程:

CREATE OR REPLACE PROCEDURE plch_give_raise (limit_in IN NUMBER)
IS
BEGIN
   UPDATE plch_employees
      SET salary = salary * 10
    WHERE salary < limit_in;

   SAVEPOINT keep_prior_changes;
END;
/

最后我寫了這段不完整的代碼塊:

DECLARE
   l_count   PLS_INTEGER;
BEGIN
   plch_give_raise (5000);

   /*REPLACE*/

   SELECT COUNT (*) INTO l_count
     FROM plch_employees
    WHERE salary > 10000;

   DBMS_OUTPUT.put_line (l_count);
END;


哪些選項的代碼可用來取代/*REPLACE*/注釋,從而使得這個代碼塊執行之后會顯示 "2" ?

(A)
ROLLBACK TO plch_give_raise.keep_prior_changes;


(B)
ROLLBACK;


(C)
ROLLBACK TO keep_prior_changes;


(D)
DELETE FROM plch_employees;
ROLLBACK TO keep_prior_changes;
論壇徽章:
18
山治
日期:2017-01-11 16:13:26妮可·羅賓
日期:2020-09-01 08:52:07秀才
日期:2018-01-02 10:32:00技術圖書徽章
日期:2017-08-23 14:17:00技術圖書徽章
日期:2017-08-23 14:17:00秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05
2#
發表于 2020-9-14 10:06 | 只看該作者
答案 CD


A) 錯誤,ROLLBACK TO plch_give_raise.keep_prior_changes; 運行報錯 ORA-06550: 第 6 行, 第 31 列:  ORA-00933: SQL 命令未正確結束

B) 錯誤,輸出為0,因為已經rollback了,所以找不到薪水大于10000的員工

C) 正確,修復了B的問題,將rollback調整為 ROLLBACK TO keep_prior_changes,update的依舊生效

D) 正確,相比C而言,在ROLLBACK TO keep_prior_changes之前加了一個delete語句,不影響

使用道具 舉報

回復
論壇徽章:
18
山治
日期:2017-01-11 16:13:26妮可·羅賓
日期:2020-09-01 08:52:07秀才
日期:2018-01-02 10:32:00技術圖書徽章
日期:2017-08-23 14:17:00技術圖書徽章
日期:2017-08-23 14:17:00秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05
3#
發表于 2020-9-14 10:07 | 只看該作者
pub終于不用審核了,發表了,直接過了

使用道具 舉報

回復
論壇徽章:
527
奧運會紀念徽章:壘球
日期:2008-09-15 01:28:12生肖徽章2007版:雞
日期:2008-11-17 23:40:58生肖徽章2007版:馬
日期:2008-11-18 05:09:48數據庫板塊每日發貼之星
日期:2008-11-29 01:01:02數據庫板塊每日發貼之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春紀念徽章
日期:2009-01-04 14:52:28數據庫板塊每日發貼之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食紀念
日期:2009-07-22 09:30:00
4#
 樓主| 發表于 2020-9-15 03:47 | 只看該作者
答案CD, 2樓得獎。

A: SAVEPOINT的名稱之前不可以帶過程名。這會導致如下異常:
ORA-00933: SQL command not properly ended

B: 這個選項把所有修改都回滾了,因此沒有任何記錄滿足salary > 10000的條件,輸出將會是0。

C: 正確的SAVEPOINT回滾語法。因為SAVEPOINT之后什么也沒做,這個ROLLBACK其實沒有回滾任何修改。

D: 正確的SAVEPOINT回滾語法。SAVEPOINT之后做了一個DELETE,這個ROLLBACK相當于DELETE沒有發生。


使用道具 舉報

回復

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則 發表回復

TOP技術積分榜 社區積分榜 徽章 團隊 統計 知識索引樹 積分競拍 文本模式 幫助
  ITPUB首頁 | ITPUB論壇 | 數據庫技術 | 企業信息化 | 開發技術 | 微軟技術 | 軟件工程與項目管理 | IBM技術園地 | 行業縱向討論 | IT招聘 | IT文檔
  ChinaUnix | ChinaUnix博客 | ChinaUnix論壇
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓優訊信息技術有限公司版權所有 聯系我們 
京ICP備09055130號-4  北京市公安局海淀分局網監中心備案編號:11010802021510 廣播電視節目制作經營許可證:編號(京)字第1149號
  
快速回復 返回頂部 返回列表
30岁的男人干啥赚钱快赚钱多 最新广西快三走势图 山西快乐10分钟投注 深圳风采2019008 股票涨跌专业一天赚3000 上海汽车股票行情 河内5分技巧 博彩龙 陕西体彩11选5开奖 江西多乐彩走势图表 东方财富股票行情网