`

oracle 存储过程

 
阅读更多
select (case when nvl(max(catgroup_id),1)=1 then 1 else max(catgroup_id) end)   from catgroup;
从查到分类表,如果分类表中的最大的catgroup是空的,哪么它等于1,否则查询最大值给分类表
1>有两个现x_user_out ,x_user_in 现在要把1表中的数据迁移2表中,
如果1中表的cnname不为空,则flag 为1,如果cnname存在则更新表1
日志文件:x_brand_log

create table X_USER_IN
(
  ID        NUMBER,
  CNNAME    VARCHAR2(200),
  OTHERNAME VARCHAR2(100),
  FLAG      NUMBER
)
create table X_USER_out
(
  ID        NUMBER,
  CNNAME    VARCHAR2(200),
  OTHERNAME VARCHAR2(100),
  FLAG      NUMBER
)

create table X_BRAND_LOG
(
  TABLENAME   VARCHAR2(20),
  ACTIONTYPE  VARCHAR2(20),
  RESULT      VARCHAR2(20),
  V_ERRORCODE VARCHAR2(256),
  V_ERRORINFO VARCHAR2(256),
  REMARK      VARCHAR2(100)
)
out 为返回值,in为入参
建立存储过程
create or replace procedure x_test_user(UserID   out number,
                                        UserName in varchar2,
                                        UserAge  in varchar2) is
  Type curType Is Ref Cursor;
  v_id        user_out.id%TYPE;
  v_cnname    user_out.cnname%TYPE;
  v_othername user_out.othername%TYPE;
  x_date      curType;
  v_sql       varchar2(200);
  v_flag      number;
  v_errorinfo varchar2(200);
  v_errorcode varchar2(200);
  v_Count     number;
begin
  v_sql := 'select id,cnname,othername from x_user_out';
  open x_date For v_sql;
  Loop
    fetch x_date
      Into v_id, v_cnname, v_othername;
    Exit When x_date%Notfound;
    if v_cnname is not null then
      v_flag := 0;
    else
      v_flag := 1;
    end if;
    select count(1) into V_count from x_user_in where cnname = v_cnname;
    if (V_count <= 0) then
      insert into x_user_in
        (id, cnname, othername, flag)
      values
        (test_seq.nextval, v_cnname, v_othername, v_flag);
      v_errorinfo := substr(sqlerrm, 0, 100);
      v_errorcode := substr(sqlcode, 0, 100);
      insert into X_BRAND_LOG
        (V_ERRORCODE, ACTIONTYPE, v_errorinfo, gmt_date)
      values
        (v_errorcode, 'success', v_errorcode, sysdate);
    else
      update x_user_in set othername = v_othername where cnname = v_cnname;
      UserID:=1;
      reutrn ;
    end if;
  End loop commit;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    rollback;
    v_errorinfo := substr(sqlerrm, 0, 100);
    v_errorcode := substr(sqlcode, 0, 100);
    insert into X_BRAND_LOG
      (V_ERRORCODE, ACTIONTYPE, v_errorinfo, gmt_date)
    values
      (v_errorinfo, 'failed', v_errorcode, sysdate);
    commit;
  WHEN OTHERS THEN
    rollback;
    v_errorinfo := substr(sqlerrm, 0, 100);
    v_errorcode := substr(sqlcode, 0, 100);
    insert into X_BRAND_LOG
      (V_ERRORCODE, ACTIONTYPE, v_errorinfo, gmt_date)
    values
      (v_errorinfo, 'failed', v_errorcode, sysdate);
    commit;
end x_test_user;

在PLSQL中执行
declare
a number;
begin
  x_test_user(a,'张利华','jak');
end;


3返回值问题
1.public int Analyze1(String examid, String courseid, String gradeid, 
2.            String KeMu) { 
3.        String procedure = "{call teaching.dbo.A1(?,?,?,?,?)}"; 
4.        int result = 0; 
5.        CallableStatement cstmt; 
6.        try { 
7.            Session session = this.getSession(); 
8.            Connection con = session.connection(); 
9.            cstmt = con.prepareCall(procedure); 
10.            cstmt.setString(1, gradeid); 
11.            cstmt.setString(2, examid); 
12.            cstmt.setString(3, courseid); 
13.            cstmt.setString(4, KeMu); 
14.             
15.            cstmt.registerOutParameter(5,java.sql.Types.INTEGER); 
16.            cstmt.executeUpdate(); 
17.            result = cstmt.getInt(5); 
[color=red][/color]
18.            //session.close(); 
19.        } catch (SQLException e) { 
20.            e.printStackTrace(); 
21.        } 
22.        return result; 
23.    } 

oracle 存储过程的基本语法 (转)

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
      xxx;
  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单步调试

一个实例(转)
24.CREATE OR REPLACE PACKAGE BODY PY_PCKG_REFUND2 AS  
25.   
26. PROCEDURE PY_WEBREFUND_VISA_PREPARE (  
27.  in_serialNoStr      IN  VARCHAR2, --用"|"隔开的一组网上退款申请流水号  
28.  in_session_operatorid IN VARCHAR2,--业务操作员  
29.  out_return_code     OUT VARCHAR2, --存储过程返回码  
30.  out_visaInfoStr     OUT VARCHAR2  
31. ) IS  
32.  --变量声明  
33.  v_serialno  VARCHAR2(20);--网上退款申请流水号  
34.  v_refserialno VARCHAR2(20);--支付交易流水号  
35.  v_tobankOrderNo VARCHAR2(30);--上送银行的订单号  
36.  v_orderDate  VARCHAR2(8);--订单日期  
37.  v_businessType VARCHAR2(10);--业务类型  
38.  v_currType  VARCHAR2(3);--订单类型(ET-电子机票)  
39.  v_merno   VARCHAR2(15);--商户号  
40.  v_orderNo  VARCHAR2(20);--商户订单号  
41.  v_orderState VARCHAR2(2);  
42.  v_refAmount     NUMBER(15,2);--退款金额   
43.  v_tranType  VARCHAR(2);--交易类型  
44.  v_bank   VARCHAR2(10);--收单银行  
45.  v_date   VARCHAR2 (8);--交易日期  
46.      v_time   VARCHAR2 (6);--交易时间  
47.      v_datetime  VARCHAR2 (14);--获取的系统时间  
48.  v_index_start NUMBER;  
49.  v_index_end  NUMBER;  
50.  v_i    NUMBER;  
51. BEGIN  
52.  -- 初始化参数  
53.  out_visaInfoStr := '';  
54.  v_i := 1;  
55.  v_index_start := 1;  
56.  v_index_end := INSTR(in_serialNoStr,'|',1,1);   
57.  v_refserialno := SUBSTR(in_serialNoStr, v_index_start, v_index_end-1);  
58.  v_datetime := TO_CHAR (SYSDATE, 'yyyymmddhh24miss');  
59.  v_date := SUBSTR (v_datetime, 1,;  
60.  v_time := SUBSTR (v_datetime, 9, 14);  
61. 
62.  --从退款请求表中查询定单信息(商户号、商户订单号、退款金额)  
63.  WHILE v_index_end > 0 LOOP  
64.   SELECT  
65.    WEBR_MERNO,  
66.    WEBR_ORDERNO,  
67.    WEBR_AMOUNT,  
68.    WEBR_SERIALNO,  
69.    WEBR_REFUNDTYPE  
70.   INTO  
71.    v_merno,  
72.    v_orderNo,  
73.    v_refAmount,  
74.    v_serialno,  
75.    v_tranType  
76.      FROM   
77.    PY_WEB_REFUND  
78.      WHERE   
79.    WEBR_REFREQNO = v_refserialno;  
80.     
81.   --将查询到的数据组成串  
82.   out_visaInfoStr := out_visaInfoStr || v_merno || '~' || v_orderNo || '~' || v_refAmount + '|';  
83.    
84.   --为下次循环做数据准备  
85.      v_i := v_i + 1;  
86.      v_index_start := v_index_end + 1;  
87.      v_index_end := INSTR(in_serialNoStr,'|',1,v_i);  
88.      IF v_index_end > 0 THEN  
89.        v_refserialno := SUBSTR(in_serialNoStr, v_index_start, v_index_end - 1);        
90.      END IF;  
91.        
92.   --根据原支付流水号在流水表中查询该订单的信息,包括原上送银行或第三方的订单号:WTRN_TOBANKORDERNO  
93.   SELECT  
94.    WTRN_TOBANKORDERNO,  
95.    WTRN_ORDERNO,  
96.      WTRN_ORDERDATE,  
97.      WTRN_BUSINESSTYPE,  
98.    WTRN_ACCPBANK,  
99.    WTRN_TRANCURRTYPE  
100.   INTO  
101.    v_tobankOrderNo,  
102.    v_orderNo,  
103.    v_orderDate,  
104.    v_businessType,  
105.    v_bank,  
106.    v_currType  
107.   FROM PY_WEBPAY_VIEW  
108.    WHERE WTRN_SERIALNO = v_serialno;  
109.      
110.   --记录流水表(退款)  
111.      INSERT INTO PY_WEBPAY_TRAN(  
112.    WTRN_SERIALNO,  
113.    WTRN_TRANTYPE,   
114.    WTRN_ORIGSERIALNO,  
115.    WTRN_ORDERNO,   
116.    WTRN_ORDERDATE,   
117.    WTRN_BUSINESSTYPE,  
118.    WTRN_TRANCURRTYPE,  
119.    WTRN_TRANAMOUNT,  
120.    WTRN_ACCPBANK,   
121.    WTRN_TRANSTATE,   
122.    WTRN_TRANTIME,  
123.    WTRN_TRANDATE,   
124.    WTRN_MERNO,   
125.    WTRN_TOBANKORDERNO  
126.   )VALUES(  
127.    v_refserialno, --和申请表的流水号相同,作为参数传人  
128.    v_tranType,  
129.    v_serialno, --原交易流水号,查询退款申请表得到  
130.    v_orderNo,  
131.    v_orderDate,  
132.    v_businessType,  
133.    v_currType,  
134.    v_refAmount,  
135.    v_bank,  
136.    '1',  
137.    v_time,  
138.    v_date,  
139.    v_merno,  
140.    v_tobankOrderNo --上送银行的订单号,查询流水表得到  
141.   );  
142. 
143.   --更新网上退款申请表  
144.   UPDATE PY_WEB_REFUND  
145.   SET   
146.    WEBR_IFDISPOSED = '1',  
147.    WEBR_DISPOSEDOPR = in_session_operatorid,  
148.    WEBR_DISPOSEDDATE = v_datetime  
149.   WHERE   
150.    WEBR_REFREQNO = v_refserialno;  
151.     
152.   --更新定单表  
153.   IF v_tranType = '2' THEN  
154.    v_orderState := '7';  
155.   ELSE  
156.    v_orderState := '10';  
157.   END IF;  
158.   
159.   UPDATE PY_ORDER  
160.   SET  
161.    ORD_ORDERSTATE = v_orderState  
162.   WHERE  
163.     ORD_ORDERNO = v_orderNo  
164.    AND ORD_ORDERDATE = v_orderDate  
165.    AND ORD_BUSINESSTYPE = v_businessType;   
166.  END LOOP;  
167.   
168.  -- 异常处理  
169.  EXCEPTION  
170.   WHEN OTHERS THEN  
171.   ROLLBACK;  
172.   out_return_code := '14001';  
173.   RETURN;   
174. END;  
175. 
176.END PY_PCKG_REFUND2;  
177./

DBMS_OUTPUT.put_line( "putline====== ");--换行 end; 打印功能
分享到:
评论

相关推荐

    oracle存储过程学习经典入门

    本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储过程的高级应用,包括 Hibernate 调用 Oracle 存储过程和 Java 调用 Oracle 存储过程的方法。 Oracle 存储过程基础知识 Oracle 存储过程是 Oracle...

    oracle存储过程unwrap解密工具.zip

    Oracle存储过程unwrap解密工具主要用于处理Oracle数据库中的加密存储过程。在Oracle数据库系统中,为了保护敏感代码或数据,开发人员有时会选择对存储过程进行加密。然而,当需要查看、调试或恢复这些加密的存储过程...

    oracle存储过程解锁

    以下是对“oracle存储过程解锁”这一主题的深入解析。 ### 标题:“oracle存储过程解锁” #### 解析: 在Oracle数据库中,存储过程是一种预先编译并存储在数据库中的SQL代码块,用于执行复杂的业务逻辑或数据处理...

    帆软报表Oracle存储过程解决storeParameter1参数试用插件

    总结起来,"帆软报表Oracle存储过程解决storeParameter1参数试用插件"主要是针对在调用无参数Oracle存储过程时出现的异常问题提供的一种解决方案。通过安装并配置这个插件,用户可以顺利地在帆软报表中调用不包含...

    Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...

    Oracle存储过程返回结果集

    在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`参数则允许过程向调用者返回数据。而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 ...

    oracle存储过程-帮助文档

    Oracle存储过程是数据库管理系统中的一种重要特性,它允许开发者编写一系列SQL语句和PL/SQL块,形成可重复使用的代码单元。这篇博客“oracle存储过程-帮助文档”可能提供了关于如何创建、调用和管理Oracle存储过程...

    oracle 存储过程 函数 dblink

    ### Oracle存储过程、函数与DBLink详解 #### 一、Oracle存储过程简介 在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程...

    springboot整合mybatis调用oracle存储过程

    本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...

    oracle 存储过程导出excel

    oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel

    hibernate query调用oracle存储过程

    以下是一个简单的示例,展示了如何调用一个不带参数的Oracle存储过程: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); session....

    C# 传入自定义列表List 到Oracle存储过程

    本文将详细讲解如何在C#中使用自定义列表(List)作为参数调用Oracle存储过程,以及实现这一功能的关键技术和注意事项。 首先,我们需要了解Oracle数据库中的PL/SQL类型,例如VARCAR2、NUMBER等,它们对应于C#中的...

    ORACLE存储过程最全教程

    Oracle存储过程是数据库管理系统Oracle中的一个关键特性,它允许开发者编写一组预编译的SQL和PL/SQL语句,以实现特定的业务逻辑或数据库操作。这篇教程将深入讲解Oracle存储过程的各个方面,帮助你从基础到高级全面...

    oracle 存储过程批量提交

    ### Oracle存储过程批量提交知识点详解 在Oracle数据库中,存储过程是一种重要的数据库对象,它可以包含一系列SQL语句和控制流语句,用于实现复杂的业务逻辑处理。存储过程不仅可以提高应用程序性能,还可以确保...

    Oracle存储过程中使用临时表

    本篇文章将深入探讨如何在Oracle存储过程中使用临时表,包括会话级临时表和事务级临时表。 ### 会话级临时表 会话级临时表(Session-Level Temporary Tables)只在创建它的会话内可见,并且在会话结束时自动删除。...

    oracle存储过程常用技巧

    Oracle存储过程常用技巧 Oracle存储过程是一种强大的数据库对象,它可以帮助开发者简化复杂的业务逻辑,并提高数据库的安全性和性能。在 Oracle 中,存储过程是一种特殊的 PL/SQL 程序,它可以接受输入参数,执行...

    pb中执行oracle存储过程脚本

    标题中的“pb中执行oracle存储过程脚本”指的是在PowerBuilder(简称PB)环境中调用Oracle数据库的存储过程。PowerBuilder是一种可视化的开发工具,常用于构建数据驱动的应用程序。Oracle存储过程则是在Oracle数据库...

    SQLServer存储过程转为oracle存储过程的工具

    可以将SQL Server存储过程转为oracle存储过程的工具

    用callabledStatement调用oracle存储过程实用例子(IN OUT 传游标)

    Oracle 存储过程调用 CallabledStatement 实用例子(IN OUT 传游标) 一、Oracle 存储过程简介 Oracle 存储过程是一种可以在 Oracle 数据库中存储和执行的程序单元。存储过程可以由多种语言编写,例如 PL/SQL、...

    Oracle存储过程调用bat批处理脚本程序

    本话题将详细探讨如何在Oracle存储过程中调用外部的批处理脚本,如Windows系统的BAT文件,以实现数据库操作与系统命令的集成。 首先,`Oracle存储过程`是一种预编译的SQL和PL/SQL代码集合,可以被多次调用以执行...

Global site tag (gtag.js) - Google Analytics