Oracle存储过程

-- 建表
create table KECHENG
(
    ID     NUMBER,
    NAME   VARCHAR2(20),
    COURSE VARCHAR2(20),
    SCORE  NUMBER
);

INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (1, '张三', '语文', 90);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (2, '张三', '数学', 80);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (3, '张三', '英语', 70);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (4, '张三', '历史', 60);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (5, '张三', '生物', 58);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (6, '张三', '物理', 50);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (7, '李四', '语文', 96);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (8, '李四', '数学', 93);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (9, '李四', '英语', 85);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (10, '李四', '历史', 43);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (11, '李四', '生物', 29);
INSERT INTO SCOTT.KECHENG (ID, NAME, COURSE, SCORE) VALUES (12, '李四', '物理', 69);

在这里插入图片描述

-- 案例
BEGIN
    DBMS_OUTPUT.PUT_LINE('HELLO WORLD');
END;

在这里插入图片描述

DECLARE
    V_NAME VARCHAR2(220):= '张三';
    V_SAL NUMBER;
    V_ADDR VARCHAR2(220);
BEGIN
    V_SAL := 1000;
    SELECT '上海' INTO V_ADDR FROM DUAL;
    DBMS_OUTPUT.PUT_LINE('姓名:'||V_NAME||',薪水:'||V_SAL||',地址:'||V_ADDR);
END;

在这里插入图片描述

DECLARE
    V_ID NUMBER;
    V_NAME VARCHAR2(20);
    V_COURSE VARCHAR2(20);
    V_SCORE VARCHAR2(20);
BEGIN
    SELECT ID,NAME,COURSE,SCORE INTO V_ID ,V_NAME,V_COURSE,V_SCORE FROM KECHENG WHERE ID=1 AND COURSE='语文';
    DBMS_OUTPUT.PUT_LINE(V_ID||V_NAME||V_COURSE||V_SCORE);
end;

在这里插入图片描述

DECLARE
    V_NAME KECHENG.NAME%TYPE;
    V_COURSE KECHENG.COURSE%TYPE;
    V_SCORE KECHENG.SCORE%TYPE;
BEGIN
    SELECT NAME,COURSE,SCORE INTO V_NAME,V_COURSE,V_SCORE FROM KECHENG WHERE ID=1 AND COURSE='语文';
    DBMS_OUTPUT.PUT_LINE('姓名:'||V_NAME||',科目:'||V_COURSE||',成绩:'||V_SCORE);
end;

在这里插入图片描述

DECLARE
    V_KECHENG KECHENG%ROWTYPE;
BEGIN
    SELECT * INTO V_KECHENG FROM KECHENG WHERE ID=1 AND COURSE='语文';
    DBMS_OUTPUT.PUT_LINE('姓名:'||V_KECHENG.NAME||',科目:'||V_KECHENG.COURSE||',成绩:'||V_KECHENG.SCORE);
END;

在这里插入图片描述

-- 判断KECHENG表中记录是否超过20条,10-20之间,或者10以下
DECLARE
    V_COUNT NUMBER;
BEGIN
    SELECT COUNT(1) INTO V_COUNT FROM KECHENG;
    IF V_COUNT>20 THEN
        DBMS_OUTPUT.PUT_LINE('KECHENG表中记录数超过20条为:'||V_COUNT);
        ELSIF V_COUNT<=20 AND V_COUNT>=10 THEN
         DBMS_OUTPUT.PUT_LINE('KECHENG表中记录数10-20之间为:'||V_COUNT);
        ELSE
        DBMS_OUTPUT.PUT_LINE('KECHENG表中记录数10条以下为:'||V_COUNT);
    end if;
end;

在这里插入图片描述

--循环
DECLARE
    V_NUM NUMBER := 1;
BEGIN
    LOOP
        EXIT WHEN V_NUM>10;
        DBMS_OUTPUT.PUT_LINE(V_NUM);
        V_NUM := V_NUM+1;
    END LOOP;
END;

在这里插入图片描述

--使用游标查询KECHENG表中所有人的姓名,科目,成绩,并将其打印出来。
DECLARE
    --生声明游标
    CURSOR C_KECHENG IS SELECT ID, NAME, COURSE, SCORE FROM KECHENG;
    V_ID KECHENG.ID%TYPE;
    V_NAME KECHENG.NAME%TYPE;
    V_COURSE KECHENG.COURSE%TYPE;
    V_SCORE KECHENG.SCORE%TYPE;
BEGIN
    OPEN C_KECHENG;
    LOOP
        FETCH C_KECHENG INTO V_ID,V_NAME,V_COURSE,V_SCORE;
        EXIT WHEN C_KECHENG%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('编号:'||V_ID||',姓名:'||V_NAME||',科目:'||V_COURSE||',成绩:'||V_SCORE);
    END LOOP;
    CLOSE C_KECHENG;
END;

在这里插入图片描述

