存储过程1
PostgreSQL-存储过程(一)基础篇

PostgreSQL-存储过程(⼀)基础篇存储过程其实就是函数,由⼀组 sql 语句组成,实现⽐较复杂的数据库操作;存储过程是存储在数据库服务器上的,⽤户可以像调⽤ sql ⾃带函数⼀样调⽤存储过程语法解析CREATE [OR REPLACE] FUNCTION function_name (arguments)RETURNS return_datatype AS $variable_name$DECLAREdeclaration;[...]BEGIN< function_body >[...]RETURN { variable_name | value }END; LANGUAGE plpgsql;很容易理解,不多解释下⾯我对⼀张表进⾏简单操作,逐步递进的介绍存储过程的语法步骤1-基础版into 表⽰把结果赋值给后⾯的变量,该变量必须在 declare 提前声明调⽤存储过程select mycount3()步骤2-把 sql 语句赋给变量create or replace function mycount3()returns integer as $$declaremysql text;counts integer;beginmysql:='select count("CD_ID") from "CDS"';execute mysql into counts;return counts;end;$$ language plpgsql;步骤3-带变量,且 sql 语句⽤字符串拼接create or replace function mycount4(tableName text, columnName text)returns text as $$declaremysql text;beginmysql:='select count('|| quote_ident(columnName)|| ') from '|| quote_ident(tableName);return mysql;end;$$ language plpgsql;1. 函数的参数必须声明类型2. || 表⽰字符串拼接符号3. 存储过程中的对象不能直接引⽤变量,要⽤ quote_ident,它的作⽤是为字符串加上双引号4. 在 sql 语句中,⼤写,全部会变成⼩写,如果想保留⼤写,需要加双引号调⽤存储过程select mycount4('CDS', 'CD_ID');返回select count("CD_ID") from "CDS"可以看到,输⼊参数是单引号,经过 quote_ident 后,⾃动变成双引号,保留了⼤写步骤4-换⼀种拼接⽅式,并且函数体加了 if 判断create or replace function mycount4(tableName text, columnName text)returns integer as $$declaremysql text;counts integer;beginmysql:='select count("' || $2 || '") from "' || $1 || '" ';execute mysql into counts using tableName, columnName;if counts > 100 thenreturn counts;else return 1;end if;end;$$ language plpgsql;1. ⽤ using 调取变量,此时需要⾃⼰加双引号以保留⼤写2. 112 对应的是函数的参数位置,跟 using 后的顺序⽆关3. if 后⾯有个 then4. text 可变长度字符串5. 每句末尾必须带分号。
mysql存储过程

mysql存储过程MySQL存储过程1. 存储过程简介我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
一个存储过程是一个可编程的函数,它在数据库中创建并保存。
它可以有SQL 语句和一些特殊的控制结构组成。
当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。
数据库中的存储过程可以看做是对编程中面向对象方法的模拟。
它允许控制数据的访问方式。
存储过程通常有以下优点:(1).存储过程增强了SQL语言的功能和灵活性。
存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
(2).存储过程允许标准组件是编程。
存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。
而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
(3).存储过程能实现较快的执行速度。
如果某一操作包含大量的Transaction-SQL 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。
因为存储过程是预编译的。
在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。
而批处理的Transaction-SQL 语句在每次运行时都要进行编译和优化,速度相对要慢一些。
(4).存储过程能过减少网络流量。
针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
(5).存储过程可被作为一种安全机制来充分利用。
系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
第11章 MySQL存储过程与函数 第1节存储过程与函数简介 (1)

(2)创建函数
创建存储函数语法格式: create function sp_name ([func_parameter[,..]]) returns type [characteristic ..] routine_body
说明:在MySQL中,存储函数的使用方法与MySQL内部函数的 使用方法是一样的。换言之,用户自己定义的存储函数与MySQL 内部函数condition then statement_list [elseif search_condition then statement_list] … [else search_condition then statement_list] end if
数据库原理及MySQL应用 ——第十一章(第1节)
存储过程与函数简介
1.概念 2.存储过程和函数区别
1. 概念
一个存储过程是可编程的,它在数据库中创建并保存。它可以有SQL语句 和一些特殊的控制结构组成。
存储过程的优点: 存储过程增强了SQL语言的功能和灵活性; 存储过程允许标准组件是编程。 存储过程能实现较快的执行速度。 存储过程能过减少网络流量。 存储过程可被作为一种安全机制来充分利用。
【例19】删除存储过程studentcount
系统函数
1. 数学函数 2. 字符串函数 3. 日期和时间函数 4. 系统信息函数 5. 加密函数
具体使用 请参考教
材讲义
(6)repeat语句
repate语句是有条件控制的循环语句。 语法形式: [begin_label:] repeat statement_list until search_confition end repeat [end_label]
(7)while语句也是有条件控制的循环语句。
高斯存储过程

高斯存储过程1. 引言存储过程(Stored Procedure)是在关系数据库中,用过程化语言编写的一组预定义的程序。
通过存储过程,可以将一系列的SQL语句和逻辑操作封装在一个单独的单元中,以便实现代码的复用和模块化开发。
在数据库管理系统(DBMS)中,高斯存储过程是一种以高斯数据库为基础的存储过程,提供丰富的功能和高性能的数据处理能力。
2. 高斯存储过程的特点高斯存储过程具有以下几个特点:2.1 高性能高斯存储过程采用了一系列优化策略,在执行时能够充分利用数据库的内部资源,以提高数据处理的效率。
它可以预编译、缓存和重用SQL语句,减少了SQL语句的解析和优化时间,从而大幅度提升了处理速度。
2.2 安全性高斯存储过程可以在数据库端运行,不需要将敏感的数据传输到客户端。
这样可以避免对数据进行不安全的操作和传输,有效提升了数据的安全性。
高斯存储过程还可以对用户进行权限管理,只有具备相应权限的用户才能执行存储过程。
2.3 可靠性高斯存储过程支持事务处理,可以确保数据库的一致性和完整性。
通过将一组操作放在一个事务中执行,可以将数据库从一个一致的状态转换到另一个一致的状态。
如果事务执行过程中出现错误,高斯存储过程还可以自动回滚,保证数据的完整性。
2.4 可维护性高斯存储过程将复杂的业务逻辑封装在一个单独的存储过程中,有助于提高代码的可维护性。
如果需要修改业务逻辑,只需要修改存储过程的代码,而不需要修改所有调用该存储过程的代码。
这种模块化的开发方式能够提高代码的复用性,减少了重复的工作量。
3. 高斯存储过程的应用场景高斯存储过程在各种数据库应用中有着广泛的应用场景,下面列举了一些常见的应用场景:3.1 数据校验和数据清洗在数据录入过程中,往往需要对输入的数据进行有效性检查和清洗。
高斯存储过程可以在数据插入或更新时自动进行数据校验,确保数据的准确性和完整性。
例如,可以通过存储过程检查输入的电话号码是否符合规范,或者过滤掉包含非法字符的文本。
ETL实用函数和存储过程(一)

