这里提一点关于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中并不是如此,对于判断只有true和false
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/