--使用游标查询KECHENG表中所有人的姓名,科目,成绩,并将其打印出来。
--带参数
DECLARE
    CURSOR C_KECHENG(V_ID KECHENG.ID%TYPE) IS SELECT NAME,COURSE,SCORE FROM KECHENG WHERE ID=V_ID;
    V_NAME KECHENG.NAME%TYPE;
    V_COURSE KECHENG.COURSE%TYPE;
    V_SCORE KECHENG.SCORE%TYPE;
BEGIN
    OPEN C_KECHENG(3);
    LOOP
        FETCH C_KECHENG INTO V_NAME,V_COURSE,V_SCORE;
        EXIT WHEN C_KECHENG%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(V_NAME||V_COURSE||V_SCORE);
     --   DELETE KECHENG WHERE NAME =V_NAME;
    end loop;
    CLOSE C_KECHENG;
--     COMMIT ;
end;

在这里插入图片描述

–声明变量

CREATE OR REPLACE PROCEDURE P_HELLO AS
BEGIN
    DBMS_OUTPUT.PUT_LINE('hello world');
end;


--执行存储过程
BEGIN
    P_HELLO();
END;
CREATE OR REPLACE PROCEDURE TESTDURE(INPUT NUMBER) AS
    V_NAME VARCHAR2(20);
BEGIN
    SELECT NAME INTO V_NAME FROM KECHENG WHERE COURSE='语文' AND ID = INPUT;
    DBMS_OUTPUT.PUT_LINE(V_NAME);
end;

DECLARE V_ID NUMBER;
BEGIN
    V_ID := 1;
    TESTDURE(V_ID);
end;
-- 游标和存储过程一起使用
CREATE OR REPLACE PROCEDURE TESTDURE(INPUT NUMBER) AS
begin
    declare
        cursor V_KECHENG is select NAME, COURSE from KECHENG where ID = to_number(input) ;
        V_NAME   VARCHAR2(20);
        V_COURSE VARCHAR2(20);
    BEGIN
        open V_KECHENG;
        LOOP
            fetch V_KECHENG into V_NAME,V_COURSE;
            exit when V_KECHENG%notfound;
            dbms_output.put_line(V_NAME || V_COURSE);
        end loop;
        close V_KECHENG;
    end;
END;
DECLARE
    V_ID NUMBER;
BEGIN
    V_ID := 1;
    TESTDURE(1); 
 end;

实例1:查找业务数据表这看来你刚刚字段是空的值,当接口数据有,就自动更新业务数据表。

DECLARE
  TYPE cur IS REF CURSOR;
  cur_01 cur;
  m1 VARCHAR2(50);
  m2 VARCHAR2(50);
  m3 VARCHAR2(50);

BEGIN
  OPEN cur_01 FOR 
   select tt.vin from vehicle.v_order@vehicle218  tt 
   where tt.vin_code is null 
   and tt.engine_model is null
   and tt.from_ship_loc in ('轻卡国际库','重卡库','同大库')
   and  tt.to_ship_loc='上海港';
  LOOP
    FETCH cur_01 INTO m1;
    EXIT WHEN cur_01%notfound;
    select aa.engin_no,aa.vihicle_vin_no into m2,m3 from intjacprd.wl_syczc@intjac aa where aa.vn=m1;
    if (m2 is not null and m3 is not null) then
    update vehicle.v_order@vehicle218 set engine_model=m2,vin_code=m3 where vin=m1;
    end if;
    COMMIT;
  END LOOP;
  CLOSE cur_01;
  exception when others then
    dbms_output.put_line('erro');
END;

实例2:查找数据并写入到bb表中

delete from bb;
commit;
DECLARE
  TYPE cur IS REF CURSOR;
  cur_01 cur;
  TYPE rec IS RECORD(
  r1 VARCHAR2(100),
  r2 VARCHAR2(100),
  r3 VARCHAR2(100),
  r4 VARCHAR2(100),
  r5 VARCHAR2(100),
  r6 VARCHAR2(100)
  );
  rec_01 rec;
  m number:=0;

BEGIN
  OPEN cur_01 FOR 
   select tt.vin ,tt.link_type,tt.username,tt.link_time,tt.phone,tt.code
   from link_trail  tt 
   where not exists (select 1 from link_trail l
   where l.vin=tt.vin 
   and l.link_type in('收车','回单','签收'))
   and  tt.company_name='商储'
   order by tt.vin ,tt.link_time;
  LOOP
    FETCH cur_01 INTO rec_01;
    EXIT WHEN cur_01%notfound;
    if (rec_01.r2='打卡警告') then
         m:=m+1;
         insert into bb(frequency,vin,link_type,username,time,phone,code)
          values(m,rec_01.r1,rec_01.r2,rec_01.r3,rec_01.r4,rec_01.r5,rec_01.r6);
    else m:=0;
    end if;
    COMMIT;
  END LOOP;
  CLOSE cur_01;
  exception when others then
    dbms_output.put_line('erro');
END;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值