zoukankan      html  css  js  c++  java
  • 宋体、变量Oracle存储过程基本语法by小雨

    首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责

        

    存储过程

        1  CREATE OR REPLACE PROCEDURE 存储过程名

         IS

         BEGIN

        4  NULL;

         END;

        行1:

        CREATE OR REPLACE PROCEDURE 是一个SQL句语通知Oracle数据库去创立一个叫做skeleton存储过程, 如果存在就覆盖它;

        行2:

        IS关键词明表面后将追随一个PL/SQL体。

        行3:

        BEGIN关键词明表PL/SQL体的开始。

        行4:

        NULL PL/SQL句语明表什么事都不做,这句不能删去,因为PL/SQL体中少至要需有一句;

        行5:

        END关键词明表PL/SQL体的结束

        

    存储过程创立语法:

     create or replace procedure 存储过程名(param1 in typeparam2 out type) 

        as 

        变量1 类型(值范围); --vs_msg   VARCHAR2(4000); 

        变量2 类型(值范围);

        Begin

        Select count(*) into 变量1 from 表A where列名=param1

        If (断判条件) then

           Select 列名 into 变量2 from 表A where列名=param1

           Dbms_outputPut_line(‘打印信息’);

        Elsif (断判条件) then

           Dbms_outputPut_line(‘打印信息’);

        Else

           Raise 异常名(NO_DATA_FOUND;

        End if;

        Exception

        When others then

           Rollback;

        End;

        注意事项:

        1, 存储过程数参不带取值范围,in表现传入,out表现输出

        类型可以用使恣意Oracle中的法合类型。

        2,  变量带取值范围,面后接分号

        3,  在断判句语前最好先用count(*)函数断判是不是存在该条操纵记载

        4,  用select 。。。into。。。给变量值赋

        5,  在代码中抛异用常 raise+异常名

        CREATE OR REPLACE PROCEDURE存储过程名
    (

        --定义数参
     is_ym  IN CHAR(6) ,

        the_count OUT NUMBER,

    AS 
    --定义变量 
    vs_msg   VARCHAR2(4000);   --错误信息变量
    vs_ym_beg  CHAR(6);      --始起月份
    vs_ym_end  CHAR(6);      --终止月份
    vs_ym_sn_beg CHAR(6);     --同期始起月份
    vs_ym_sn_end CHAR(6);     --同期终止月份

    --定义标游(简略的说就是一个可以遍历的结果集) 

        
    CURSOR cur_1 IS 
      SELECT 。。。 
      FROM 。。。 
        WHERE 。。。
       GROUP BY 。。。; 

    BEGIN 

        
    --用输入数参给变量赋值初,用到了OralceSUBSTR 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 表名 WHERE ym = is_ym; 

        
      --然后用置内的DBMS_OUTPUT象对的put_line法方打印出影响的记载行数,其中用到一个统系变量SQL%rowcount 

        
    DBMS_OUTPUT.put_line('del上月记载='||SQL%rowcount||''); 

    INSERT INTO表名(area_code,ym,CMCODE,rmb_amt,usd_amt) 
    SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000 
    FROM BGD_AREA_CM_M_BASE_T 
      WHERE ym >= vs_ym_beg 
      AND ym <= vs_ym_end 
    GROUP BY area_code,CMCODE; 

    DBMS_OUTPUT.put_line('ins当月记载='||SQL%rowcount||''); 
    --遍历标游处置后更新到表。遍历标游有几种法方,用for句语是其中较比直观的一种

     
    FOR rec IN cur_1 LOOP 
      UPDATE 表名
      SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn 
       WHERE area_code = rec.area_code 
       AND CMCODE = rec.CMCODE 
       AND ym = is_ym; 
    END LOOP; 

    COMMIT; 

        
    --错误处置分部。OTHERS表现除了声明外的恣意错误。SQLERRM是统系置内变量存保了以后错误的详细信息。 

        
    EXCEPTION 

        
       WHEN 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;

    文章结束给大家分享下程序员的一些笑话语录: Borland说我很有前途,Sun笑了;Sun说我很有钱,IBM笑了;IBM说我很专业,Sybase笑了;Sybase说我数据库很牛,Oracle笑了;Oracle说我是开放的,Linux笑了;Linux说我要打败Unix,微软笑了;微软说我的系统很稳定,我们都笑了。

  • 相关阅读:
    poj 1113 Wall 凸包的应用
    NYOJ 78 圈水池 (入门级凸包)
    Monotone Chain Convex Hull(单调链凸包)
    poj Sudoku(数独) DFS
    poj 3009 Curling 2.0(dfs)
    poj 3083 Children of the Candy Corn
    Python join()方法
    通过FISH和下一代测序检测肺腺癌ALK基因融合比较
    华大病原微生物检测
    NGS检测ALK融合大起底--转载
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3026150.html
Copyright © 2011-2022 走看看