2017-10-18 166 views
0

我對這個任務有一些邏輯思考的麻煩。 因此,任務要求返回字母列表中第一個較大的字母的位置。 例如:打印字符列表中較大的字母的位置

   ABVD -> 3 
      BCDG -> 4 
      CFDE -> 2 

這個任務建議使用lenght,ASCII,並命名爲塊,功能

原來這就是我到目前爲止做:

declare 
x varchar2(10) :='ABFD'; 
BEGIN 
FOR i in 1..length(x) LOOP 
dbms_output.put_line(ASCII(SUBSTR(x, i, 1))); 
END LOOP; 
END; 

我的想法是,以將字母轉換爲數字:65,66,70,68。該模式是x + 1,並且由於數字70不等於66 + 1,所以程序將返回該數字的位置,即3. 不幸的是,我不知道如何將這個想法變成代碼。你能給我一些提示/建議嗎?謝謝!

+0

爲什麼轉換爲數字?是的,70> 65,但'F'>'A'也是。 –

+0

感謝您的回覆!我不知道我們實際上可以做到這一點。 – Chopsticks

回答

1

在問題陳述中,您說過「...使用命名塊,功能」。

您的解決方案是一個匿名程序。它不是以任何名稱命名的(這就是爲什麼它被稱爲「匿名」)。它不是一個函數 - 它不返回任何東西。

我會讓你學習文檔來理解函數和過程之間的區別,以及如何命名函數或過程。下面我會跟隨你的主角,並展示如何修改你的代碼,使其成爲一個可行的匿名程序。 (在程序中「打印」ind的最終值;當您將其更改爲某個功能時,應該爲return表示該值,而不是打印它。)

在您發佈的代碼中,您正在打印字母輸入字符串,一個接一個。你甚至沒有試圖定義或分配給一個整數(字符串中「最高」字母的第一個出現的索引)。這應該在DECLARE塊中完成。然後,我們還需要存儲「迄今爲止」找到的最高字母(以備將來比較)。

的代碼可能是這樣的:

declare 
x varchar2(10) :='ABFD'; 
ind number := 1; 
max_letter char(1) := substr(x, 1, 1); 
BEGIN 
FOR i in 2..length(x) LOOP 
    if substr(x, i, 1) > max_letter 
    then max_letter := substr(x, i, 1); 
     ind := i; 
    end if; 
END LOOP; 
dbms_output.put_line(ind); 
END; 
/

注意字母可以相互比較直接,沒有任何理由將它們轉換爲數字。

0

純SQL使用示範條款

with t(str) as 
(select 'ABVD' from dual 
union all select 'BCDG' from dual 
union all select 'CFDE' from dual) 
select str, instr(str, max_chr) ind 
from t 
model 
partition by (rownum rn) 
dimension by (1 dummy) 
measures (str, chr(1) max_chr) 
rules 
iterate (4e3) until (substr(str[1], iteration_number + 2, 1) is null) 
(max_chr[1] = greatest(max_chr[1], substr(str[1], iteration_number + 1, 1))); 

STR   IND 
---- ---------- 
ABVD   3 
BCDG   4 
CFDE   2