初识DB2存储过程的基本语法

2023-10-01 14:58

工作需要首先接触DB2存储过程(论文)

存储案例分析语法知识

创建  替换 程序 PRO_DAT_BATCH() --创建名称PRO_DAT_BATCH的存储程序BEGIN --存储过程启动标志 DECLARE sqlcode INTEGER  默认 0; - - sqlcode是存储过程代码号,默认为0,发生异常时sqlcode发生变化,不同的异常代码号不同。 DECLARE code1 VARCHAR(50); -- DECL ARE 定义变量代码1 变量名称 VARCHAR (50) 变量类型 DECLARE @dayBatchId varchar(50);声明@exeBatchIdvarchar(50);声明 @proName varchar(64);声明 v_sql VARCHAR (1024);DECLARE v_count INTEGER;--EXIT 将被执行执行异常之后 FOR SQLEXCEPTION 之后的语句或块的执行完全停止。向下; CONTINUE 选项将在异常后继续执行 DECLARE EXIT HANDLER  FOR SQL异常代码1 =0;声明继续处理程序FOR SQLEXCEPTION SET 代码 1 = to_char( sqlcode);SET代码1= '0'; --将code1赋给' 0'COMMIT; --执行的语句有的成功,有的不成功。另外,与事务类似,所有执行都有成功或失败的情况,不会造成数据混乱。 UPDATE DAY_BATCH --更新名为 DAY_BATCH 的表,ID =@dayBatchId 值为 '0' 的字段的 sql-code 为 '0'...SET SQL_CODE  = '0',BATCH_STS ='1' ,START_DATE =  CURRENT_TIMESTAMP地点 ID = @dayBatchId;开始 --存储过程和其他语言中的BeginEnd 大括号本身没有交易功能。它们主要有两个功能--1。让报表结果清晰--2.语句块函数,如用在if之后。 ? WITH保持FOR选择ID PRO_NAME来自DAY_BATCH地点状态 = 1 EXE_SORT_NUM >0订单 BY EXE_SO RT_NUM;- -打开光标OPEN@dayBatchList;UPDATEDAY_BATCHSET备注=RTRIM(CHAR(v_count)) 哪里 ID = @dayBatchId ;WHILE (v_count > 0 AND代码1='0') DO --while 循环语句 DO **执行代码** END WHILE;FETCH @dayBatchList INTO @exeBatchId,@proName;--提取游标中的数据--执行存储过程SET v_sql =  '呼叫' || @proName; 更新DAY_BATCH设置PRO_NAME=@exeBatchId||':'||  v_sql 哪里 ID = @dayBatchId--动态sqlPREPARE s1 FROM v_s ql;执行 s1;? 1;更新DAY_BATCH设置备注=备注|| ','  | | v_sql 哪里 ID =@dayBatchIdEND同时;--结束呼叫 INSERT_BEACH_CONTROL_CABIN_AGE();--调用名为INSERT_BEACH_CONTROL_CABIN_AGE的存储过程。 提交;关闭@dayBatchList;--关闭光标UPDATEDAY_BATCHSET备注=备注 || ','  ||  RTRIM(CHAR( v_count)) 何处 ID =   @dayBatchId;END;  --存储过程结束----小知识点ROLLBACK;--回滚SELECT DISTINCT 来自 DISTINCT--过滤重复结果集 CURRENT_TIMESTAMP --针对当前时间 --判断A表和B表是否满足on 中的条件并满足 Just更新。如果不满足,请插入 MERGE INTO [目标- 桌子] A 使用 [-sql] B ON([条件表达式][...]...) 何时 匹配 然后[] 更新sql]何时 不是 匹配 那么[INSERT sql]-- 如果存在的意思是“是否存在”。它确定存储过程是否存在。如果存在,请将其删除。如果不存在,则创建它。 如果存在选择* 来自系统.对象其中名称='proc_get_student')) 

游标概念:游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用是临时存储从数据库中提取的数据块。在某些情况下,需要将存储在磁盘上的表中的数据传输到计算机内存中进行处理,最后显示处理结果或写回数据库。这样,数据处理的速度就会得到提高,否则频繁的磁盘数据交换会降低效率。

游标有两种类型:显式游标和隐式游标。上述程序中使用的SELECT...INTO...查询语句一次只能从数据库中提取一行数据。对于这种形式的查询和DML操作,系统将使用隐式游标。但如果要提取多行数据,程序员就必须定义一个显式的游标,并通过游标相关的语句进行处理。显式游标对应于返回多行和多列的 SELECT 语句。

一旦游标打开,数据就会从数据库传输到游标变量,然后应用程序从游标变量中分解所需的数据并进行处理。
简单来说,当你想要一项一项地处理数据时,可以使用游标。

