2014-03-28 16 views
0

我對SQL比較陌生。 我想通過這個代碼打印一個簡單的模式錯誤:引用計數器作爲分配的目標 - PL/SQL

declare 
    n number(2):=5; 
    temp number(2):=n; 
begin 
    for a in 1..5 
     a:=a+1;loop 
     for b in 1..temp loop 
      b:=b+1; 
      dbms_output.put_line(' '); 
      temp:=temp-1; 
     end loop; 
    for c in 1..2*a-1 loop 
    c:=c+1; 
    dbms_output.put_line('*'); 
end loop; 
end loop; 
end; 
/

我不斷收到此錯誤:

PLS-00103: Encountered the symbol "A" when expecting one of the following: 
* & - +/at loop mod remainder rem <an exponent (**)> || 
multiset 

我理解Oracle不允許引用計數器作爲賦值的目標這就是爲什麼我不斷收到第6行的錯誤,但是我甚至無法通過聲明另一個全局變量並將增量語句分配給它,但它也不起作用。 請幫忙。 謝謝!

+0

你想輸出什麼? – tbone

+0

你的循環中不需要a:= a + 1或b:= b + 1,a和be在到達循環結束關鍵字時會自動遞增。 – StephaneM

+0

我正在嘗試打印Pascal的三角形 –

回答

3

修改以前的答案實際上給你楊輝三角,你提到你的評論正在嘗試:

set serveroutput on format wrapped 
declare 
    n number(2):=5; 
begin 
    for a in 1..n loop 
    for b in 1..n-a loop 
     dbms_output.put(' '); 
    end loop; 
    for c in 1..2*a-1 loop 
     dbms_output.put('*'); 
    end loop; 
    dbms_output.new_line; 
    end loop; 
end; 
/

    * 
    *** 
    ***** 
******* 
********* 

PL/SQL procedure successfully completed. 

雙方你來只是dbms_output.put需要dbms_output.put_line電話,因爲這是每個*打印在一條線上。但是每次在a循環後都需要換行,所以我在最後添加了一個dbms_output.newline。您還在b循環內遞減temp,這意味着第二次圍繞a循環它是零而不是(n-1);但是您根本不需要單獨的temp變量,因爲它總是與(n-a)+1相同,而+1只是在每行上放置了額外的空間。 (我也做了a循環1..n,因爲我認爲你以後只能在一個地方更改n的值)。隨着n := 8

 * 
     *** 
    ***** 
    ******* 
    ********* 
    *********** 
************* 
*************** 

重要的是,雖然你也有set serveroutput on format wrapped,否則你在b迴路產生的前導空格被丟棄。

你也可以做到這一點在普通的SQL,但你需要提供5兩次,或使用綁定或替代變量:

select lpad(' ', 5 - level, ' ') || rpad('*', (level * 2) - 1, '*') as pascal 
from dual 
connect by level <= 5 

PASCAL 
------------------------------ 
    * 
    *** 
    ***** 
******* 
********* 

bc循環只是在做手工lpad真的。

+0

這實際上有幫助,亞歷克斯。我很感激。代碼工作正常。 –

+0

我想知道,在處理哪一個會更快執行?或者如果有人知道如何找出查詢或PL/SQL塊的執行時間。 –

+0

@RaviTiwari - 您可以在SQL * Plus或SQL Developer工作表中設置計時。 SQL通常比PL/SQL更快,但在這裏很難看出它的區別。 –

1

當我在編輯器中取得代碼時,我首先注意到,在啓動循環之前,您嘗試增加a,Oracle在此時發出第一個錯誤。而且它也不允許你在for循環中增加counter變量(我不知道爲什麼),我在網上查了一下,發現你不能爲Oracle for循環設置遞增步長,也不能爲counter設置一個值變量for循環。

下面的代碼工作正常,我:

declare 
    n number(2):=5; 
    temp number(2):=n; 
begin 
    for a in 1..5 
    loop --a:=a+1; 
     for b in 1..temp loop 
      --b:=b+1; 
      dbms_output.put_line(' '); 
      temp:=temp-1; 
     end loop; 
    for c in 1..2*a-1 loop 
    --c:=c+1; 
    dbms_output.put_line('*'); 
end loop; 
end loop; 
end; 
/
+0

不起作用。它在*上顯示行。 –

1

由於StephaneM說,循環變量由循環本身遞增:你不需要做a := a + 1,最重要的是,你不能分配他們!這裏是一個修正版本:

declare 
    n number(2):=5; 
    temp number(2):=n; 
begin 
    for a in 1..5 
    loop 
    for b in 1..temp loop 
     dbms_output.put_line(' '); 
     temp:=temp-1; 
    end loop; 
    for c in 1..2*a-1 loop 
     dbms_output.put_line('*'); 
    end loop; 
    end loop; 
end; 
/
+0

它不給我慾望的輸出。也許我的代碼有缺陷?編輯:我試圖打印帕斯卡的三角 –