模板技术应用:显示游标,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;
文章
阅读量
获赞