查看: 486|回復: 7

[每日一題] PL/SQL Challenge 每日一題:2020-6-1 CONTINUE語句

[復制鏈接]
論壇徽章:
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-6-19 06:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式


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

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

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

原始出處:
http://www.plsqlchallenge.com/

作者:Steven Feuerstein

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

素數(prime number)是一個這樣的自然數(整數),它大于1, 并且不是另外兩個更小的自然數的積。這里有個PL/SQL函數來告訴你一個整數是否素數:

CREATE OR REPLACE FUNCTION qz_is_a_prime (integer_in IN INTEGER)
   RETURN BOOLEAN
IS
   l_is_prime   BOOLEAN := integer_in > 1;
BEGIN
   IF l_is_prime
   THEN
      FOR indx IN 2 .. integer_in / 2
      LOOP
         IF MOD (integer_in, indx) = 0
         THEN
            l_is_prime := FALSE;
            EXIT;
         END IF;
      END LOOP;
   END IF;

   RETURN l_is_prime;
END;
/

哪些選項在執行之后你會看到如下文本被顯示在屏幕上:

2 is a prime number
3 is a prime number
5 is a prime number
7 is a prime number

注意:你看到的東西可能比這還多,但是上面這些行必須出現,選項才算正確。

(A)
DECLARE
   e_keep_checking   EXCEPTION;
BEGIN
   FOR indx IN 1 .. 10
   LOOP
      BEGIN
         IF NOT qz_is_a_prime (indx)
         THEN
            RAISE e_keep_checking;
         END IF;

         DBMS_OUTPUT.put_line (indx || ' is a prime number');
      EXCEPTION
         WHEN e_keep_checking
         THEN
            DBMS_OUTPUT.put_line (indx || ' is not a prime number');
      END;
   END LOOP;
END;
/

(B)
DECLARE
   e_keep_checking   EXCEPTION;
   l_indx INTEGER;
BEGIN
   FOR indx IN 1 .. 10
   LOOP
      l_indx := indx;

      IF NOT qz_is_a_prime (l_indx)
      THEN
         RAISE e_keep_checking;
      END IF;

      DBMS_OUTPUT.put_line (l_indx || ' is a prime number');
   END LOOP;
EXCEPTION
   WHEN e_keep_checking
   THEN
      DBMS_OUTPUT.put_line (l_indx || ' is not a prime number');
END;
/

(C)
DECLARE
   e_keep_checking   EXCEPTION;
BEGIN
   FOR indx IN 1 .. 10
   LOOP
      CONTINUE WHEN NOT qz_is_a_prime (indx);

      DBMS_OUTPUT.put_line (indx || ' is a prime number');
   END LOOP;
END;
/

(D)
DECLARE
   e_keep_checking   EXCEPTION;
BEGIN
   FOR indx IN 1 .. 10
   LOOP
      BEGIN
         IF NOT qz_is_a_prime (indx)
         THEN
            GOTO keep_checking;
         END IF;

         DBMS_OUTPUT.put_line (indx || ' is a prime number');

         <<keep_checking>>
         NULL;
      END;
   END LOOP;
END;
/

(E)
DECLARE
   e_keep_checking   EXCEPTION;
BEGIN
   FOR indx IN 1 .. 10
   LOOP
      IF qz_is_a_prime (indx)
      THEN
         DBMS_OUTPUT.put_line (indx || ' is a prime number');
      END IF;
   END LOOP;
END;
/
論壇徽章:
16
山治
日期:2017-01-11 16:13:26技術圖書徽章
日期: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秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05
2#
發表于 2020-6-19 09:08 | 只看該作者
答案  CDE


A) 錯誤,題目要求只輸出素數,輸出結果1-10,是素數和不是素數的,都輸出了。

B)  錯誤,異常定義語句放在loop循環外面,只輸出了1。

C)  正確,函數輸出的是Boolean類型,通過continue語句繼續循環,是素數就輸出。

D)  正確, 函數輸出的是Boolean類型,通過go to 語句繼續循環,是素數就輸出。

E)  正確, 函數輸出的是Boolean類型,通過if語句進行判斷,是素數就輸出。

使用道具 舉報

回復
論壇徽章:
16
山治
日期:2017-01-11 16:13:26技術圖書徽章
日期: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秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05
3#
發表于 2020-6-19 09:32 | 只看該作者
這個題目讓我想起了2018年公司擴編,需要招聘幾名Oracle數據庫開發工程師

然后我出了筆試題目,sql和plsql的。

plsql的第一個題目就是打印出1-100之間的素數


有幾個工作經驗5年+的,簡歷上寫著精通PL/SQL編程的,沒做出來。


有幾個寫法類似,代碼如下:

DECLARE

  l_cnt NUMBER:=0; --計數

BEGIN

  FOR idx1 IN 1 .. 100 LOOP
  
    FOR idx2 IN 1 .. 100 LOOP
      IF MOD(idx1, idx2) = 0 THEN
        l_cnt := l_cnt + 1;
      END IF;
    END LOOP;
  
    IF l_cnt = 2  THEN
      dbms_output.put_line(idx1);
    END IF;
  
    l_cnt := 0;
  
  END LOOP;
END;
/



看到上面這段代碼,我果斷隨便問了幾個問題,就結束了面試。

使用道具 舉報

回復
論壇徽章:
535
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:馬
日期:2008-10-08 17:01:01SQL大賽參與紀念
日期:2011-04-13 12:08:17授權會員
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉絲徽章
日期:2011-07-01 09:45:27ITPUB十周年紀念徽章
日期:2011-09-27 16:30:472012新春紀念徽章
日期:2012-01-04 11:51:22海藍寶石
日期:2012-02-20 19:24:27鐵扇公主
日期:2012-02-21 15:03:13
4#
發表于 2020-6-19 10:07 | 只看該作者


