%rowtype和陣列的基本記載

dotaddjj發表於2011-12-02

這裡提一點關於oracle開發上面的一點小知識細節,由於自己對於oracle開發上面相對於管理來說比較弱!不管是開發還是管理在日常管理中都是非常重要的!

SQL> desc jj_one;

Name Type Nullable Default Comments

---- --------- -------- ------- --------

ID NUMBER(5) Y

NAME CHAR(40) Y

SQL> declare

2 v_ab jj_one%rowtype;

3 begin

4 select * into v_ab from jj_one where rownum=1;

5 insert into jj_one values v_ab;

6 end;

7 /

定義定量的方式A%rowtype,這裡的A可以是表明 檢視或者遊標。同樣可以在後面的dml語句中引用v_ab。這裡還是要注意下select * into v_ab from jj_one where rownum=1;這裡一定要是一一對應,當然可以用遊標來獲取所有的行,然後把遊標的獲取值迴圈付給變數,做迴圈輸出。

SQL> declare

2 v_ab jj_one%rowtype;

3 cursor cur01 is select * from jj_one;

4 begin

5 for v_ab in cur01 loop

6 dbms_output.put_line(v_ab.id||v_ab.name);

7 end loop;

8 end;

9 /

此時用遊標獲取所有的結果,然後遊標for迴圈賦值給變數v_ab

SQL> declare

2 v_ab jj_one%rowtype;

3 begin

4 select * into v_ab from jj_one where rownum=1;

5 update jj_one set row=v_ab where id=2;

6 end;

7 /

上面的一個update也是利用變數v_ab直接賦值給row也就是jj_one的一行。

遊標的相關屬性:

遊標的宣告開啟以及管理都是oracle自動完成的,而相應的屬性有:

sql%rowcount:返回最近一條sql語句執行以後所影響的記錄條數

Sql%found:遊標指向的記錄是否存在,ture or false

sql%notfound:同上

sql%isopen:遊標是否開啟,true or false

而如果是顯示遊標只需要把上述的sql改成相應的顯示遊標名即可。可以根據遊標的屬性來調控pl/sql程式塊的執行,既然這裡說到了遊標的屬性名判斷,這裡個人有個小測試,由於以前學c++c時記得對於非0則為真,0則為假,但是oracle中並不是如此,對於判斷只有truefalse

SQL> declare

2 begin

3 if true then

4 dbms_output.put_line('true');

5 end if;

6 end;

7 /

true

PL/SQL procedure successfully completed

SQL> declare

2 begin

3 if -1 then

4 dbms_output.put_line('AM');

5 end if;

6 end;

7 /

declare

begin

if -1 then

dbms_output.put_line('AM');

end if;

end;

ORA-06550: 4 , 4 :

PLS-00382: 表示式型別錯誤

ORA-06550: 4 , 1 :

PL/SQL: Statement ignored

可以看出oracle對於pl/sql塊的解析出現了語義錯誤,oracle中並不存在c++等程式設計語言中bool型和number型的轉換。

這裡繼續來說一下關於oracle的陣列一些基本知識

SQL> declare

2 type v_ab_varray is varray(5) of number;

3 v_ab v_ab_varray;

4 begin

5 v_ab:=v_ab_varray(1,2,3,4,5);

6 for i in 1..v_ab.count loop

7 dbms_output.put_line(i);

8 end loop;

9 end;

10 /

1

2

3

4

5

上面先定義陣列型別v_ab_varray,然後定義此型別的一個陣列變數v_ab,其中的v_ab.count是這個陣列內的總數.

除了上述的陣列型別varray,還可以定義索引表和巢狀表實現陣列功能。

SQL> declare

2 type v_ab_tab is table of jj_one%rowtype index by binary_integer;

3 v_ab v_ab_tab;

4 begin

5 select * bulk collect into v_ab from jj_one;

6 for i in 1..v_ab.count loop

7 dbms_output.put_line(v_ab(i).id||' '||v_ab(i).name);

8 end loop;

9 end;

10 /

1 as

2 ad

1 as

其中的type v_ab_tab is table of jj_one%rowtype index by binary_integer定義一個表型別v_ab_tab,對於後面的index by binary_integer自己也不理解,e文的解釋是下標自增長,不需要每次插入資料初始化,每次extend增加一個空間。(有點難以理解)

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1056669/,如需轉載,請註明出處,否則將追究法律責任。

相關文章