ETL实用函数和存储过程(一)ETL实用函数和存储过程(一)ETL(Extract, Transform, Load)是一种常用的数据集成处理方式,主要用于将数据从不同的数据源提取出来,经过一系列的转换处理,最后加载到目标数据仓库或数据库中。
在ETL过程中,有一些常用的函数和存储过程,可以帮助我们更高效地进行数据处理和转换。
本文将介绍一些常用的ETL实用函数和存储过程。
1.字符串函数:字符串函数用于处理文本数据,常见的字符串函数包括:-SUBSTR:用于截取字符串的指定部分。
-CONCAT:用于将多个字符串连接为一个字符串。
-REPLACE:用于将字符串中指定的子字符串替换为另一个字符串。
-TRIM:用于去除字符串前后的空格。
-UPPER/LOWER:用于将字符串转换为大写或小写。
2.数值函数:数值函数用于处理数值型数据,常见的数值函数包括:-ROUND:用于四舍五入。
-CEIL/FLOOR:用于向上取整或向下取整。
-ABS:用于取绝对值。
-MOD:用于求余数。
-POWER/SQRT:用于计算次方和平方根。
3.日期函数:日期函数用于处理日期和时间相关的数据,常见的日期函数包括:-TO_DATE:用于将字符串转换为日期型。
-TO_CHAR:用于将日期型转换为字符串。
-MONTHS_BETWEEN:用于计算两个日期之间的月数差。
-ADD_MONTHS:用于在日期上增加指定的月份。
4.转换函数:转换函数用于将数据类型进行转换,常见的转换函数包括:-TO_NUMBER:用于将字符串转换为数值型。
-TO_CHAR:用于将数值型转换为字符串。
-TO_DATE:用于将字符串转换为日期型。
5.存储过程:存储过程是一组预定义的SQL语句集合,可以将多个SQL语句封装在一起,以实现特定的功能。
常见的存储过程功能包括:-数据清洗:对数据进行清洗、去重、去除无效值等操作。
-数据转换:对数据进行格式化、合并、拆分等操作。
存储过程实例1