答案:ACDE
A: 例外是屬于循環里面的PLSQL塊的,不是質數在例外處理部分輸出,但不會跳出循環
B: EXCEPTION在程序主體部分,不是質數在例外處理部分輸出,然后程序就結束了。
C: CONTINUE WHEN NOT 不是質數跳過,程序繼續執行,是質數輸出
D: 用GOTO寫法,實現C 的邏輯
E: 循環里用IF語句判斷,常規寫法

使用道具 舉報

回復
論壇徽章:
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
5#
 樓主| 發表于 2020-6-19 23:49 | 只看該作者
答案ACDE, 4樓得獎。

A:
你可以使用異常來模擬CONTINUE功能,但它會產生一堆混亂的代碼,而且很難理解。此外,在PL/SQL中,引發和處理異常是一個相對緩慢的過程,這是你需要避免的情況 除非真正的異常已經(或需要)被引發。

B:
這個選項只顯示一行:

1 is not a prime number
你可以使用異常處理來模仿CONTINUE功能,但你需要在循環體內部定義一個嵌套塊。

在這個選項中,異常處理程序被附加到整體塊中,因此當異常被拋出時,循環就會終止。

C:
啊,如此可讀,如此緊湊,如此......合適,F在我用CONTINUE WHEN語句來表示 "只有當該條件為TRUE時,才會繼續執行循環體中的語句"。

D:
你可以用標簽來模擬CONTINUE的功能 但它會產生一堆亂七八糟的代碼,而且很難理解。而且......你需要在你的代碼中放一個GOTO語句。除非你真的需要,否則你肯定不想這么做,對吧? :-)

E:
是的,當然,對于這個題目中非常簡單的邏輯,你不需要使用CONTINUE。

每當你寫代碼的時候,你應該尋求最簡單的實現。

使用道具 舉報

回復
論壇徽章:
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
6#
 樓主| 發表于 2020-6-19 23:50 | 只看該作者
只是甲 發表于 2020-6-19 09:32
這個題目讓我想起了2018年公司擴編,需要招聘幾名Oracle數據庫開發工程師然后我出了筆試題目,sql和plsql的 ...

素數我們玩過很多了,看看老帖:
http://www.3490925.live/thread-1244925-1-1.html

使用道具 舉報

回復
論壇徽章:
16
山治
日期:2017-01-11 16:13:26技術圖書徽章
日期: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秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05
7#
發表于 2020-6-20 08:59 | 只看該作者
  還是審題不夠仔細,下面一段話漏掉了,直接看輸出,這個毛病得改改

做技術一定要去除浮躁,認真仔細,特別是做數據相關的。

公司IT部從年前的100人,裁員到現在30人了,估計還會繼續裁員,人心惶惶的。

使用道具 舉報

回復
論壇徽章:
16
山治
日期:2017-01-11 16:13:26技術圖書徽章
日期: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秀才
日期:2017-08-11 15:30:05秀才
日期:2017-08-11 15:30:05
8#
發表于 2020-6-20 09:04 | 只看該作者
newkid 發表于 2020-6-19 23:50
素數我們玩過很多了,看看老帖:http://www.3490925.live/thread-1244925-1-1.html

學習了

一有空就在論壇擼以前的精華帖,頗有收獲

很多時候,寫Oracle的SQL和PLSQL遇到不明白的
如果看官方文檔依舊得不到解答的,通過搜索,最終基本都定位到pub上了。
現在搜索會自動加上 itpub關鍵字了

使用道具 舉報

回復

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

本版積分規則 發表回復

DTCC2020中國數據庫技術大會 限時8.5折

【架構革新 高效可控】2020年9月21日~23日第十一屆中國數據庫技術大會將在北京隆重召開。

大會設置2大主會場,20+技術專場,將邀請超百位行業專家,重點圍繞數據架構、AI與大數據、傳統企業數據庫實踐和國產開源數據庫等內容展開分享和探討,為廣大數據領域從業人士提供一場年度盛會和交流平臺。

http://dtcc.it168.com


大會官網>>
30岁的男人干啥赚钱快赚钱多 二四六精选免费资料大全 必中三码期期开奖 基金能加杠杆吗 福建快3彩经网技巧基本走势 单双中特期期公开 沪深股票价格排名 江苏快三安卓版下载 神来棋牌2018下载 广东快乐10分破解 个人资产配置经典案
TOP技術積分榜 社區積分榜 徽章 團隊 統計 知識索引樹 積分競拍 文本模式 幫助
  ITPUB首頁 | ITPUB論壇 | 數據庫技術 | 企業信息化 | 開發技術 | 微軟技術 | 軟件工程與項目管理 | IBM技術園地 | 行業縱向討論 | IT招聘 | IT文檔
  ChinaUnix | ChinaUnix博客 | ChinaUnix論壇
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓優訊信息技術有限公司版權所有 聯系我們 
京ICP備09055130號-4  北京市公安局海淀分局網監中心備案編號:11010802021510 廣播電視節目制作經營許可證:編號(京)字第1149號
  
快速回復 返回頂部 返回列表
二四六精选免费资料大全 必中三码期期开奖 基金能加杠杆吗 福建快3彩经网技巧基本走势 单双中特期期公开 沪深股票价格排名 江苏快三安卓版下载 神来棋牌2018下载 广东快乐10分破解 个人资产配置经典案