关于SQL存储过程使用游标循环的问题
现有三张表a、b、c,如果循环a表,把a表的某个数据作为b表的查询条件,如果b表满足条件就把数据插入C表,怎么创建这个存储过程?...
现有三张表a 、b、c,如果循环a 表,把a表的某个数据作为b表的查询条件,如果b表满足条件就把数据插入C表,怎么创建这个存储过程?
展开
3个回答
展开全部
你把具体需要做到什么,把内容写出来,还有a,b,c,3个表的表结构及关系,我来给你写存储过程,你只这样草草的说,我写出来的代码你也用不了的
游标/循环,尽量有别的方法还是不要用,数据多的话,速度很慢很慢的,贴出来我给你看看有什么别的方法替代的吗
游标/循环,尽量有别的方法还是不要用,数据多的话,速度很慢很慢的,贴出来我给你看看有什么别的方法替代的吗
更多追问追答
追答
insert into c(ID,Card,FenZhi)
select b.ID,b.Card,b.Kcid from a inner join b on a.Card=b.Card
where lastLeanTime=convert(varchar(10),getdate()) and LearnTime>20
我大概明白了,是不是这样
就是b表中有和a表中Card相同,LearnTime>20,且当天的数据,就插入到c中
如果是这样用什么循环啊,能不用游标和循环,就尽量不要用
简单说下我这段代码:
你插入到C表中,如果ID列是自动增加的,就不要ID插入,会自动生成的
你只是要b中Card在a表中有的,就没有必要再循环/游标了,太浪费时间
不明白就接着问我
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
循环嵌套的格式打给你写了一下 以参考一下换上你的数据就行:
CREATE OR REPLACE PROCEDURE P_name
AS
定义变量如:
V$PO_NO VARCHAR2(20);
V$ITM_CD VARCHAR2(20);
V$ITM_CD1 VARCHAR2( 40);
CURSOR CUR_A
IS
SELECT *
FROM a;
CURSOR CUR_B
IS
SELECT *
FROM B;
BEGIN
OPEN CUR_A;
LOOP
FETCH CUR_A INTO 变量V$PO_NO;
EXIT WHEN CUR_A%NOTFOUND;
循环处理;
OPEN CUR_B;
LOOP
FETCH CUR_B INTO 变量V$ITM_CD;
EXIT WHEN CUR_B%NOTFOUND;
次循环处理;
END LOOP ;
CLOSE CUR_B;
END LOOP ;
CLOSE CUR_A;
COMMIT;
异常处理:
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE( '无值');
ROLLBACK;
WHEN OTHERS THEN
P$RET:= SQLCODE;
ROLLBACK;
END;
CREATE OR REPLACE PROCEDURE P_name
AS
定义变量如:
V$PO_NO VARCHAR2(20);
V$ITM_CD VARCHAR2(20);
V$ITM_CD1 VARCHAR2( 40);
CURSOR CUR_A
IS
SELECT *
FROM a;
CURSOR CUR_B
IS
SELECT *
FROM B;
BEGIN
OPEN CUR_A;
LOOP
FETCH CUR_A INTO 变量V$PO_NO;
EXIT WHEN CUR_A%NOTFOUND;
循环处理;
OPEN CUR_B;
LOOP
FETCH CUR_B INTO 变量V$ITM_CD;
EXIT WHEN CUR_B%NOTFOUND;
次循环处理;
END LOOP ;
CLOSE CUR_B;
END LOOP ;
CLOSE CUR_A;
COMMIT;
异常处理:
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE( '无值');
ROLLBACK;
WHEN OTHERS THEN
P$RET:= SQLCODE;
ROLLBACK;
END;
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
--方法就这些 具体还是要你自己 理解 怎么灵活运用
begin tran
declare @aID int
declare cur4 cursor for
SELECT a.[ID] from tbA
OPEN cur4
fetch cur4 into @aID
while @@FETCH_STATUS = 0
BEGIN
------------------------------
INSERT INTO tbC (tbC.cls01,tbC.cls02)
SELECT tbB.cls01,tbB.cls02 FROM tbB WHERE tbB.cls01=@aID
--------------------------
fetch cur4 INTO @aID
END
close cur4
deallocate cur4
if @@error<>0 or @@rowcount<>1
begin
rollback tran
end
else
begin
commit tran
end
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询