CREATE OR REPLACE PROCEDURE TOOLD_T_JZZYW_YX_ALL IS/*****************************************功能:把新市库中的t_jzzyw_yx\t_jzzxx_yx\t_jzzyw_qtxx_yx增量转换到旧市库的T_JZZ_YW,T_JZZ_XX数据;时间:2013-02-25*****************************************/V_ERRORS VARCHAR2(200);V_N VARCHAR2(2);C_TABLE_NAME CONSTANT VARCHAR2(32) := 'T_JZZYW_YX';BEGINBEGIN/***************************判断新市库到旧市库的链路是否联通如果不通,则退出当次转换***************************/SELECT * INTO V_N FROM DUAL@KYXX;EXCEPTIONWHEN OTHERS THENV_ERRORS := SQLERRM;INSERT INTO T_ERROR_LOG_TOOLD(TYPE, ERRORMSG, XRSJ, YWID)VALUES(C_TABLE_NAME, V_ERRORS, SYSDATE, '链路不通,退出转换');COMMIT;RETURN;END;/*\*更新XZQ字段*\UPDATE KY_T_JZZYW_YX YXSET XZQ =(SELECT T3.XZQDM XZQFROM T_JZZXX_YX T, T_FWXX T1, T_FWXX_MPXX T2, V_XZQH_ZZJG T3 WHERE T.FWID = T1.IDAND T1.MPDM = T2.DMAND T2.XZQHDM = T3.DMAND JZZYWID = YX.ID);COMMIT;*/FOR I IN (SELECT A.ID AS ID,A.DJBID AS DJBID,C.DQYWHJ AS DQYWHJ,C.DQYWZT AS DQYWZT,A.SLLB AS SLLB,A.SLYY AS SLYY,A.SLRQ AS SLRQ,A.SLDWDM AS SLDWDM,A.SLR AS SLR,A.SFKS AS SFKS,A.SFDYLQPZ AS SFDYLQPZ, A.DYLQPZRQ AS DYLQPZRQ, A.SFYJF AS SFYJF,A.HZBH AS HZBH,A.HZFFRQ AS HZFFRQ,A.HZFFR AS HZFFR,A.SFSH AS SFSH,A.SHSFTG AS SHSFTG,A.SHBTGYY AS SHBTGYY, C.SHR AS SHR,A.SHRQ AS SHRQ,A.SHDW AS SHDW,A.SFZZ AS SFZZ,C.ZZDWDM AS ZZDWDM,A.ZZRQ AS ZZRQ,A.SFCXZZ AS SFCXZZ,A.BLSFFF AS BLSFFF,A.BLFFPH AS BLFFPH,A.BLFFDWDM AS BLFFDWDM, A.BLFFR AS BLFFR,A.BLFFRQ AS BLFFRQ,A.JSDWDM AS JSDWDM,A.JSR AS JSR,A.JSRQ AS JSRQ,A.SFFF AS SFFF,C.FFR AS FFR,A.FFDWDM AS FFDWDM,A.FFRQ AS FFRQ,B.XM AS LQR,A.LQRQ AS LQRQ,A.CXLX AS CXLX,A.CXNR AS CXNR,A.CXDW AS CXDW,A.CXR AS CXR,A.CXRQ AS CXRQ,A.SJCSPH AS SJCSPH,A.CJR AS CJR,A.CJSJ AS CJSJ,A.GXR AS GXR,A.GXSJ AS GXSJ,A.SFTH AS SFTH,A.SFZZYW AS SFZZYW,A.SFDCL AS SFDCL,A.SFCX AS SFCX,A.ZZSFCG AS ZZSFCG,A.ZZSBYY AS ZZSBYY,A.SFDZZ AS SFDZZ,A.DZZRQ AS DZZRQ,A.ZZPH AS ZZPH,A.CXZZCS AS CXZZCS,A.SLBH AS SLBH,B.GMSFHM AS LQRSFZH,A.KZZD1 AS KZZD1,A.KZZD2 AS KZZD2,A.KZZD3 AS KZZD3,A.KZZD4 AS KZZD4,A.KZZD5 AS KZZD5,A.KZZD6 AS KZZD6,C.FLAG AS FLAG,C.OPERATION AS OPERATION,C.XZQ AS XZQFROM KY_T_JZZYW_YX C, T_JZZXX_YX B, T_JZZYW_YX AWHERE A.ID = B.JZZYWIDAND A.ID = C.ID/*AND XZQ IS NOT NULL*/AND FLAG IS NULL) LOOP/***************************根据不同的操作类型,应用到新市库上***************************/BEGINIF I.OPERATION = 'DE'THEN/* DELETE FROM T_JZZ_YW@KYXX WHERE ID = I.ID;DELETE FROM T_JZZ_XX@KYXX WHERE ID = I.ID;*/NULL;ELSIF I.OPERATION = 'IN'THEN/*当t_jzzyw_yx的shsftg不为空且dqywhj为03、04、05、07、08、09、10时,如果id不存在于t_jzz_yw_sh ,就新增一条记录到t_jzz_yw_sh,如果存在,则修改*/IF I.SHR IS NOT NULL ANDI.DQYWHJ IN('03', '04'/*, '05', '07', '08', '09', '10'*/) THENINSERT INTO T_JZZ_YW_SH@KYXX(ID, SHR, SHDW, SHRQ, SHJG, SHBTGYY, CJR, CJSJ, ZHXGR, ZHXGSJ) SELECT ID, SHR, SHDW, SHRQ, SHJG, SHBTGYY, CJR, CJSJ, GXR, GXSJFROM T_JZZYW_SHWHERE ID = I.KZZD2;END IF;/*当t_jzzyw_yx的zzdwdm不为空且dqywhj为07、08、09、10时,如果id不存在于t_jzz_yw_zzxx,就新增一条记录到t_jzz_yw_zzxx,如果存在,则修改该记录*/IF I.ZZDWDM IS NOT NULL ANDI.DQYWHJ IN ('07', '08', '09'/*, '10'*/) THEN--V_ZZXXID := 'ZZXX' || ID_JZZ.NEXTVAL;INSERT INTO T_JZZ_YW_ZZXX@KYXX(ID, ZZDW, ZZRQ, ZZSFCG, ZZCWLXMC, CJR, CJSJ, ZHXGR, ZHXGSJ) SELECT ID,ZZDW,ZZRQ,ZZSFCG,ZZCWLXMC,CJR,CJSJ,ZHXGR,ZHXGSJFROM T_JZZ_YW_ZZXXWHERE ID = I.KZZD4;END IF;/* 当t_jzzyw_yx的FFR不为空且dqywhj为10时,新增一条记录到t_jzz_yw_ff*/IF I.FFR IS NOT NULL AND I.DQYWHJ = '10'THEN--V_FFID := 'FFID' || ID_JZZ.NEXTVAL;INSERT INTO T_JZZ_YW_FF@KYXX(ID, FFR, FFDW, FFSJ, LQRXM, LQRSFZH, CJR, CJSJ, ZHXGR, ZHXGSJ) VALUES(I.KZZD3,I.FFR,I.FFDWDM,I.FFRQ,I.LQR,I.LQRSFZH,I.CJR,I.CJSJ,I.GXR,I.GXSJ);END IF;INSERT INTO T_JZZ_YW@KYXX(ID,RYYWLSH,RYID,YWHJ,DQYWZT,SLLB,SLYY,SLRQ,SLDW,SLR,SFKS,SFDYLQPZ,DYLQPZSJ,SFYJF,SFZXZZ,CXRQ,CZZZCS,SLBH,CJR,CJSJ,ZHXGR,ZHXGSJ,JZZBH,XM,ZJHM,XB,CSRQ,MZ,DZ,ZZDZXZ,HZBH,JZZYXQX,JZZYXQSRQ, JZZYXJZRQ, BZRQ,JZZXPH,SFSCSB,SHENG,SHI,FWID,XIAN,ZYSCBZRQ, ZALFFJE,GBFJE,SHIJB,XZQ,JZ,FWZ,JWH,PQ,GAFJ,PCS,JDDM,MPDM,CZWBH,FWCSDZ,DWDZ,YDDH,ZZSY,DYHDZ,ZZMM,ZJXY,WHCD,QYBH,XZ,JTGJ,CPHM,LSRQ,HYZK,JHRQ,POXM,POZJLX,POZJHM,SFTZ,JSZLX,JSZHM,YZRQ,JSZYXRQ,BZ,JYZK,HDQK,CZHKSZD,QH,NANGS,NUGS,SFCB,ZY,PODZ,SG,RZRQ,FJH,ZZCS,JZFS,TBR,TBRQ,DWDH,ZZID,SHID,FFID,ZZXXID,JCID,DBID,HJDH,DQYWHJ)SELECT A.ID,A.DJBID,A.RYID,A.DQYWHJ,NVL(A.DQYWZT, '2') AS DQYWZT,A.SLLB,A.SLYY,A.SLRQ,t6.xzqmc||t6.jzmc||t6.fwzmc||t6.jwhmc||t6.cmxzmc SLDW, A.SLR,A.SFKS,A.SFDYLQPZ,A.DYLQPZRQ,A.SFYJF,A.SFCXZZ,A.CXRQ,A.CXZZCS,A.SLBH,A.CJR,A.CJSJ,A.GXR,A.GXSJ,A.SLBH,B.XM,B.GMSFHM,B.XBDM,B.CSRQ,B.MZDM,B.HJDZ,B.JZDZ,NVL(T.HZBH, T.BZ),B.YXQX,B.YXQSRQ,B.YXJZRQ,B.SLRQ,B.XPH,B.SFSCSB,SUBSTR(B.GMSFHM, 0, 2), SUBSTR(B.GMSFHM, 0, 4), B.FWID,B.HJQXDM,B.ZYSCBZRQ,B.ZALFFJE,B.GBFJE,'4406',T4.XZQDM XZQ,T4.JZDM JZ,T4.FWZDM FWZ,T4.JWHDM JWH,T4.CMXZDM PQ,T5.GAFJ,T2.PCS,T2.JLXDM JDDM,T1.MPDM,T1.DABH CZWBH,C.FWCSDZ,C.YDDH,NVL(C.ZZSY, '99'),NVL(D.DYHDZ, E.DYHDZ),COALESCE(D.ZZMM, E.ZZMM,'13'),NVL(D.ZJXY, E.ZJXY),COALESCE(D.WHCD, E.WHCD,'80'),NVL(D.DWID, E.DWID),NVL(D.HJXZ, E.HJXZ),NVL(D.JTGJ, '03') AS JTGJ,NVL(D.CPHM, E.CPHM),COALESCE(D.LSRQ, E.LSRQ,D.TBSJ,SYSDATE), COALESCE(D.HYZK, E.HYZK,'1'),NVL(D.JHRQ, E.JHRQ),NVL(D.POXM, E.POXM),NVL(D.POZJLX, E.POZJLX),NVL(D.POZJHM, E.POZJHM),NVL(D.SFTZ, E.SFTZ),NVL(D.JSZLX, E.JSZLX),NVL(D.JSZHM, E.JSZHM),NVL(D.YZRQ, E.YZRQ),NVL(D.JSZYXRQ, E.JSZYXRQ),NVL(D.BZ, E.BZ),COALESCE(D.JYZK, E.JYZK,'2'),NVL(D.HDQK, E.HDQK),NVL(D.CZHKSZD, E.CZHKSZD),NVL(D.HJQH, E.HJQH),NVL(D.NANGS, E.NANGS),NVL(D.NUGS, E.NUGS),NVL(D.SFCB, E.SFCB),NVL(D.ZY, E.ZY),NVL(D.POHJDZ, E.POHJDZ),NVL(D.SG, E.SG),NVL(D.RZRQ, E.RZRQ),NVL(D.FJH, E.FJH),NVL(D.ZZCS, '无'),COALESCE(D.JZFS, E.JZFS,'05'),NULL,NULL,NULL,NULL,I.KZZD2,I.KZZD4,NULL,NULL,NULL,(CASEWHEN A.DQYWHJ IN ('01', '02') THEN'1'WHEN A.DQYWHJ IN('03', '04', '05', '07', '08', '09') THEN'2'WHEN A.DQYWHJ = '06'THEN'8'WHEN A.DQYWHJ = '10'THEN'7'END) DQYWHJFROM T_JZZYW_YX A,T_JZZXX_YX B,T_JZZYW_QTXX_YX C,T_LDRK_DJB D,T_LDRK_DJB_ZXQK E,T_LDRK_XP T,T_FWXX T1,T_FWXX_MPXX T2,T_FWXX_JLX T3,V_XZQH_ZZJG T4,T_XZQH_QX T5,V_XZQH_ZZJG t6WHERE A.ID = B.JZZYWIDAND A.ID = C.JZZYWIDAND A.DJBID = D.ID(+)AND A.DJBID = E.ID(+)AND T.ID(+) = B.XPIDAND B.FWID = T1.IDAND T1.MPDM = T2.DMAND T2.JLXDM = T3.DMAND T2.XZQHDM = T4.DMAND T4.XZQDM = T5.DMAND a.sldwdm= t6.dmAND A.ID = I.ID;IF I.DQYWHJ = '10'THENINSERT INTO T_JZZ_XX@KYXX(ID,SLRQ,SLDW,SLR,SLBH,JZZBH,ZZDW,ZZRQ,FFR,FFDW,FFSJ,XM,ZJHM,XB,CSRQ,MZ,DZ,ZZDZXZ,HZBH,CJR,CJSJ,ZHXGR,ZHXGSJ,JZZYXQX,JZZYXQSRQ, JZZYXJZRQ, BZRQ,JZZXPH,SFSCSB,SHENG,SHI,JZZZT,FWID,XIAN,ZYSCBZRQ, SHIJB,XZQ,JZ,FWZ,JWH,PQ,GAFJ,PCS,JDDM,CZWBH,FWCSDZ, DWDZ,YDDH,ZZSY,DYHDZ,ZZMM,ZJXY,WHCD,QYBH,XZ,JTGJ,CPHM,LSRQ,HYZK,JHRQ,POXM,POZJLX, POZJHM, SFTZ,JSZLX,JSZHM,YZRQ,JSZYXRQ, BZ,JYZK,HDQK,CZHKSZD, QH,NANGS,NUGS,SFCB,ZY,PODZ,SG,RZRQ,FJH,ZZCS,JZFS,TBR,TBRQ,DWDH,HJDH,SELECT A.ID,A.RYID,A.SLRQ,t6.xzqmc||t6.jzmc||t6.fwzmc||t6.jwhmc||t6.cmxzmc SLDW,A.SLR,A.SLBH,A.SLBH,A.ZZDWDM,A.ZZRQ,A.FFR,A.FFDWDM,A.FFRQ,B.XM,B.GMSFHM,B.XBDM,B.CSRQ,B.MZDM,B.HJDZ,B.JZDZ,NVL(T.HZBH, T.BZ),B.CJR,B.CJSJ,B.GXR,B.GXSJ,B.YXQX,B.YXQSRQ,B.YXJZRQ,B.SLRQ,B.XPH,B.SFSCSB,SUBSTR(B.GMSFHM, 0, 2),SUBSTR(B.GMSFHM, 0, 4),B.JZZZT,B.FWID,B.HJQXDM,B.ZYSCBZRQ,'4406',T4.XZQDM,T4.JZDM,T4.FWZDM,T4.JWHDM,T4.CMXZDM PQ,T2.PCS,T2.JLXDM,T1.MPDM,T1.DABH,C.FWCS,C.FWCSDZ,C.YDDH,NVL(C.ZZSY, '99'),NVL(D.DYHDZ, E.DYHDZ),COALESCE(D.ZZMM, E.ZZMM,'13'),NVL(D.ZJXY, E.ZJXY),COALESCE(D.WHCD, E.WHCD,'80'),NVL(D.DWID, E.DWID),NVL(D.HJXZ, E.HJXZ),NVL(D.JTGJ, '03') AS JTGJ,NVL(D.CPHM, E.CPHM),COALESCE(D.LSRQ, E.LSRQ,D.TBSJ,SYSDATE), COALESCE(D.HYZK, E.HYZK,'1'),NVL(D.JHRQ, E.JHRQ),NVL(D.POXM, E.POXM),NVL(D.POZJLX, E.POZJLX),NVL(D.POZJHM, E.POZJHM),NVL(D.SFTZ, E.SFTZ),NVL(D.JSZLX, E.JSZLX),NVL(D.JSZHM, E.JSZHM),NVL(D.YZRQ, E.YZRQ),NVL(D.JSZYXRQ, E.JSZYXRQ),NVL(D.BZ, E.BZ),COALESCE(D.JYZK, E.JYZK,'2'),NVL(D.HDQK, E.HDQK),NVL(D.CZHKSZD, E.CZHKSZD),NVL(D.HJQH, E.HJQH),NVL(D.NANGS, E.NANGS),NVL(D.NUGS, E.NUGS),NVL(D.SFCB, E.SFCB),NVL(D.ZY, E.ZY),NVL(D.POHJDZ, E.POHJDZ),NVL(D.SG, E.SG),NVL(D.RZRQ, E.RZRQ),NVL(D.FJH, E.FJH),NVL(D.ZZCS, '无'),COALESCE(D.JZFS, E.JZFS,'05'),B.XM,NULL,NULL,NULLFROM T_JZZYW_YX A,T_JZZXX_YX B,T_JZZYW_QTXX_YX C,T_LDRK_DJB D,T_LDRK_DJB_ZXQK E,T_LDRK_XP T,T_FWXX T1,T_FWXX_MPXX T2,T_FWXX_JLX T3,V_XZQH_ZZJG T4,T_XZQH_QX T5,V_XZQH_ZZJG T6WHERE A.ID = B.JZZYWIDAND A.ID = C.JZZYWIDAND A.DJBID = D.ID(+)AND A.DJBID = E.ID(+)AND T.ID(+) = B.XPIDAND B.FWID = T1.IDAND T1.MPDM = T2.DMAND T2.JLXDM = T3.DMAND T2.XZQHDM = T4.DMAND T4.XZQDM = T5.DMAND a.sldwdm = t6.dmAND A.ID = I.ID;END IF;ELSIF I.OPERATION = 'UN'THEN/*当t_jzzyw_yx的shsftg不为空且dqywhj为03、04、05、07、08、09、10时,如果id不存在于t_jzz_yw_sh ,就新增一条记录到t_jzz_yw_sh,如果存在,则修改*/IF I.SHR IS NOT NULL ANDI.DQYWHJ IN('03', '04'/*, '05', '07', '08', '09', '10'*/) THENINSERT INTO T_JZZ_YW_SH@KYXX(ID, SHR, SHDW, SHRQ, SHJG, SHBTGYY, CJR, CJSJ, ZHXGR, ZHXGSJ) SELECT ID, SHR, SHDW, SHRQ, SHJG, SHBTGYY, CJR, CJSJ, GXR, GXSJFROM T_JZZYW_SHWHERE ID = I.KZZD2;END IF;/*当t_jzzyw_yx的zzdwdm不为空且dqywhj为07、08、09、10时,如果id不存在于t_jzz_yw_zzxx,就新增一条记录到t_jzz_yw_zzxx,如果存在,则修改该记录*/IF I.ZZDWDM IS NOT NULL ANDI.DQYWHJ IN ('07', '08', '09'/*, '10'*/) THEN--V_ZZXXID := 'ZZXX' || ID_JZZ.NEXTVAL;INSERT INTO T_JZZ_YW_ZZXX@KYXX(ID, ZZDW, ZZRQ, ZZSFCG, ZZCWLXMC, CJR, CJSJ, ZHXGR, ZHXGSJ) SELECT ID,ZZDW,ZZRQ,ZZSFCG,ZZCWLXMC,CJR,CJSJ,ZHXGR,ZHXGSJFROM T_JZZ_YW_ZZXXWHERE ID = I.KZZD4;END IF;/* 当t_jzzyw_yx的FFR不为空且dqywhj为10时,新增一条记录到t_jzz_yw_ff*/IF I.FFR IS NOT NULL AND I.DQYWHJ = '10'THEN--V_FFID := 'FFID' || ID_JZZ.NEXTVAL;INSERT INTO T_JZZ_YW_FF@KYXX(ID, FFR, FFDW, FFSJ, LQRXM, LQRSFZH, CJR, CJSJ, ZHXGR, ZHXGSJ) VALUES(I.KZZD3,I.FFR,I.FFDWDM,I.FFRQ,I.LQR,I.LQRSFZH,I.CJR,I.CJSJ,I.GXR,I.GXSJ);END IF;UPDATE T_JZZ_YW@KYXXSET (ID,RYYWLSH,RYID,YWHJ,DQYWZT,SLLB,SLYY,SLRQ,SLDW,SLR,SFKS,SFDYLQPZ,DYLQPZSJ,SFYJF,SFZXZZ,CXRQ,CZZZCS,SLBH,CJR,CJSJ,ZHXGR,ZHXGSJ,JZZBH,XM,ZJHM,XB,CSRQ,MZ,DZ,ZZDZXZ,HZBH,JZZYXQX,JZZYXQSRQ,JZZYXJZRQ,BZRQ,JZZXPH,SFSCSB,SHENG,SHI,FWID,ZYSCBZRQ, ZALFFJE, GBFJE,SHIJB,XZQ,JZ,FWZ,JWH,PQ,GAFJ,PCS,JDDM,MPDM,CZWBH,FWCSDZ,DWDZ,YDDH,ZZSY,DYHDZ,ZZMM,ZJXY,WHCD,QYBH,XZ,JTGJ,CPHM,LSRQ,HYZK,JHRQ,POXM,POZJLX,POZJHM,SFTZ,JSZLX,JSZHM,YZRQ,JSZYXRQ, BZ,JYZK,HDQK,CZHKSZD, QH,NANGS,SFCB,ZY,PODZ,SG,RZRQ,FJH,ZZCS,JZFS,TBR,TBRQ,DWDH,ZZID,SHID,FFID,ZZXXID,JCID,DBID,HJDH,DQYWHJ) =(SELECT A.ID,A.DJBID,A.RYID,A.DQYWHJ,NVL(A.DQYWZT, '2') AS DQYWZT,A.SLLB,A.SLYY,A.SLRQ,t6.xzqmc||t6.jzmc||t6.fwzmc||t6.jwhmc||t6.cmxzmc SLDW,A.SLR,A.SFKS,A.SFDYLQPZ,A.DYLQPZRQ,A.SFYJF,A.SFCXZZ,A.CXRQ,A.CXZZCS,A.SLBH,A.CJR,A.CJSJ,A.GXR,A.GXSJ,A.SLBH,B.XM,B.GMSFHM,B.XBDM,B.CSRQ,B.MZDM,B.HJDZ,B.JZDZ,NVL(T.HZBH, T.BZ),B.YXQX,B.YXQSRQ,B.YXJZRQ,B.SLRQ,B.XPH,B.SFSCSB,SUBSTR(B.GMSFHM, 0, 2),SUBSTR(B.GMSFHM, 0, 4),B.FWID,B.HJQXDM,B.ZYSCBZRQ,B.ZALFFJE,B.GBFJE,'4406',T4.XZQDM XZQ,T4.JZDM JZ,T4.FWZDM FWZ,T4.JWHDM JWH,T4.CMXZDM PQ,T5.GAFJ,T2.PCS,T2.JLXDM JDDM,T1.MPDM,T1.DABH CZWBH,C.FWCS,C.FWCSDZ,C.YDDH,NVL(C.ZZSY, '99'),NVL(D.DYHDZ, E.DYHDZ),COALESCE(D.ZZMM, E.ZZMM,'13'), NVL(D.ZJXY, E.ZJXY),COALESCE(D.WHCD, E.WHCD,'80'), NVL(D.DWID, E.DWID),NVL(D.HJXZ, E.HJXZ),NVL(D.JTGJ, '03') AS JTGJ,NVL(D.CPHM, E.CPHM),COALESCE(D.LSRQ, E.LSRQ,D.TBSJ,SYSDATE),COALESCE(D.HYZK, E.HYZK,'1'),NVL(D.JHRQ, E.JHRQ),NVL(D.POXM, E.POXM),NVL(D.POZJLX, E.POZJLX),NVL(D.POZJHM, E.POZJHM),NVL(D.SFTZ, E.SFTZ),NVL(D.JSZLX, E.JSZLX),NVL(D.JSZHM, E.JSZHM),NVL(D.YZRQ, E.YZRQ),NVL(D.JSZYXRQ, E.JSZYXRQ),NVL(D.BZ, E.BZ),COALESCE(D.JYZK, E.JYZK,'2'),NVL(D.HDQK, E.HDQK),NVL(D.CZHKSZD, E.CZHKSZD),NVL(D.HJQH, E.HJQH),NVL(D.NANGS, E.NANGS),NVL(D.NUGS, E.NUGS),NVL(D.SFCB, E.SFCB),NVL(D.ZY, E.ZY),NVL(D.POHJDZ, E.POHJDZ),NVL(D.SG, E.SG),NVL(D.RZRQ, E.RZRQ),NVL(D.FJH, E.FJH),NVL(D.ZZCS, '无'),COALESCE(D.JZFS, E.JZFS,'05'),NULL,NULL,NULL,NULL,I.KZZD2,I.KZZD3,I.KZZD4,NULL,NULL,NULL,(CASEWHEN A.DQYWHJ IN ('01', '02') THEN'1'WHEN A.DQYWHJ IN('03', '04', '05', '07', '08', '09') THEN'2'WHEN A.DQYWHJ = '06'THEN'8'WHEN A.DQYWHJ = '10'THEN'7'END) DQYWHJFROM T_JZZYW_YX A,T_JZZXX_YX B,T_JZZYW_QTXX_YX C,T_LDRK_DJB D,T_LDRK_DJB_ZXQK E,T_LDRK_XP T,T_FWXX T1,T_FWXX_MPXX T2,T_FWXX_JLX T3,V_XZQH_ZZJG T4,T_XZQH_QX T5,v_xzqh_zzjg t6WHERE A.ID = B.JZZYWIDAND A.ID = C.JZZYWIDAND A.DJBID = D.ID(+)AND A.DJBID = E.ID(+)AND T.ID(+) = B.XPIDAND B.FWID = T1.IDAND T1.MPDM = T2.DMAND T2.JLXDM = T3.DMAND T2.XZQHDM = T4.DMAND T4.XZQDM = T5.DMAND a.sldwdm = t6.dmAND A.ID = I.ID)WHERE ID = I.ID;IF I.DQYWHJ = '10'THENINSERT INTO T_JZZ_XX@KYXX(ID,RYID,SLRQ,SLDW,SLR,SLBH,JZZBH,ZZDW,ZZRQ,FFR,FFDW,XM,ZJHM,XB,CSRQ,MZ,DZ,ZZDZXZ,HZBH,CJR,CJSJ,ZHXGR,ZHXGSJ,JZZYXQX,JZZYXQSRQ, JZZYXJZRQ, BZRQ,JZZXPH,SFSCSB,SHENG,SHI,JZZZT,FWID,XIAN,ZYSCBZRQ, SHIJB,XZQ,JZ,FWZ,JWH,PQ,GAFJ,PCS,JDDM,MPDM,CZWBH,FWCSDZ,DWDZ,YDDH,ZZSY,DYHDZ,ZZMM,ZJXY,WHCD,XZ,JTGJ,CPHM,LSRQ,HYZK,JHRQ,POXM,POZJLX,POZJHM,SFTZ,JSZLX,JSZHM,YZRQ,JSZYXRQ,BZ,JYZK,HDQK,CZHKSZD,QH,NANGS,NUGS,SFCB,ZY,PODZ,SG,RZRQ,FJH,ZZCS,JZFS,TBR,TBRQ,DWDH,HJDH,ZXBZ)SELECT A.ID,A.RYID,A.SLRQ,t6.xzqmc||t6.jzmc||t6.fwzmc||t6.jwhmc||t6.cmxzmc SLDW,A.SLR,A.SLBH,A.SLBH,A.ZZDWDM,A.ZZRQ,A.FFR,A.FFDWDM,A.FFRQ,B.XM,B.GMSFHM,B.XBDM,B.CSRQ,B.MZDM,B.HJDZ,B.JZDZ,NVL(T.HZBH, T.BZ),B.CJR,B.CJSJ,B.GXR,B.GXSJ,B.YXQX,B.YXQSRQ,B.YXJZRQ,B.SLRQ,B.XPH,B.SFSCSB,SUBSTR(B.GMSFHM, 0, 2), SUBSTR(B.GMSFHM, 0, 4), B.JZZZT,B.FWID,B.HJQXDM,B.ZYSCBZRQ,'4406',T4.XZQDM,T4.JZDM,T4.FWZDM,T4.JWHDM,T4.CMXZDM PQ,T5.GAFJ,T2.PCS,T2.JLXDM,T1.MPDM,T1.DABH,C.FWCS,C.FWCSDZ,C.YDDH,NVL(C.ZZSY, '99'),NVL(D.DYHDZ, E.DYHDZ),COALESCE(D.ZZMM, E.ZZMM,'13'),NVL(D.ZJXY, E.ZJXY),COALESCE(D.WHCD, E.WHCD,'80'),NVL(D.DWID, E.DWID),NVL(D.HJXZ, E.HJXZ),NVL(D.JTGJ, '03') AS JTGJ,NVL(D.CPHM, E.CPHM),COALESCE(D.LSRQ, E.LSRQ,D.TBSJ,SYSDATE), COALESCE(D.HYZK, E.HYZK,'1'),NVL(D.JHRQ, E.JHRQ),NVL(D.POXM, E.POXM),NVL(D.POZJLX, E.POZJLX),NVL(D.POZJHM, E.POZJHM),NVL(D.SFTZ, E.SFTZ),NVL(D.JSZLX, E.JSZLX),NVL(D.JSZHM, E.JSZHM),NVL(D.YZRQ, E.YZRQ),NVL(D.JSZYXRQ, E.JSZYXRQ),NVL(D.BZ, E.BZ),COALESCE(D.JYZK, E.JYZK,'2'),NVL(D.HDQK, E.HDQK),NVL(D.CZHKSZD, E.CZHKSZD),NVL(D.HJQH, E.HJQH),NVL(D.NANGS, E.NANGS),NVL(D.NUGS, E.NUGS),NVL(D.SFCB, E.SFCB),NVL(D.ZY, E.ZY),NVL(D.POHJDZ, E.POHJDZ),NVL(D.SG, E.SG),NVL(D.RZRQ, E.RZRQ),NVL(D.FJH, E.FJH),NVL(D.ZZCS, '无'),COALESCE(D.JZFS, E.JZFS,'05'),B.XM,B.SLRQ,NULL,NULL,NULLFROM T_JZZYW_YX A,T_JZZXX_YX B,T_JZZYW_QTXX_YX C,T_LDRK_DJB D,T_LDRK_DJB_ZXQK E,T_LDRK_XP T,T_FWXX T1,T_FWXX_MPXX T2,T_FWXX_JLX T3,V_XZQH_ZZJG T4,T_XZQH_QX T5,V_XZQH_ZZJG T6WHERE A.ID = B.JZZYWIDAND A.ID = C.JZZYWIDAND A.DJBID = D.ID(+)AND A.DJBID = E.ID(+)AND T.ID(+) = B.XPIDAND B.FWID = T1.IDAND T1.MPDM = T2.DMAND T2.JLXDM = T3.DMAND T2.XZQHDM = T4.DMAND T4.XZQDM = T5.DMAND a.sldwdm = t6.dmAND A.ID = I.ID;END IF;END IF;/*打上标志,确认该条数据已经转换成功*/UPDATE KY_T_JZZYW_YX SET FLAG = 'Y'WHERE ID = I.ID;EXCEPTIONWHEN OTHERS THENROLLBACK;V_ERRORS := SUBSTR(SQLERRM, 1, 200);UPDATE KY_T_JZZYW_YX SET FLAG = 'N'WHERE ID = I.ID;INSERT INTO T_ERROR_LOG_TOOLD(TYPE, ERRORMSG, XRSJ, YWID)VALUES(C_TABLE_NAME, V_ERRORS, SYSDATE, I.ID);END;COMMIT;END LOOP;/*删除OPERATION='DE'的数据*/UPDATE KY_T_JZZYW_YX SET FLAG = 'Y'WHERE OPERATION = 'DE';DELETE FROM T_JZZ_YW@KYXXWHERE ID IN (SELECT ID FROM KY_T_JZZYW_YX A WHERE OPERATION = 'DE');DELETE FROM T_JZZ_XX@KYXXWHERE ID IN (SELECT ID FROM KY_T_JZZYW_YX A WHERE OPERATION = 'DE'); COMMIT;/*把已经转换到新库的数据放到历史表中,进行归档*/INSERT INTO KY_T_JZZYW_YX_GD(ID,DJBID,RYID,DQYWHJ,DQYWZT,SLLB,SLYY,SLRQ,SLDWDM,SLR,SFKS,SFDYLQPZ,DYLQPZRQ,SFYJF,HZBH,HZFFRQ,HZFFR,SFSH,SHSFTG,SHBTGYY,SHR,SHRQ,SHDW,SFZZ,ZZDWDM,ZZRQ,SFCXZZ,BLSFFF,BLFFPH,BLFFDWDM,BLFFR,BLFFRQ,JSDWDM,JSR,JSRQ,SFFF,FFR,FFDWDM,FFRQ,LQR,LQRQ,CXLX,CXNR,CXDW,CXR,CXRQ,BZ,SJCSPH,CJR,CJSJ,GXR,GXSJ,SFTH,SFZZYW,SFDCL,SFCX,ZZSFCG,ZZSBYY,SFDZZ,DZZRQ,ZZPH,CXZZCS,SLBH,LQRSFZH,KZZD1,KZZD2,KZZD3,KZZD4,KZZD5,KZZD6,FLAG,OPERATION, XZQ,XRSJ)SELECT ID,DJBID,RYID,DQYWHJ,DQYWZT,SLLB,SLYY,SLRQ,SLDWDM,SLR,SFKS,SFDYLQPZ, DYLQPZRQ, SFYJF,HZBH,HZFFRQ,HZFFR,SFSH,SHSFTG,SHBTGYY, SHR,SHRQ,SHDW,SFZZ,ZZDWDM,ZZRQ,SFCXZZ,BLSFFF,BLFFPH,BLFFDWDM, BLFFR,BLFFRQ,JSDWDM,JSR,JSRQ,SFFF,FFR,FFDWDM,FFRQ,LQR,LQRQ,CXLX,CXNR,CXDW,CXR,CXRQ,BZ,SJCSPH,CJR,CJSJ,GXR,GXSJ,SFTH,SFZZYW,SFDCL,SFCX,ZZSFCG,ZZSBYY,SFDZZ,DZZRQ,ZZPH,CXZZCS,SLBH,LQRSFZH,KZZD1,KZZD2,KZZD3,KZZD4,KZZD5,KZZD6,FLAG,OPERATION,XZQ,SYSDATEFROM KY_T_JZZYW_YXWHERE FLAG = 'Y';DELETE FROM KY_T_JZZYW_YX WHERE FLAG = 'Y'; COMMIT;END TOOLD_T_JZZYW_YX_ALL;。
pg简单存储过程
pg简单存储过程PG简单存储过程存储过程是一种预定义的可重用的数据库操作,可以将一系列的SQL语句封装在一个单独的代码块中。
在PostgreSQL(简称PG)中,存储过程是由PL/pgSQL语言编写的。
本文将介绍PG简单存储过程的基本概念、语法和应用场景。
一、概述PG简单存储过程是一种在PG数据库中创建、调用和管理的存储过程。
它可以帮助开发人员提高数据库操作的效率和可维护性。
存储过程可以被认为是一种“子程序”,它接收输入参数并返回结果。
二、语法PG简单存储过程使用PL/pgSQL语言编写,具有以下基本语法结构:```CREATE OR REPLACE FUNCTION function_name (input1 data_type, input2 data_type, ..., output1 data_type, output2 data_type, ...)RETURNS return_type AS $$DECLARE-- 声明变量BEGIN-- 执行SQL语句-- ...RETURN (output1, output2, ...);END;$$ LANGUAGE plpgsql;```其中,function_name是存储过程的名称,input1、input2等是输入参数的名称和数据类型,output1、output2等是输出参数的名称和数据类型,return_type是返回结果的数据类型。
三、示例下面是一个简单的PG存储过程的示例,计算两个整数的和并返回结果:```CREATE OR REPLACE FUNCTION calculate_sum (a INTEGER, b INTEGER, OUT sum INTEGER)RETURNS INTEGER AS $$BEGINsum := a + b;RETURN sum;END;$$ LANGUAGE plpgsql;```四、调用PG简单存储过程可以通过使用CALL语句来调用,如下所示:```CALL calculate_sum(2, 3, sum);```其中,calculate_sum是存储过程的名称,2和3是输入参数的值,sum是输出参数的名称。
oracle 存储过程中调用存储过程的方法
在Oracle存储过程中,你可以通过两种主要的方法调用另一个存储过程:1. 使用EXECUTE 或EXEC 语句:EXECUTE procedure_name(parameters);--或者EXEC procedure_name(parameters);这里,procedure_name是要调用的存储过程的名称,parameters是传递给存储过程的参数。
你需要根据实际情况提供正确的参数值。
2. 使用CALL 语句:CALL procedure_name(parameters);与EXECUTE或EXEC语句类似,CALL语句也用于调用存储过程。
以下是一个简单的例子,演示了如何在Oracle存储过程中调用另一个存储过程:--存储过程1CREATE OR REPLACE PROCEDURE Procedure1 ASBEGINDBMS_OUTPUT.PUT_LINE('Procedure 1 is executed.');END;/--存储过程2,调用存储过程1CREATE OR REPLACE PROCEDURE Procedure2 ASBEGINDBMS_OUTPUT.PUT_LINE('Procedure 2 is executing Procedure 1.');EXECUTE Procedure1;--或者使用CALL 语句-- CALL Procedure1;END;/在这个例子中,Procedure2调用了Procedure1。
在实际情况中,你可能需要传递参数给被调用的存储过程。
请注意,在存储过程中调用其他存储过程时,确保被调用的存储过程已经存在,并且你对其有执行权限。
如果需要传递参数,确保参数的数量和类型与被调用的存储过程的定义相匹配。
练习题6--存储过程1
有关存储过程的练习素材1.使用以下语句创建数据库test Create database test 2.数据表employee,表结构如下所示:employee eid 员工编号int Not null ename 员工姓名char(10) Not null salary 工资int Not null did 部门编号int 数据表department,表结构如下:department did 部门编号int Not null dname 部门名称char(10) Not null 使用以下语句创建employee表Create table employee (eid int not null, ename char(10) not null, salary int not null, did int) 使用以下语句创建department表Create table department (did int not null, Dname char(10) not null) 具体要求针对以上数据表完成以下操作,并将对应的SQL脚本依次保存至“6.doc”文件。
1.建立存储过程p_1_1,输入员工编号、员工姓名、工资和部门编号。
2.建立存储过程p_1_2,输入部门编号和部门名称。
3.建立存储过程p_1_3,根据输入的部门编号,返回该部门员工的工资总额。
4.建立存储过程p_1_4,根据输入的部门编号,返回工资小于该部门平均工资的员工的员工编号、姓名、工资。
5.建立存储过程p_1_5,根据输入的部门编号,采用游标方式按下列格式输出该部门的所有员工的信息。
员工编号员工姓名工资------------------------------------------- 6.建立存储过程p_1_6,根据输入的部门编号,返回每个部门的部门名称和该部门第1 页共2 页的平均工资(avg_sal)第2 页共2 页。
MySQL存储过程in、out和inout参数示例和总结
MySQL存储过程in、out和inout参数⽰例和总结存储过程1.创建存储过程并查看全局变量mysql> create database yy;Query OK, 1 row affected (0.00 sec)mysql> use yy;Database changedmysql> set @num1=10,@num2=20,@num3=30; //设置全局变量mysql> delimiter $$mysql> create procedure p(in num1 int,out num2 int,inout num3 int)-> begin-> select num1,num2,num3;-> set num1=100,num2=200,num3=300;-> select num1,num2,num3;-> end $$Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;mysql> call p(@num1,@num2,@num3);总结1:in 和 inout 参数会将全局变量的值传⼊存储过程中,⽽ out 参数不会将全局变量的值传⼊存储过程中。
在存储过程使⽤中,参数值 in、out、inout 都会发⽣改变。
2.调⽤存储过程时全局变量值的变化mysql> select @num1,@num2,@num3;总结2:当调⽤完存储过程后,发现 in 参数不会对全局变量的值引起变化,⽽ out 和 inout 参数调⽤完存储过程后,会对全局变量的值产⽣变化,会将存储过程引⽤后的值赋值给全局变量。
in参数赋值类型可以是变量还有定值,⽽out和inout参数赋值类型必须是变量。
到此这篇关于MySQL存储过程in、out和inout参数⽰例和总结的⽂章就介绍到这了,更多相关MySQL存储过程in、out和inout参数内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何创建存储过程
定义存储过程的语法
CREATE PROC[EDURE] 存储过程名 @参数1 数据类型 = 默认值 inPUT, …… , @参数n 数据类型 = 默认值 AS SQL语句 GO 和C语言的函数一样,参数可选 参数分为输入参数、输出参数 输入参数允许有默认值
由用户在自己的数据库中创建的存储过程 类似C语言中的用户自定义函数
Hands-On实训教程系列
常用的系统存储过程 4-1
系统存储过程
sp_databases sp_helpdb sp_renamedb sp_tables
说明
列出服务器上的所有数据库。 报告有关指定数据库或所有数据库的信息 更改数据库的名称 返回当前环境下可查询的对象的列表
Hands-On实训教程系列
输入参数的默认值3-2
CREATE PROCEDURE proc_stu @writtenPass int=60, 笔试及格线:默认为60分 @labPass int=60 机试及格线:默认为60分 AS print '--------------------------------------------------' print ' 参加本次考试没有通过的学员:' SELECT stuName,stuInfo.stuNo,writtenExam, labExam FROM stuInfo INNER JOIN stuMarks ON 查询没有通过考试的学员 stuInfo.stuNo=stuMarks.stuNo WHERE writtenExam<@writtenPass OR labExam<@labPass GO
Hands-On实训教程系列
输入参数的默认值3-1
带参数的存储过程确实比较方便,调用者 可根据试卷的难易度,随时修改每次考试 的及格线
问题:
如果试卷的难易程度合适,则调用者还是必须 如此调用: EXEC proc_stu 60,60,比较麻烦 这样调用就比较合理: EXEC proc_stu 55 笔试及格线55分,机试及格线默认为60分 EXEC proc_stu 笔试和机试及格线都默认为标准的60分
存储过程
回顾
事务具有ACID四个属性,它们是? 管理控制事务的常用T-SQL语句有哪些? 索引分为哪几类? 您在stuInfo表中创建了主键列stuNo, SQL Server将自动创建哪些索引?
根据您的理解,什么是视图?它有什么好处?
Hands-On实训教程系列
本章目标
创建数据库bankDB,要求保存在D:\bank
创建文件夹D:\bank USE master GO EXEC xp_cmdshell 'mkdir d:\bank', NO_OUTPUT IF EXISTS(SELECT * FROM sysdatabases WHERE name='bankDB') DROP DATABASE bankDB GO CREATE DATABASE bankDB ( … ) 查看文件夹D:\bank GO EXEC xp_cmdshell 'dir D:\bank\' --查看文件
存储过程相当于C语 言中的函数
int s;
s =a+b; return s ; }
Hands-On实训教程系列
什么是存储过程 2-2
存储过程可以包含数据操纵语句、变量、逻辑 控制语句等
单个 SELECT 语句
存储过程
----------------------
SELECT 语句块
SELECT语句与逻辑 控制语句
Hands-On实训教程系列
输入参数的默认值3-3
调用带参数默认值的存储过程
EXEC proc_stu --都采用默认值 EXEC proc_stu 64 --机试采用默认值 EXEC proc_stu 60,55 --都不采用默认值
--错误的调用方式:希望笔试采用默认值,机试及格线55分 EXEC proc_stu ,55 --正确的调用方式: EXEC proc_stu @labPass=55
Hands-On实训教程系列
带输入参数的存储过程3-3
调用带参数的存储过程
假定本次考试机试偏难,机试的及格线定为55分,笔试 及格线定为60分
EXEC proc_stu 60,55
--或这样调用: EXEC proc_stu @labPass=55,@writtenPass=60
机试及格线降分后,李斯文 (59分)成为“漏网之鱼”了
带输出参数的存储过程 3-3
调用带输出参数的存储过程
/*---调用存储过程----*/ 调用时必须带OUTPUT关键字 , 返回结果将存放在变量@sum中 DECLARE @sum int EXEC proc_stu @sum OUTPUT ,64 print '--------------------------------------------------' 后续语句引用返回结果 IF @sum>=3 print '未通过人数:'+convert(varchar(5),@sum)+ '人, 超过60%,及格分数线还应下调' ELSE print '未通过人数:'+convert(varchar(5),@sum)+ '人, 已控制在60%以下,及格分数线适中' GO
Hands-On实训教程系列
带输出参数的存储过程 3-1
如果希望调用存储过程后,返回一个或多个值,这 时就需要使用输出(OUTPUT)参数了 问题:
修改上例,返回未通过考试的学员人数。
Hands-On实训教程系列
带输出参数的存储过程 3-2
CREATE PROCEDURE proc_stu 输出(返回)参数: @notpassSum int OUTPUT, 表示没有通过的人数 @writtenPass int=60, @labPass int=60 推荐将默认参数放后 AS …… SELECT stuName,stuInfo.stuNo,writtenExam, labExam FROM stuInfo INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo 统计并返回没有通 过考试的学员人数 WHERE writtenExam<@writtenPass OR labExam<@labPass SELECT @notpassSum=COUNT(stuNo) FROM stuMarks WHERE writtenExam<@writtenPass OR labExam<@labPass GO Hands-On实训教程系列
演示:常用的存储过程
Hands-On实训教程系列
常用的系统存储过程 4-3
常用的扩展存储过程:xp_cmdshell
可以执行DOS命令下的一些的操作 以文本行方式返回任何输出 调用语法: EXEC xp_cmdshell DOS命令 [NO_OUTPUT]
Hands-On实训教程系列
常用的系统存储过程 4-4
调用存储过程
EXECUTE(执行)语句用来调用存储过程 调用的语法
EXEC 过程名 [参数] EXEC proc_stu
Hands-On实训教程系列
创建带参数的存储过程
存储过程的参数分两种:
输入参数
输出参数
c=sum(5, 8)
传入参数值
int sum (int a, int b)
输入参数: { 用于向存储过程传入值,类 似C语言的按值传递; int s;
输出参数: 用于在调用存储过程后, 返回结果,类似C语言的 按引用传递;
s=a+b;
return s;
返回结果
Hands-On实训教程系列
}
带输入参数的存储过程3-1
问题:
修改上例:由于每次考试的难易程度不一样,每次 笔试和 机试的及格线可能随时变化(不再是60分),这导致考试的 评判结果也相应变化。
分析:
在述存储过程添加2个输入参数: @writtenPass 笔试及格线 @labPass 机试及格线
Hands-On实训教程系列
带输入参数的存储过程3-2
CREATE PROCEDURE proc_stu 输入参数:笔试及格线 @writtenPass int, @labPass int 输入参数:机试及格线 AS print '--------------------------------------------------' print ' 参加本次考试没有通过的学员:' SELECT stuName,stuInfo.stuNo,writtenExam, labExam FROM stuInfo 查询没有通过 INNER JOIN stuMarks ON 考试的学员 stuInfo.stuNo=stuMarks.stuNo WHERE writtenExam<@writtenPass OR labExam<@labPass GO
Hands-On实训教程系列
创建不带参数的存储过程 2-1
问题:请创建存储过程,查看本次考试平均分以及未通过 考试的学员名单
Hands-On实训教程系列
创建不带参数的存储过程 2-2
CREATE PROCEDURE proc_stu proc_stu为存储过程的名称 AS DECLARE @writtenAvg float,@labAvg float 笔试平均分和机 SELECT @writtenAvg=AVG(writtenExam), 试平均分变量 @labAvg=AVG(labExam) FROM stuMarks print '笔试平均分:'+convert(varchar(5),@writtenAvg) print '机试平均分:'+convert(varchar(5),@labAvg) IF (@writtenAvg>70 AND @labAvg>70) 显示考试成绩的等级 print '本班考试成绩:优秀' ELSE print '本班考试成绩:较差' print '--------------------------------------------------' print ' 参加本次考试没有通过的学员:' SELECT stuName,stuInfo.stuNo,writtenExam,labExam FROM stuInfo INNER JOIN stuMarks ON 显示未通过的学员 stuInfo.stuNo=stuMarks.stuNo WHERE writtenExam<60 OR labExam<60 GO Hands-On实训教程系列