Oracle创建存储过程在实际中的应用比例还是占为多数的,如果你对Oracle创建存储过程的简单方法的技术,心存好奇的话,以下的文章将会揭开它的神秘面纱。希望会给你带来一些帮助在此方面。
连接到:
警告: 创建的过程带有编译错误。
警告: 创建的过程带有编译错误。
警告: 创建的过程带有编译错误。
警告:Oracle创建存储过程会带有编译错误。
PROCEDURE GET_NEWS 出现错误:
4/1 PLS-00428: 在此 SELECT 语句中缺少 INTO 子句
过程已创建。
警告: 创建的过程带有编译错误。
PROCEDURE GET_NEWS 出现错误:
6/1 PLS-00201: 必须说明标识符 ‘DBMS_OUTPUB.PUT_LINE’
过程已创建
【编辑推荐】
1.创建一个存储过程,
CREATE PROCEDURE PRO_XSTJ AS select 系部编号, sum(case when sex=男 then 1 else 0 end)as 男生人数, sum(case when sex=女 then 1 else 0 end)as 女生人数 from 表名group by 系部编号
oracle数据库的游标和存储过程怎么写?
--创建存储过程CREATE OR REPLACE PROCEDURE xxxxxxxxxxx_p(--参数IN表示输入参数,OUT表示输入参数,类型可以使用任意Oracle中的合法类型。 is_ymIN CHAR)AS--定义变量vs_msg VARCHAR2(4000); --错误信息变量vs_ym_begCHAR(6);--起始月份vs_ym_endCHAR(6);--终止月份vs_ym_sn_beg CHAR(6); --同期起始月份vs_ym_sn_end CHAR(6); --同期终止月份--定义游标(简单的说就是一个可以遍历的结果集)CURSOR cur_1 ISSELECT area_code,CMCODE,SUM(rmb_amt)/ rmb_amt_sn,SUM(usd_amt)/ usd_amt_snFROM BGD_AREA_CM_M_BASE_T WHERE ym >= vs_ym_sn_beg AND ym <= vs_ym_sn_endGROUP BY area_code,CMCODE;BEGIN--用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_DATE 等很常用的函数。 vs_ym_beg := SUBSTR(is_ym,1,6);vs_ym_end := SUBSTR(is_ym,7,6);vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,yyyymm), -12),yyyymm);vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,yyyymm), -12),yyyymm);--先删除表中特定条件的数据。 DELETE FROM xxxxxxxxxxx_T WHERE ym = is_ym; --然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcountDBMS__line(del上月记录=||SQL%rowcount||条);INSERT INTO xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/,SUM(usd_amt)/FROM BGD_AREA_CM_M_BASE_T WHERE ym >= vs_ym_beg AND ym <= vs_ym_endGROUP BY area_code,CMCODE;DBMS__line(ins当月记录=||SQL%rowcount||条);--遍历游标处理后更新到表。 遍历游标有几种方法,用for语句是其中比较直观的一种。 FOR rec IN cur_1 LOOP UPDATE xxxxxxxxxxx_T SET rmb_amt_sn = _amt_sn,usd_amt_sn = _amt_snWHERE area_code = _codeAND CMCODE = ym = is_ym;END LOOP;COMMIT;--错误处理部分。 OTHERS表示除了声明外的任意错误。 SQLERRM是系统内置变量保存了当前错误的详细信息。 EXCEPTIONWHEN OTHERS THEN vs_msg := ERROR IN xxxxxxxxxxx_p(||is_ym||):||SUBSTR(SQLERRM,1,500);ROLLBACK;--把当前错误记录进日志表。 INSERT INTO LOG_INFO(proc_name,error_info,op_date)VALUES(xxxxxxxxxxx_p,vs_msg,SYSDATE);COMMIT;RETURN;END;
oracle怎么样调用存储过程

JDBC调用存储过程: CallableStatement在Java里面调用存储过程,写法那是相当的固定( conn = (..../***p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替*其余地方写法固定*/CallableStatement cstmt = ({call p(?,?,?,?)});/***告诉JDBC,这些个参数,哪些是输出参数,输出参数的类型用来指定*下面的意思是,第3个?和第4个?是输出参数,类型是INTEGER的*Types后面具体写什么类型,得看你的存储过程参数怎么定义的*/(3, );(4, );/***p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替*其余地方写法固定*/CallableStatement cstmt = ({call p(?,?,?,?)});/***在我这里第1个?和第2个?是输入参数,第3个是输出参数,第4个既输入又输出*下面是设置他们的值,第一个设为3,第二个设为4,第4个设置为5*没设第3个,因为它是输出参数*/(1, 3);(2, 4);(4, 5);//执行();//把第3个参数的值当成int类型拿出来int three = (3);(three);//把第4个参数的值当成int类型拿出来int four = (4);(four);//用完别忘给人家关了,后开的先关();();JDBC调用存储过程,掌握这一个程序足够了.以下是上面程序使用的存储过程的代码,我用的是oracle数据库,不过不论是什么数据库,对于你的程序,JDBC这一端写法都是一样的 or replace procedure p(v_a in number,v_b number,v_ret out number,v_temp in out number)isbeginif(v_a > v_b) thenv_ret := v_a;elsev_ret := v_b;end if;v_temp := v_temp + 1;end;
发表评论