注册
可以套用的简单存储过程模板(适用初次使用达梦数据库者)
技术分享/ 文章详情 /

可以套用的简单存储过程模板(适用初次使用达梦数据库者)

阿杰升级路 2023/12/19 1394 0 0

模板技术应用:显示游标,sqlServer表变量改写等
写的目的:为了让像我一样初次使用数据库的小白能下手
有写的不对的地方,多多批评指正!!!谢谢


--or REPLACE 是替换,但是提前是要有这个模式的权限
CREATE or REPLACE PROCEDURE PROCName
(    
param1 in int,    
param2  in varchar(1024),
intReturn OUT INT  --输出参数
 )    
AS    
/*
--建议:在存储过程中用到的变量尽量都定义为全局变量,要不然很容易找不见结尾(当然这是我自身的问题)
*/      
  param4 varchar(20);  
  param5 varchar(100);  
  --记录,这个地方我是为了改写sqlserver的表变量
  TYPE record_table  is record (val varchar(128));
  TYPE v_table  IS TABLE OF record_table ;
  temp_Change v_table ;  
  strfields varchar(500);   
  strconvertfields varchar(1000);
  sqlStr varchar(2000); 
begin

 --批量的,此处就实现了了改写sql server表变量
  SELECT  val BULK COLLECT INTO temp_Change  from table(KF_PUB_SPLITSTRBYCHAR('a=1&b=2&c=3&','&'));

 --select语法赋值多个变量  
 select a,b into c,d from table 

 --当前时间   格式 2023-12-19 15:00:06
       SELECT getdate(0) ;

  --赋值,两种方式都可以 intReturn :=0
  set intReturn=0;     

   --字符串拼接函数 
   select 
   listagg(
     substring(val,1,REGEXP_INSTR(val,'=')-1)+'=convert(varchar(256),'+substring(val,1,REGEXP_INSTR(val,'=')-1)+') '
        ,',') into strconvertfields
   from  TABLE (KF_PUB_SPLITSTRBYCHAR('a=1&b=2&c=3&','&')); 
  --字段
   select 
   listagg(
         substring(val,1,REGEXP_INSTR(val,'=')-1)+''
          ,',') into strfields
   from TABLE(KF_PUB_SPLITSTRBYCHAR('a=1&b=2&c=3&','&'));
    
      --这块不能用using,不清楚为啥,总在strfields 这里报错;
      --具体原因没研究明白
	EXECUTE IMMEDIATE('
	insert into a (id,Alias,fields)
	select v.id, f.Alias, t. oldval from tableName1 f
	inner join
	(
		select  id='||intid||',areacode='||intAreaCode||', fields=substring(val, 1, REGEXP_INSTR(val,''='')-1) ,
		newval=substring(val, REGEXP_INSTR(val,''='')+1, len(val))
		from TABLE(KF_PUB_SPLITSTRBYCHAR('a=1&b=2&c=3&', ''&''))
	) v on v.code=f.Code and v.fields=f.Item
	inner join
	(
		select '||strconvertfields||' from  tableName2 where id='''+param6+''' and code='||+param7+||'
	) aa
	unpivot(
	oldval for fields in('||strfields||')
	       ) t on v.fields=t.fields');       
   commit;

     --游标简单用法
     declare --定义游标开始
	 stritem varchar(256);
        CURSOR curData is
        select item from tableName where id in(
            select val From  TABLE (KF_PUB_SPLITSTRBYCHAR('7,8,9,',','))) ORDER BY Orders;  
      begin 
       --打开游标
        open curData;  
        loop 
        --下一行
         fetch curData  into stritem; 
         --使用 %NOTFOUND 来判断是否处理完数据并退出循环,要不然一直进入游标,我在调试的时候,如果不判断,就一直进入游标,所以我认为
         是因为会再次打开一个已打开的游标,游标会被重新初始化
         EXIT WHEN curData%NOTFOUND; 
        -- 这个就是改写表变量后的用法   
         select val into strChange from table(temp_Change) where val like ''||'%'||stritem||'=%'||'';
        --这块开始到end if 就是自己业务了;
               if val1='value' or val1='value'    
                 THEN    
                  set intReturn=-4;   
          	   EXIT;  --退出 
        	end IF; 
     --动态sql,这个地方也是不能using,没闹懂啥情况。
     set sqlStr='update tableName set '||param9||' where a='||cast(a as varchar(20))||';   
          --执行动态语句
     EXECUTE IMMEDIATE (sqlStr); 
         commit;
   end loop;--游标循环结尾
    --关闭游标   
   close curData;  
 end;--定义游标结束
EXCEPTION
when others then
    intreturn :=-1; 
    print SQLCODE'||$$PLSQL_LINE';
    --这个地方看不到print;
    ROLLBACK; 
END;
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服