游标的使用分为以下4个步骤:

1. 声明光标
按以下格式在 DECLEAR 部分声明光标:

DECLARE 光标名称 CURSOR WITH HOLD F OR  SELECT 语句 ;

参数是可选部分,定义的参数可以出现在SELECT语句的WHERE子句中。如果定义了参数,则打开游标时必须传入相应的实际参数。
SELECT 语句是表或视图的查询语句,甚至可以是联合查询。您可以使用 WHERE 条件、ORDER BY 或 GROUP BY 子句,但不能使用 INTO 子句。在定义游标之前定义的变量可以在 SELECT 语句中使用。
2. 打开游标
在可执行部分,打开游标,格式如下:
OPEN游标名称;
打开游标时,将SELECT语句的查询结果传输到游标中工作区。
3. 提取数据
在可执行部分,将光标工作区中的数据按以下格式提取到变量中。获取操作必须在打开游标后执行。
FETCH 游标名 INTO 变量名 1,变量名 2...;

FETCH @dayBatchList INTO @exeBatchI d ,@proName;


FETCH 游标名称 INTO 记录变量;
光标打开后,有一个指针指向数据区。 FETCH 语句一次返回指针指向的一行数据。要返回多行,需要重复执行。可以使用循环语句来实现。通过判断光标的属性可以进行控制循环。
这两种格式解释如下:
第一种格式的变量名是用于接收光标数据的变量,需要提前定义。变量的数量和类型应与SELECT语句中字段变量的数量和类型一致。
第二种格式一次将一行数据放入记录变量中。您需要使用%ROWTYPE提前定义记录变量。这种形式使用起来比较方便,不必单独定义和使用多个变量。
定义记录变量的方法如下:
变量名 表名 |游标名%ROWTYPE;
表必须存在,并且必须先定义游标名称。
4. 关闭游标
CLOSE 游标名称;
显式游标打开后,必须显式关闭。游标一旦关闭,游标占用的资源就被释放,游标就失效了,必须重新打开才能使用。

准备动态sql:

声明 v_sql varchar(4000)默认 '';--动态sql可以看这里声明了一个变量,字符串,默认值为空字符串 --程序开始--Table--if upper(v_lx  )  = 'T' 然后如果   存在选择 1 来自 sysibm 其中 table_schema  = 'PAS' 表名= ltrim(rtrim(替换() 上(v_ccmc), 'PAS。​​','')))) 然后设置v_sql ='掉落桌子'||v_ccmc;准备 s1  from v_sql; 并声明这里的这个变量是动态的sql,然后执行。如果没有声明,变量本身可以用作参数execute s1;end if;结束如果;

动态sql:

假设我们声明两个变量声明 v_sql varchar(4000) default ''; (动态sql语句,默认值为空字符串),声明v_cmcc varchar(40); (传入的值为jxdx_ckzh)

,给变量集赋值 v_sql=‘drop table’||v_ccmc

然后我们使用execute来执行这条sql。执行的语句是drop table jxdx_ckzh

如果不声明为动态sql:

直接使用execute执行v_sql:excute v_sql

执行的是drop table v_cmcc。删除的是这张表

存储过程的错误处理示例:

错误处理有几种声明形式:
§ 如果有任何错误(未找到NOT将l_error设置为1后继续执行:
声明 继续 处理者 对于 SQL异常
SET l_error=1;
§ 如果发生任何错误(不是 NOT FOUND),则在生成错误消息后执行 ROLLBACK 并退出当前块或存储过程。
声明 退出 处理者 FOR  SQL异常
开始
回滚;
SELECT '发生错误 – 终止';
END;§ 如果MySQL出现1062错误(重复键值),执行SELECT语句后继续执行(向调用程序发送消息)
声明 继续交给用于 1062
SELECT '索引中有重复键';
§ 如果出现 SQLSTATE 2300 错误(重复键值),则执行SELECT语句后继续执行(向调用程序发送消息)
声明 继续处理FOR SQLSTATE '23000'
SELECT '索引中有重复键';
§ 当游标或SQL select 语句没有返回值时,设置 l_done=1 并继续执行。
声明 继续 处理者 对于不是
成立
SET l_done=1;
§ 此示例与前面的示例相同,只是它使用 SQLSTATE 变量而不是命名条件
声明 继续 处理者 对于 SQLSTATE '02000 '
SET l_done=1;
§ 此示例与前两个示例相同,只是它使用 MySQL 错误代码变量而不是命名条件或 SQLSTATE 变量。
声明 继续 处理者 对于1329SET l_done=1;