讲函数之前,先介绍一下程序结构
3.程序结构
新建一个测试窗口,举一个小例子
declare-- 声明变量,包括游标begin-- 执行部分dbms_output.put_line('hello world!');--异常处理end;
变量声明时,类型可以用字段类型,也可以直接引用表的字段类型
举个小例子:
declare-- 声明变量,包括游标pagename varchar2(10);lang1 langmap.lang1%type;begin-- 执行部分select l.pagename, l.lang1into pagename, lang1from langmap lwhere l.pagename = 'repair'and l.msgid = '10';dbms_output.put_line('配置项目:' || pagename || ' 状态:' || lang1);--异常处理end;
或者直接引用表的行类型
举个小例子:
declare-- 声明变量,包括游标v_langmap langmap%rowtype;begin-- 执行部分select *into v_langmapfrom langmap lwhere l.pagename = 'repair'and l.msgid = '10';dbms_output.put_line('配置项目:' || v_langmap.pagename || ' 状态:' ||v_langmap.lang1);--异常处理end;
4.判断
beginif 条件 then 内容elsif 条件 then 内容else 内容end if;end;
5.循环
beginloop exit when 条件--语法部分 end loop;end;
6.游标
不带参
declare cursor c_notice is select t.noticeno,t.title from tenantnotice t;v_no tenantnotice.noticeno%type;v_title tenantnotice.title%type;begin--打开游标open c_notice;--遍历游标loop fetch c_notice into v_no,v_title;exit when c_notice%notfound;dbms_output.put_line('编号:'|| v_no||',标题:'|| v_title);end loop;--关闭游标close c_notice;end;
带参
declare cursor c_notice(v_noticeno tenantnotice.noticeno%type)is select t.noticeno,t.title from tenantnotice t where t.noticeno=v_noticeno;v_no tenantnotice.noticeno%type;v_title tenantnotice.title%type;begin--打开游标open c_notice('11290014');--遍历游标loop fetch c_notice into v_no,v_title;exit when c_notice%notfound;dbms_output.put_line('编号:'|| v_no||',标题:'|| v_title);end loop;--关闭游标close c_notice;end;
select into 是隐式游标,只能返回一行(存储过程输出值)
7.存储过程
存储过程没有declare,变量直接在is(或者as,相同的效果)和begin之间声明就行
1)无参无返回值
create or replace procedure kxy_Proc_hello is
--这里可以声明变量
begindbms_output.put_line('hello world');end kxy_Proc_hello;
可在测试脚本中直接调用
beginkxy_Proc_hello;end;
也可以在命令行中调用
exec kxy_Proc_hello;
命令行有时候看不到结果,先执行
set serveroutput on
2)带参无返回值
create or replace procedure kxy_Proc_GetTitle(i_no in tenantnotice.noticeno%type)isv_title tenantnotice.title%type;beginselect t.title into v_title from tenantnotice t where t.noticeno=i_no;dbms_output.put_line(v_title);end;
3)无参有返回值
4)带参有返回值
create or replace procedure kxy_Proc_GetTitle(i_no in tenantnotice.noticeno%type,o_title out tenantnotice.title%type)isbeginselect t.title into o_title from tenantnotice t where t.noticeno=i_no;end;
调用
declare v_title tenantnotice.title%type;beginkxy_proc_gettitle('11290014', v_title);-- kxy_proc_gettitle('11290014',o_title => v_title);--这样写也可以dbms_output.put_line(v_title);end;
8.函数
函数必须有返回值,可在sql语句中直接调用,可以不传参,也可以使用 in/out参数 输入输出
1)无参
create or replace function kxy_Fun_helloreturn varchar2is--这里可以声明变量msg varchar2(50):= 'hello world';beginreturn msg;end;
select kxy_Fun_hello() from dual;