Oralce存储过程:

1.整体结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN

END 存储过程名字

2.SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN
SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;
...

3.IF 判断
IF V_TEST=1 THEN
BEGIN
do something
END;
END IF;

4.while 循环
WHILE V_TEST=1 LOOP
BEGIN
XXXX
END;
END LOOP;

5.变量赋值
V_TEST := 123;

6.用for in 使用cursor

...
IS
CURSOR cur IS SELECT * FROM xxx;
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result.列名1+cur_result.列名2
END;
END LOOP;
END;

7.带参数的cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
OPEN C_USER(变量值);
LOOP
FETCH C_USER INTO V_NAME;
EXIT FETCH C_USER%NOTFOUND;
do something
END LOOP;
CLOSE C_USER;

8.用pl/sql developer debug
连接数据库后建立一个Test WINDOW
在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试

关于oracle存储过程的若干问题备忘

1.在oracle中,数据表别名不能加as,如:

select a.appname from appinfo a;-- 正确
select a.appname from appinfo as a;--错误

也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧

2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。

select af.keynode into kn from APPFOUNDATION af where af.appid=aid and af.foundationid=fid;-- 有into,正确编译
select af.keynode from APPFOUNDATION af where af.appid=aidand af.foundationid=fid;-- 没有into,编译报错,提示:Compilation
Error: PLS-00428: anINTO clauseis expectedin thisSELECT statement

3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。

可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...

4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错

select keynode into knfrom APPFOUNDATIONwhere appid=aidand foundationid=fid;-- 正确运行
select af.keynode into kn from APPFOUNDATION af where af.appid=appidandaf.foundationid=foundationid;-- 运行阶段报错,提示
ORA-01422:exactfetchreturns more than requestednumberof rows

5.在存储过程中,关于出现null的问题

假设有一个表A,定义如下:

create table A(
id varchar2(50)primarykey not null,
vcount number(8)notnull,
bid varchar2(50)notnull -- 外键
);

如果在存储过程中,使用如下语句:

select sum(vcount) into fcount from A where bid='xxxxxx';

如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:

if fcount isnull then
fcount:=0;
end if;

这样就一切ok了。

6.Hibernate调用oracle存储过程

this.pnumberManager.getHibernateTemplate().execute(
new HibernateCallback() ...{
public Object doInHibernate(Session session)
throws HibernateException, SQLException ...{
CallableStatement cs = session
.connection()
.prepareCall("{call modifyapppnumber_remain(?)}");
cs.setString(1, foundationid);
cs.execute();
return null;
}
});

例子:

create or replace procedure P_SMS_SENDINFOTOUSER(V_RESULTCODE OUT NUMBER,
V_RESULTINFO OUT VARCHAR2) IS
TYPE T_CURSOR IS REF CURSOR;
IV_NOTICE_CONTENT TI_O_SMS.NOTICE_CONTENT%TYPE; --短信内容
IV_EPARCHY_CODE   TF_F_USER.EPARCHY_CODE%TYPE; --地市编码
--定制生效的SP产品
IV_CURSOR        T_CURSOR;
IV_SERIAL_NUMBER TF_F_USER_SP.SERIAL_NUMBER%TYPE; --手机号码
IV_USER_ID         TF_F_USER_SP.USER_ID%TYPE; --用户标识
IV_SP_ID           TF_F_USER_SP.SP_ID%TYPE;
IV_SP_PRODUCT_ID   TD_B_PARTY_PRODUCT.SP_PRODUCT_ID%TYPE;
IV_SP_PRODUCT_NAME TD_B_PARTY_PRODUCT.SP_PRODUCT_NAME%TYPE; -- SP名称
IV_USER_SP_ALL     VARCHAR2(500); --用户所有的SP
IV_COUNT           NUMBER(4);
IV_PRICE           VARCHAR(20); --价格
IV_USE_COUNT       NUMBER(10); --记录用户个数
IV_CU_COUNT        NUMBER(10); --记录游标存储记录数
IV_IS_HAS_M        NUMBER(1);--产品费用中是否含有M  0:表示不含有 1反之
IV_SERIAL_NUMBER_TEMP TF_F_USER_SP.SERIAL_NUMBER%TYPE;
IV_USER_ID_TEMP       TF_F_USER_SP.USER_ID%TYPE;
BEGIN
V_RESULTCODE    := -1;
V_RESULTINFO    := 0;
IV_EPARCHY_CODE := '';
BEGIN
IV_SERIAL_NUMBER_TEMP := '-1';
IV_USER_ID_TEMP       := '';
IV_USER_SP_ALL        := '';
IV_COUNT              := 0;
IV_PRICE              := '0';
IV_USE_COUNT          := 0;
IV_CU_COUNT           := 0;
IV_IS_HAS_M           := 0;
INSERT INTO ucr_crm1.fx_TEMP_TF_F_USER_SP_20130420
SELECT A.SERIAL_NUMBER,
A.USER_ID,
(SELECT B.EPARCHY_CODE
FROM TF_F_USER B
WHERE B.SERIAL_NUMBER = A.SERIAL_NUMBER
AND B.EPARCHY_CODE IS NOT NULL
AND ROWNUM = 1) EPARCHY_CODE,
A.SP_ID,
A.SP_PRODUCT_ID
FROM TF_F_USER_SP A, TD_B_PARTY_PRICE C
WHERE A.SP_PRODUCT_ID = C.PRODUCTCODE
AND C.BILLINGMODECODE = 'OrderMonth'
AND (SELECT B.EPARCHY_CODE
FROM TF_F_USER B
WHERE B.SERIAL_NUMBER = A.SERIAL_NUMBER
AND ROWNUM = 1
AND B.EPARCHY_CODE IS NOT NULL
AND B.REMOVE_TAG = 0) = '0853'
AND A.START_DATE < SYSDATE
AND A.END_DATE > SYSDATE;
COMMIT;
OPEN IV_CURSOR FOR
SELECT A.SERIAL_NUMBER,
A.USER_ID,
A.EPARCHY_CODE,
A.SP_ID,
A.SP_PRODUCT_ID
FROM ucr_crm1.fx_TEMP_TF_F_USER_SP_20130420 A
ORDER BY A.SERIAL_NUMBER;
LOOP
FETCH IV_CURSOR
INTO IV_SERIAL_NUMBER,
IV_USER_ID,
IV_EPARCHY_CODE,
IV_SP_ID,
IV_SP_PRODUCT_ID;
IF IV_CURSOR%NOTFOUND THEN
--IV_CU_COUNT := IV_CURSOR%ROWCOUNT;
IV_SERIAL_NUMBER := '0';
END IF;
IF IV_EPARCHY_CODE IS NULL THEN
IV_EPARCHY_CODE := 'ZZZZ';
END IF;
IF (IV_SERIAL_NUMBER_TEMP <> IV_SERIAL_NUMBER AND
IV_SERIAL_NUMBER_TEMP <> '-1') OR LENGTHB(IV_USER_SP_ALL)>=400 THEN
BEGIN
-- 先发送上一个用户的短信。
IV_NOTICE_CONTENT := '温馨提示:您当月已订购以下增值产品:' || IV_USER_SP_ALL ||
'您可拨打10010查询和退订。';
INSERT INTO TI_O_SMS
(SMS_NOTICE_ID,
EPARCHY_CODE,
IN_MODE_CODE,
SMS_CHANNEL_CODE,
RECV_OBJECT_TYPE,
RECV_OBJECT,
ID,
SMS_TYPE_CODE,
SMS_KIND_CODE,
NOTICE_CONTENT_TYPE,
NOTICE_CONTENT,
FORCE_REFER_COUNT,
SMS_PRIORITY,
REFER_TIME,
REFER_STAFF_ID,
REFER_DEPART_ID,
DEAL_TIME,
DEAL_STATE,
REMARK,
SEND_TIME_CODE,
SEND_OBJECT_CODE)
SELECT TO_NUMBER(F_SYS_GETSEQID(IV_EPARCHY_CODE,
'seq_smssend_id')),
IV_EPARCHY_CODE,
'0',
'11', --短信渠道编码:客户服务
'00', --被叫对象类型:00-手机号码
IV_SERIAL_NUMBER_TEMP, --被叫对象:传手机号码
NVL(TO_NUMBER(IV_USER_ID_TEMP), 0), --被叫对象标识:传用户标识
'20', --短信类型:20-业务通知
'11', --短信种类:02-短信通知
'0', --短信内容类型:0-指定内容发送
IV_NOTICE_CONTENT, --短信内容
1, --指定发送次数
50, --短信优先级
SYSDATE, --提交时间
'',
'',
SYSDATE, --处理时间
'0', --处理状态:0-未处理
'定制业务信息的短信提醒', --备注
'2',
1
FROM DUAL;
V_RESULTINFO := '成功插入短信接口表';
COMMIT;
IV_USER_SP_ALL := '';
IV_COUNT       := 0;
END;
END IF;
EXIT WHEN IV_CURSOR%NOTFOUND;
SELECT DISTINCT A.SP_PRODUCT_NAME
INTO IV_SP_PRODUCT_NAME
FROM TD_B_PARTY_PRODUCT A
WHERE A.SP_ID = IV_SP_ID
AND A.SP_PRODUCT_ID = IV_SP_PRODUCT_ID;
SELECT DECODE(DATA_TYPE,'NUMBER',to_char(FEE/100,'FM9999999999990.90')||'元/月',fee||'元/月') PRICE
INTO IV_PRICE
FROM (SELECT   a.productcode,a.productname,
nvl2(translate(SUBSTR(a.paravalue,5,INSTR(A.PARAVALUE,';')-5), '\1234567890', '\'), 'CHAR', 'NUMBER') DATA_TYPE,
CASE WHEN nvl2(translate(SUBSTR(a.paravalue,5,INSTR(A.PARAVALUE,';')-5), '\1234567890', '\'), 'CHAR', 'NUMBER') ='CHAR'
THEN SUBSTR(SUBSTR(a.paravalue,5,INSTR(A.PARAVALUE,';')-5),1,REGEXP_INSTR(SUBSTR(a.paravalue,5,INSTR(A.PARAVALUE,';')-5),'[^0-9]')-1)
ELSE TO_CHAR(NVL(SUBSTR(a.paravalue,5,INSTR(A.PARAVALUE,';')-5),0))  END  FEE
FROM td_b_party_price a WHERE a.productcode = IV_SP_PRODUCT_ID AND a.billingmodecode ='OrderMonth'
) T;
IF IV_COUNT = 0 THEN
IV_USER_SP_ALL := IV_SP_PRODUCT_NAME || '业务、资费' || IV_PRICE ||
';';
ELSE
IV_USER_SP_ALL := IV_USER_SP_ALL || ' ' || IV_SP_PRODUCT_NAME ||
'业务、资费' || IV_PRICE || ';';
END IF;
IV_COUNT     := IV_COUNT + 1;
IV_USE_COUNT := IV_USE_COUNT + 1;
--IF IV_USE_Count = IV_CU_COUNT THEN
--IV_SERIAL_NUMBER_TEMP := '0';
--ELSE
IV_SERIAL_NUMBER_TEMP := IV_SERIAL_NUMBER;
--END IF;
--IV_SERIAL_NUMBER_TEMP := IV_SERIAL_NUMBER;
IV_USER_ID_TEMP := IV_USER_ID;
END LOOP;
CLOSE IV_CURSOR;
DELETE ucr_crm1.fx_TEMP_TF_F_USER_SP_20130420;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
V_RESULTINFO := '定制生效的套餐发短信提醒报错:' || SQLERRM;
V_RESULTCODE := -1;
END;
V_RESULTCODE := 0;
V_RESULTINFO := 'trade OK!';
end P_SMS_SENDINFOTOUSER;
/

Oralce存储过程相关推荐

  1. oralce 存储过程、函数和触发器

    一.存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 创建存储过程 用CREATE PROCEDURE命令建立存储过程. 语法: create [or replac ...

  2. oracle修改字段名称 试图删除被依赖列_oracle 添加 删除列 修改表名字 ;加注释 异常解释...

    desc xujin; alter table xujin add 字段名 字段类型: alter table xujin modify cloumn 列名字 列类型:修改列名 ,列类型 alter ...

  3. Oralce数据库之存储过程、存储函数、触发器和数据字典

    Oracle数据库总结 Oracle数据库之集合运算 Oracle数据库之数据处理 Oracle数据库之建表和管理表 Oracle数据库之对象视图.索引.序列.同义词 一.存储过程和存储函数 1.概念 ...

  4. oralce用存储过程实现分页 以及 用java调用这个存储过程的代码

    1  PL SQL  创建一个包 2 PL SQL 存储过程分页第一张图 3 PL SQL 存储过程分页第二张图 4 java 调用存储过程第一张图 5 java 调用存储过程 第二张图

  5. oralce之存储过程

    一:--循环向表emp中插入数据 1 declare 2 maxnumber number:=10000; 3 v_count number; 4 begin 5 v_count :=0; 6 FOR ...

  6. Ibatis调用Oracle存储过程,以及返回Cursor结果集的问题

    最近开始接触Oracle了,接触的越多越感受到自己的渺小!(oracle10g ,Ibatis) 昨天需要通过数据库查询一组数据,数据中包含一个表中的一条数据.2个String类型的字符串,想通过Or ...

  7. 利用Java存储过程简化数据库操作

       利用Java存储过程沟通SQL.XML.Java.J2EE和Web服务. 存储过程(stored procedure)允许将运行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分离开来. ...

  8. Oracle --存储过程,输入不定个数参数

    2019独角兽企业重金招聘Python工程师标准>>> 一般来说,写存储过程时,输入的参数个数是固定的,但最近业务需求,输入的参数不固定. 思路:oracle存储过程的输入参数个数. ...

  9. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

最新文章

  1. 求n!中含有质因子p的个数
  2. 如何从失焦的图像中恢复景深并将图像变清晰?
  3. HDU 3033 I love sneakers! (分组背包变形)
  4. oracle 库存管理系统,库存管理系统
  5. python eureka服务发现_Spring Cloud版——电影售票系统—Eureka微服务注册与发现
  6. python lambda表达式及用法_python lambda表达式简单用法
  7. Android开发笔记(五十一)通过Messenger实现进程间通信
  8. iOS使用Instruments的工具
  9. 计算机的典型网络地址 特殊0.0.0.0 本机127.0.0.1 内网192.168.xxx.xxx 172.xxx.xxx.xxx 10.xxx.xxx.xxx 外网
  10. 邻接矩阵实现无向图的创建并根据louvain算法实现分区
  11. SPSS基础教程—怎样对数据进行综合评价排名
  12. 电子电路基础——知识点(下篇)
  13. 关于营销自动化,30个惊人的事实
  14. RPA机器人技术一般用于什么行业?
  15. 2022年9月电子学会Python等级考试试卷(二级)答案解析
  16. 拼多多校招-----六一儿童节(python)
  17. Android禁止EditText弹出输入法
  18. Flink 使用Table Api 读取文件数据并写出到文件中
  19. 简述几种常用的编码器数据格式
  20. 一年卖出20.4亿颗图像传感器,这家公司上市首日股价大涨145%

热门文章

  1. jdk1.8,64位linux版本下载路径.永久免费.这是一个爱分享的世界...
  2. 认认真真做事,勤勤恳恳做人
  3. Java数据结构——直接插入排序+希尔排序+冒泡排序
  4. 2022全国大学生物联网设计竞赛火热开启,限量礼品等你来拿
  5. 第一次使用acme.sh 手动生成证书(DNS手动模式)
  6. Ubuntu 命令大全 Ubuntu技巧 (转)
  7. 倍福--两台TwinCAT3之间做Ethernet IP通信
  8. 自考计算机应用技术题,4月全国自考计算机应用技术试题及答案解析
  9. 大工19春计算机文化基础 在线测试,大工19春《计算机文化基础》在线测试123满分答案...
  10. VSCode调试代码的三种方式