ORACLE RETU讴歌MDXNING 用法总计

回去结果1000

那此中作者有问号,重临游标的话这怎么调用里面包车型大巴值吗,大家帮笔者思忖,不会用哦

create
or replace type t_test_table as table of t_test;

概述

    rowcnt integer;

        定义函数(此函数完成字符串拆分成效State of Qatar:
           

/*

总结

Oracle Returning语句随气象区别,语法有浮动,要留意动态sql returning多行的情景不能够应用record只好采纳table类型。

get diagnostics cnt := row_count;

Oracle中函数/过程回到结果集的二种情势:
    以函数return为例,存款和储蓄进度只需改为out参数就能够,在oracle 10g测量检验通过.
    (1) 返回游标:
        return的类型为:SYS_REFCURSOR
        之后在IS里面定义变量:curr SYS_REFCURSOR;
        最后在函数体中写:
        open cur for
            select ……;
        return cur;
        例:
       

–方法一:
declare  
  i integer ; 
  rec_coverage_new
gums_package_underwriting.salary_changed_tab;–table类型 
begin 
       rec_coverage_new :=
gums_package_underwriting.get_salary_changed_info(‘PA01000002608233’); 
 
       i := rec_coverage_new.first; 
       loop 
                  exit  when i is null; 
       dbms_output.put_line(i);          
       i := rec_coverage_new.next(i);        
       end loop;      
end; 

使用TABLE类型

举例:

declare

type
v_tp_tab_empno is table of hh_emp_test.empno%type index by
pls_integer;

v_tab_empno
v_tp_tab_empno;

type
v_tp_tab_ename is table of hh_emp_test.ename%type index by
pls_integer;

v_tab_ename
v_tp_tab_ename;

begin

update
hh_emp_test set ename=’test’ where deptno=10 returning empno,ename
bulk collect into v_tab_empno,v_tab_ename;

rollback;

for i in
1..v_tab_empno.count loop

dbms_output.put_line(v_tab_empno(i)||’-‘||v_tab_ename(i));

end loop;

end;

输出:

7782-test

7839-test

7934-test

注意:

  1. 多行returning须用bulk collect into

end;

图片 1  CREATEORREPLACE
TYPE “SPLIT_TAB” ASTABLEof
split_arr;

 

Dml改良单行+动态sql

示例:

declare

v_empno
hh_emp_test.empno%type;

v_ename
hh_emp_test.ename%type;

begin

execute
immediate ‘update hh_emp_test set ename=”test” where empno=:empno
returning empno,ename into :v_empno,:v_ename’

using 7369

returning into
v_empno, v_ename;

rollback;

dbms_output.put_line(v_empno || ‘-‘ || v_ename);

end;

输出:

7369-test

注意:

  1. returning into在动态sql内部和外围都要写,且外面包车型地铁returning后边不加字段间接into。

  2. using在returning前面

  3. into前面变量名不定点,注意冒号(:卡塔尔,可以是命名法规下的随机字符。

    insert into tab2 select * from tab1;

    (2)返回table类型的结果集:
        首先定义三个行类型:
           

–方法三:
declare  
  i integer ; 
  rec_coverage_new
gums_package_underwriting.salary_changed_tab;–table类型 
begin 
       rec_coverage_new :=
gums_package_underwriting.get_salary_changed_info(‘PA01000002608233’); 
       i := rec_coverage_new.first ; 
 
       while i<= rec_coverage_new.last loop 
           –从1开始 
           dbms_output.put_line(i);  
           –i :=i+1;   
           i := rec_coverage_new.next(i);   
       end loop;       
end; 

forall中的returning

ALTER FUNCTION test_fun()

图片 2cursor
strcur is
图片 3                         select
nowStr fromTable(GetSubStr(‘111,222,333,,,’,’,’));

create
table test (id varchar2(20));
insert
into test values(‘1’);
commit;
explain
plan for select * from test;
select
* from
table(dbms_xplan.display);

使用TABLE类型

示例:

declare

type
v_tp_tab_empno is table of hh_emp_test.empno%type index by
pls_integer;

v_tab_empno
v_tp_tab_empno;

type
v_tp_tab_ename is table of hh_emp_test.ename%type index by
pls_integer;

v_tab_ename
v_tp_tab_ename;

begin

execute
immediate ‘update hh_emp_test set ename=”test” where deptno=:deptno
returning empno,ename into :v_tab_empno,:v_tab_ename’

using 10

returning bulk
collect

into
v_tab_empno, v_tab_ename;

rollback;

for i in 1 ..
v_tab_empno.count loop

dbms_output.put_line(v_tab_empno(i) || ‘-‘ || v_tab_ename(i));

end loop;

end;

输出:

7782-test

7839-test

7934-test

注意:

  1. 动态sql内部依然是returning into并不是returning bulk collect into

  2. returning bulk collect into要写在外侧,且前边相仿不能够是record

    return rowcnt;

图片 4CREATEORREPLACEFUNCTION
GetSubStr(
图片 5                   strinvarchar2, –待分割的字符串
图片 6                    splitchar invarchar2–分割标记
图片 7             )
图片 8            return
split_tab
图片 9            IS
图片 10               restStr
varchar2(贰零零贰卡塔尔国 default
GetSubStr.str;–剩余的字符串
图片 11               thisStr varchar2(18卡塔尔国;–获得的日前字符串
图片 12               indexStr int;–有的时候存放分隔符在字符串中之处
图片 13             
图片 14               v split_tab
:= split_tab(); —回去结果
图片 15
图片 16            begin
图片 17                 
dbms_output.put_line(restStr);
图片 18                 while
length(restStr) !=0
图片 19                    LOOP
图片 20                     <<top>>
图片 21                     
indexStr := instr(restStr,splitchar卡塔尔国; –从子串中取分隔符的第三个职分
图片 22
图片 23                     if indexStr
=0and
length(restStr) !=0  then–在剩下的串中找不到分隔符
图片 24                        begin
图片 25                          
v.extend;
图片 26                          
v(v.count) :=
split_arr(Reststr);
图片 27                          return v;
图片 28                        end;
图片 29                     endif;
图片 30                    
图片 31                     if indexStr
=1then—第三个字符便为分隔符,那时候去掉分隔符
图片 32                        begin
图片 33                             
restStr := substr(restStr,2);
图片 34                             goto   top;
图片 35                        end;
图片 36                     endif;
图片 37                    
图片 38                     if
length(restStr) =0or restStr
isnullthen
图片 39                        return v;
图片 40                     endif;
图片 41                   
图片 42                     
v.extend;
图片 43                     
thisStr := substr(restStr,1,indexStr -1卡塔尔; –取妥帖前的字符串
图片 44                      restStr :=
substr(restStr,indexStr +1卡塔尔国;—取剩余的字符串
图片 45
图片 46                     
v(v.count) :=
split_arr(thisStr);
图片 47                   END LOOP;
图片 48                 return v;
图片 49            end;

select
* from table(f_test_array(10));

dml纠正单行数据

动用方法见概述,此部分较简单,略。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图