%rowtype和数组的基本记载

这里提一点关于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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25362835/viewspace-1056669/

你可能感兴趣的:(%rowtype和数组的基本记载)