讲函数之前,先介绍一下程序结构

3.程序结构

  新建一个测试窗口,举一个小例子

declare
-- 声明变量,包括游标
begin
-- 执行部分
dbms_output.put_line('hello world!'); --异常处理
end;

  变量声明时,类型可以用字段类型,也可以直接引用表的字段类型 

  举个小例子:

declare
-- 声明变量,包括游标
pagename varchar2(10);
lang1 langmap.lang1%type;
begin
-- 执行部分 select l.pagename, l.lang1
into pagename, lang1
from langmap l
where l.pagename = 'repair'
and l.msgid = '';
dbms_output.put_line('配置项目:' || pagename || ' 状态:' || lang1); --异常处理
end;

  或者直接引用表的行类型

  举个小例子:

declare
-- 声明变量,包括游标
v_langmap langmap%rowtype;
begin
-- 执行部分 select *
into v_langmap
from langmap l
where l.pagename = 'repair'
and l.msgid = '';
dbms_output.put_line('配置项目:' || v_langmap.pagename || ' 状态:' ||
v_langmap.lang1); --异常处理
end;

4.判断

begin
if 条件 then 内容 elsif 条件 then 内容 else 内容 end if;
end;

5.循环

begin
loop
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(''); --遍历游标
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
--这里可以声明变量
begin
dbms_output.put_line('hello world');
end kxy_Proc_hello;

  可在测试脚本中直接调用

begin
kxy_Proc_hello;
end;

  也可以在命令行中调用

exec kxy_Proc_hello;

  命令行有时候看不到结果,先执行

set serveroutput on

  2)带参无返回值

create or replace procedure kxy_Proc_GetTitle(i_no in tenantnotice.noticeno%type)
is
v_title tenantnotice.title%type;
begin
select 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)
is
begin
select t.title into o_title from tenantnotice t where t.noticeno=i_no;
end;

  调用

declare
v_title tenantnotice.title%type;
begin
kxy_proc_gettitle('', v_title);
-- kxy_proc_gettitle('',o_title => v_title);--这样写也可以
dbms_output.put_line(v_title);
end;

8.函数

  函数必须有返回值,可在sql语句中直接调用,可以不传参,也可以使用 in/out参数 输入输出

  1)无参

create or replace function kxy_Fun_hello
return varchar2
is
--这里可以声明变量
msg varchar2():= 'hello world';
begin
return msg;
end; select kxy_Fun_hello() from dual;

Oracle 自定义函数、存储过程的更多相关文章

  1. Oracle自定义函数和存储过程示例,自定义函数与存储过程区别

    参考资料:http://www.newbooks.com.cn/info/60861.html oracle自定义函数学习和连接运算符(||) 贴一段中文文档示例,应该就可以开始工作了: --过程(P ...

  2. Mybatis下配置调用Oracle自定义函数返回的游标结果集

    在ibatis和Mybatis对存储过程和函数函数的调用的配置Xml是不一样的,以下是针对Mybatis 3.2的环境进行操作的. 第一步配置Mapper的xml内容 <mapper names ...

  3. 【转】Oracle 自定义函数语法与实例

    原文地址:https://blog.csdn.net/libertine1993/article/details/47264211 Oracle自定义函数的语法如下: create or replac ...

  4. Oracle自定义函数1

    用户定义函数是存储在数据库中的代码块,可以把值返回到调用程序.调用时如同系统函数一样,如max(value)函数,其中,value被称为参数.函数参数有3种类型. IN 参数类型:表示输入给函数的参数 ...

  5. Oracle自定义函数

    核心提示:函数用于返回特定数据.执行时得找一个变量接收函数的返回值; 语法如下: create or replace function function_name ( argu1 [mode1] da ...

  6. 基本开题的感觉是了-MySQL继续继续(自定义函数&存储过程)

    hi 感觉论文开题基本确定了,凯森 1.MySQL -----自定义函数----- ----基本 两个必要条件:参数和返回值(两者没有必然联系,参数不一定有,返回一定有) 函数体:合法的SQL语句:以 ...

  7. Oracle自定义函数&加密

    在sql中频繁使用的功能(逻辑.加密等)可以写成自定义函数进行封装,之后再调用即可. CREATE OR REPLACE FUNCTION "函数名" (参数名 参数类型 参数数据 ...

  8. oracle自定义函数:将使用点分隔符的编码转成层级码格式的编码

    维护一个旧的系统,表设计中只有编码,而没有其他排序相关的字段,然后根据编码排序出现了顺序错乱的问题. 详细地说,其编码设计是使用[.]分隔符的编码,比如1.1.1.1.1.1.1.1.1.2这样的格式 ...

  9. Oracle 自定义函数实现列转行效果

    在 Oracle 领域,我相信一说到列转行大部分人都会立马想到 WM_CONCAT 函数,我觉得主要是因为该函数比较实用.但事实上 WM_CONCAT 并非官方公开函数,使用会存在一定的风险:函数返回 ...

  10. sqlserver中自定义函数+存储过程实现批量删除

    由于项目的需要,很多模块都要实现批量删除的功能.为了方便模块的调用,把批量删除方法写成自定义函数.直接上代码. 自定义函数: ALTER FUNCTION [dbo].[func_SplitById] ...

随机推荐

  1. .NET CORE微服务中CONSUL的相关使用

    .NET CORE微服务中CONSUL的相关使用 1.consul在微服务中的作用 consul主要做三件事:1.提供服务到ip的注册 2.提供ip到服务地址的列表查询 3.对提供服务方做健康检查(定 ...

  2. AI GMM

    GMM(Gaussian Mixture Model,高斯混合模型)通常用于聚类(也用于密度估计),数据是由k个高斯分布生成,每个分布表示一个类. 期望最大(Expectation Maximizat ...

  3. AI 强化学习

    强化学习(reinforcement learning,简称RL), agent policy state action 目标  最大化累计reward 参考链接: https://en.wikipe ...

  4. 《通过C#学Proto.Actor模型》之Persistence

    Actor是有状态的,当每一步执行失败后,返回失败地方继续执行时,希望此时的状态是正确的,为了保证这一点,持久化就成了必要的环节了. Proto.Actor提供了三种方式执久化: Event Sour ...

  5. Windows技巧

    1 修改域名 像Linux的/etc/hosts一样,windows也有一个类似的hosts文件, C:/WINDOWS/system32/drivers/etc/hosts 添加如下域名与IP的映射 ...

  6. Web Storage和cookie

    Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生; Web Storage的概念和cookie相似,区别是它是为了更大容 ...

  7. Java面试准备之JVM

    介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明 程序计数器:看做当前线程所执行的字节码行号指示器.是线程私有的内存,且唯一一块不报OutOfMemoryError异常. Java虚拟 ...

  8. React 特性剪辑(版本 16.0 ~ 16.9)

    Before you're going to hate it, then you're going to love it. Concurrent Render(贯穿 16) 在 18年的 JSConf ...

  9. 【Android】pidcat 不显示日志输出

    问题: 直接安装了 pidcat :  brew install pidcat ,装完以后执行 pidcat <package name> ,发现没有日志输出,adb devices 也能 ...

  10. 微信公众号开发 [05] 微信支付功能开发(网页JSAPI调用)

    1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ...