用储存过程写循环插入,插入的值总是第一个值

-一个大坑 2017-06-08 02:19:36

create or replace procedure P_CarMaintainRemindEamil is

CARNO varchar2(50); --待保養車牌
MAILADDRESS VARCHAR2(500); --收件人地址
SUMCAR NUMBER; --統計待保養車輛

cursor mycursor is
SELECT A.CARNO FROM BD_CAR A where sysdate < A.MAINTAINTODATE;

begin

SELECT COUNT(A.CARNO)
INTO SUMCAR
FROM BD_CAR A
where sysdate < A.MAINTAINTODATE;
open mycursor;

IF SUMCAR > 0 THEN
LOOP
fetch mycursor
INTO CARNO;

exit when mycursor%notfound;

SELECT max(B.MAIL)
INTO MAILADDRESS
FROM BD_CARANDDRIVER A, EMPLOYEE B
WHERE A.CARNO = CARNO
AND A.DRIVERNAME = B.CNAME
AND A.ISVALID = '1'; --查询司机邮件地址

INSERT INTO CIMAPGROUP
values
(CARNO, MAILADDRESS, '1', '1', '1', '1', '1'); --插入车牌没问题。司机邮件地址都是一个

END LOOP;
END IF;

end P_CarMaintainRemindEamil;
...全文
436 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
-一个大坑 2017-06-09
  • 打赏
  • 举报
回复
引用 16 楼 qq_38884602 的回复:
[quote=引用 15 楼 happy4944 的回复:] [quote=引用 13 楼 qq_38884602 的回复:] 发两张表的结构 你现在发的是你的查询结果 我现在感觉你的表设计有问题
车牌和驾驶证是key,不过要查邮箱的那个表是工号做主键。帖子我先结了吧,我现在也不知道怎么弄了,问下组长再说[/quote] 你这个张表的USERID是不是你说的工号啊 [/quote] 不是,这是记录修改人员id,这样数据有问题知道是谁录入错了。 刚刚尝试了下,都是一个表,数据没有重复还是得加max()才行

CREATE OR REPLACE PROCEDURE P_DRIVERLICENCEMAIL IS

  DRIVERNAME  VARCHAR2(20); --待換證司機姓名
  SUBJECT     VARCHAR2(100); --郵件主題
  MAILCONTENT VARCHAR2(5000); --郵件內容
  MAILADDRESS VARCHAR2(500); --收件人郵箱地址
  LICENCEDATE DATE; --駕駛證到期日期
  SUMDRIVER   NUMBER; --統計待換證司機
  LICENCENO   VARCHAR2(50); --駕駛證號

  CURSOR MYCURSOR IS
    SELECT A.DRIVERNAME FROM BD_DRIVER A where sysdate < A.LICENSEVALTO;

BEGIN

  SELECT COUNT(A.DRIVERNAME)
    INTO SUMDRIVER
    FROM BD_DRIVER A
   WHERE SYSDATE < A.LICENSEVALTO; --統計待換證司機
  OPEN MYCURSOR;

  IF SUMDRIVER > 0 THEN
    LOOP
      FETCH MYCURSOR
        INTO DRIVERNAME;
    
      EXIT WHEN MYCURSOR% NOTFOUND;
    
      SELECT MAX(A.LICENSEVALTO)  
        INTO LICENCEDATE
        FROM BD_DRIVER A
       WHERE A.DRIVERNAME = DRIVERNAME; --駕駛證到期日期
    
      SELECT MAX(A.LICENSENO) --不加max报错,一个表十几条数据没有重复,一个驾驶证一个司机
        INTO LICENCENO
        FROM BD_DRIVER A
       WHERE A.DRIVERNAME = DRIVERNAME; --駕駛證號
    
      SUBJECT     := '【調度室】司機換證提醒'; --邮件主题
      MAILADDRESS := 'Happy4944@163.com'; --收件人郵箱
      MAILCONTENT := 'XXX';
    
      INSERT INTO APP_TEMPCAR
      VALUES
        (DRIVERNAME, --司机姓名不一样
         ‘’,
         LICENCENO, --数据还是一样
         MAILCONTENT,
         1111,
         SUBJECT,
         '',
         LICENCEDATE);
    
    END LOOP;
  END IF;

END P_DRIVERLICENCEMAIL;
qq_38884602 2017-06-09
  • 打赏
  • 举报
回复
引用 15 楼 happy4944 的回复:
[quote=引用 13 楼 qq_38884602 的回复:] 发两张表的结构 你现在发的是你的查询结果 我现在感觉你的表设计有问题
车牌和驾驶证是key,不过要查邮箱的那个表是工号做主键。帖子我先结了吧,我现在也不知道怎么弄了,问下组长再说[/quote] 你这个张表的USERID是不是你说的工号啊
-一个大坑 2017-06-09
  • 打赏
  • 举报
回复
引用 13 楼 qq_38884602 的回复:
发两张表的结构 你现在发的是你的查询结果 我现在感觉你的表设计有问题


车牌和驾驶证是key,不过要查邮箱的那个表是工号做主键。帖子我先结了吧,我现在也不知道怎么弄了,问下组长再说
qq_38884602 2017-06-09
  • 打赏
  • 举报
回复
引用 11 楼 happy4944 的回复:
[quote=引用 7 楼 qq_38884602 的回复:] 你们单位的一个车牌号,可以对应多个邮箱?如果是这样的话 你就需要在写一个循环
一个司机肯定只有一个邮箱,不过按司机姓名查的,可能有重名[/quote] 司机表难道没有唯一标识列 ?既然都知道名字可能重复为什么当时不用车牌作唯一标识列
qq_38884602 2017-06-09
  • 打赏
  • 举报
回复
发两张表的结构 你现在发的是你的查询结果 我现在感觉你的表设计有问题
-一个大坑 2017-06-09
  • 打赏
  • 举报
回复
引用 6 楼 junes06 的回复:
请发一下这两个表的数据 BD_CARANDDRIVER , EMPLOYEE

好像是数据有问题,我直接上图吧

这是查的需要保养的车

这是查的车和司机(只剩两个)

这是插入后的数据,这个司机根本需要保养得车的司机。不知道他的名字为什么会出现
-一个大坑 2017-06-09
  • 打赏
  • 举报
回复
引用 7 楼 qq_38884602 的回复:
你们单位的一个车牌号,可以对应多个邮箱?如果是这样的话 你就需要在写一个循环
一个司机肯定只有一个邮箱,不过按司机姓名查的,可能有重名
-一个大坑 2017-06-09
  • 打赏
  • 举报
回复
引用 14 楼 qq_38884602 的回复:
[quote=引用 11 楼 happy4944 的回复:] [quote=引用 7 楼 qq_38884602 的回复:] 你们单位的一个车牌号,可以对应多个邮箱?如果是这样的话 你就需要在写一个循环
一个司机肯定只有一个邮箱,不过按司机姓名查的,可能有重名[/quote] 司机表难道没有唯一标识列 ?既然都知道名字可能重复为什么当时不用车牌作唯一标识列[/quote] 原因我找到了,浪费了你这么长时间真是不好意思。我取得值名和表列名是一样的,系统估计认为是表里的列了。这样查的就是整个表的数据,所以不加max会报错。刚刚去掉其余的就留下个插入然后调试发现插入只循环了7次,但是每次都把所有车名都查出来。
-一个大坑 2017-06-09
  • 打赏
  • 举报
回复
引用 6 楼 junes06 的回复:
请发一下这两个表的数据 BD_CARANDDRIVER , EMPLOYEE
原因我找到了,浪费了你这么长时间真是不好意思。我取得值名和表列名是一样的,系统估计认为是表里的列了。这样查的就是整个表的数据,所以不加max会报错。刚刚去掉其余的就留下个插入然后调试发现插入只循环了7次,但是每次都把所有车名都查出来。
ohyeah_16888 2017-06-08
  • 打赏
  • 举报
回复
qq_38884602 2017-06-08
  • 打赏
  • 举报
回复
create or replace procedure P_CarMaintainRemindEamil is
   
  CARNO       varchar2(50); --待保養車牌
  MAILADDRESS VARCHAR2(500); --收件人地址
  SUMCAR      NUMBER; --統計待保養車輛
  type v_mail_cursor is REF CURSOR;
  v_mail  v_mail_cursor;
  cursor mycursor is
    SELECT A.CARNO FROM BD_CAR A where sysdate < A.MAINTAINTODATE;
   
begin
   
  SELECT COUNT(A.CARNO)
    INTO SUMCAR
    FROM BD_CAR A
   where sysdate < A.MAINTAINTODATE;
  open mycursor;
   
  IF SUMCAR > 0 THEN
    LOOP
      fetch mycursor
        INTO CARNO;   
       
      exit when mycursor%notfound;
      OPEN v_mail for
        SELECT B.MAIL
          FROM BD_CARANDDRIVER A, EMPLOYEE B
         WHERE A.CARNO = CARNO
           AND A.DRIVERNAME = B.CNAME
           AND A.ISVALID = '1'; --查询司机邮件地址
      loop
        FETCH v_mail INTO mailaddress;
        exit when v_mail%notfound;
        INSERT INTO CIMAPGROUP
        values
          (CARNO, MAILADDRESS, '1', '1', '1', '1', '1'); --插入车牌没问题。司机邮件地址都是一个
      END LOOP;
    END LOOP;
  END IF;
   
end P_CarMaintainRemindEamil;
qq_38884602 2017-06-08
  • 打赏
  • 举报
回复
create or replace procedure P_CarMaintainRemindEamil is
  
  CARNO       varchar2(50); --待保養車牌
  MAILADDRESS VARCHAR2(500); --收件人地址
  SUMCAR      NUMBER; --統計待保養車輛
  type v_mail_cursor is REF CURSOR;
  v_mail  v_mail_cursor;
  cursor mycursor is
    SELECT A.CARNO FROM BD_CAR A where sysdate < A.MAINTAINTODATE;
  
begin
  
  SELECT COUNT(A.CARNO)
    INTO SUMCAR
    FROM BD_CAR A
   where sysdate < A.MAINTAINTODATE;
  open mycursor;
  
  IF SUMCAR > 0 THEN
    LOOP
      fetch mycursor
        INTO CARNO;   
      
      exit when mycursor%notfound;
      OPEN v_mail for
        SELECT B.MAIL
          FROM BD_CARANDDRIVER A, EMPLOYEE B
         WHERE A.CARNO = CARNO
           AND A.DRIVERNAME = B.CNAME
           AND A.ISVALID = '1'; --查询司机邮件地址
      loop
        FETCH v_mail INTO mailaddress
        exit when v_mail%notfound;
        INSERT INTO CIMAPGROUP
        values
          (CARNO, MAILADDRESS, '1', '1', '1', '1', '1'); --插入车牌没问题。司机邮件地址都是一个
      END LOOP;
    END LOOP;
  END IF;
  
end P_CarMaintainRemindEamil;
试试看
qq_38884602 2017-06-08
  • 打赏
  • 举报
回复
引用 5 楼 happy4944 的回复:
string[]aaa={}; for (int i = 0; i < aaa.Length; i++) { string carno = aaa[i]; } [quote=引用 4 楼 qq_38884602 的回复:] [quote=引用 3 楼 qq_38884602 的回复:] SELECT max(B.MAIL) INTO MAILADDRESS FROM BD_CARANDDRIVER A, EMPLOYEE B WHERE A.CARNO = CARNO AND A.DRIVERNAME = B.CNAME AND A.ISVALID = '1'; --查询司机邮件地址
你这里为什么要用MAX()函数 ,,还有你选择插入值有什么问题吗?[/quote] 不加max报错:ora - 01422:准确获取回报超过要求的行数,插入的值应该没问题吧[/quote] 你们单位的一个车牌号,可以对应多个邮箱?如果是这样的话 你就需要在写一个循环
junes06 2017-06-08
  • 打赏
  • 举报
回复
请发一下这两个表的数据 BD_CARANDDRIVER , EMPLOYEE
-一个大坑 2017-06-08
  • 打赏
  • 举报
回复
string[]aaa={}; for (int i = 0; i < aaa.Length; i++) { string carno = aaa[i]; }
引用 4 楼 qq_38884602 的回复:
[quote=引用 3 楼 qq_38884602 的回复:] SELECT max(B.MAIL) INTO MAILADDRESS FROM BD_CARANDDRIVER A, EMPLOYEE B WHERE A.CARNO = CARNO AND A.DRIVERNAME = B.CNAME AND A.ISVALID = '1'; --查询司机邮件地址
你这里为什么要用MAX()函数 ,,还有你选择插入值有什么问题吗?[/quote] 不加max报错:ora - 01422:准确获取回报超过要求的行数,插入的值应该没问题吧
qq_38884602 2017-06-08
  • 打赏
  • 举报
回复
引用 3 楼 qq_38884602 的回复:
SELECT max(B.MAIL) INTO MAILADDRESS FROM BD_CARANDDRIVER A, EMPLOYEE B WHERE A.CARNO = CARNO AND A.DRIVERNAME = B.CNAME AND A.ISVALID = '1'; --查询司机邮件地址
你这里为什么要用MAX()函数 ,,还有你选择插入值有什么问题吗?
qq_38884602 2017-06-08
  • 打赏
  • 举报
回复
SELECT max(B.MAIL) INTO MAILADDRESS FROM BD_CARANDDRIVER A, EMPLOYEE B WHERE A.CARNO = CARNO AND A.DRIVERNAME = B.CNAME AND A.ISVALID = '1'; --查询司机邮件地址
-一个大坑 2017-06-08
  • 打赏
  • 举报
回复
引用 1 楼 qq_38884602 的回复:
你现在是插入表格了 昨天你是用变量接收 你现在应该没问题了啊
我问了下,只需要插入到那个表,会自动发邮件出去,所以现在只用插入到表中。昨天的也没解决插入的值总是同一个
qq_38884602 2017-06-08
  • 打赏
  • 举报
回复
你现在是插入表格了 昨天你是用变量接收 你现在应该没问题了啊

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