一、代码

/*1.定义存过*/
CREATE OR REPLACE 
PROCEDURE PRO_RE_USER_ORD_GOODS(
--NOW_DATE格式:YYYYMMDD 如:20190801(此时统计的是2019年7月31日的数据)
NOW_DATE IN VARCHAR2
) 
IS

    /*2.定义变量 START*/
    --定义RECORD型记录类型;
    TYPE T_RECORD IS RECORD (
        GOODS_CODE VARCHAR2 (64),
        GOODS_NAME VARCHAR2 (64)
    ) ; 
    --定义返回结果集接收的变量,类型为T_RECORD;
  PS:这里也可以不用record,直接指定V_ROWRESUT为%rowtype类型
    V_ROWRESUT T_RECORD ; 
    --定义主键
    PID VARCHAR2 (256) ;
    /*2.定义变量 end*/


        /*3.定义游标,执行查询结果集操作 START*/
        CURSOR CUR_RE_USER_ORD_GOODS
        IS
                --查询语句开始
                SELECT
                        A .GOODS_CODE,
                        B.GOODS_NAME
                FROM
                        (
                            SELECT
                                    ORD.GOODS_CODE
                            FROM
                                    ORDER_INFO ORD
                            GROUP BY
                                    ORD.GOODS_CODE
                        ) A
                LEFT JOIN GOODS_INFO B ON A .GOODS_CODE = B.GOODS_CODE ;
                --查询语句结束
        /*3.定义游标,执行查询结果集操作 END*/

        /*4.打开并循环游标,进行数据操作 START*/
        BEGIN
            OPEN CUR_RE_USER_ORD_GOODS;                          --打开游标;
            LOOP                                                 --开始执行循环,遍历查询结果集表;
                FETCH CUR_RE_USER_ORD_GOODS INTO V_ROWRESUT;       --循环游标并赋值给结构体变量;
                EXIT WHEN CUR_RE_USER_ORD_GOODS %NOTFOUND;         --如果游标遍历完成,就退出循环;

                --获取 UUID 并赋值给 PID 变量;
                SELECT SYS_GUID() INTO PID FROM DUAL;
             
                --插入“订购商品记录表” 开始
                INSERT INTO RE_USER_ORD_GOODS (
                    ID,
                    GOODS_CODE,
                    GOODS_NAME,
                    CREATE_TIME
                )VALUES(
                    PID,
                    V_ROWRESUT.GOODS_CODE,
                    V_ROWRESUT.GOODS_NAME,
                    SYSDATE
                );
                --插入“订购商品记录表” 结束

            END LOOP;                                           --结束循环;
            CLOSE CUR_RE_USER_ORD_GOODS;                        --关闭游标;
            COMMIT;                                             --提交 INSERT 操作;
        END;
        /*4.打开并循环游标,进行数据操作 END*/

oracle存储过程中is和as区别

  • 在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别;
  • 在视图(VIEW)中只能用AS不能用IS;
  • 在游标(CURSOR)中只能用IS不能用AS。

声明变量的方式

  • v_temp     varchar(10)
  • v_temp     tablename.property%type(表名属性名%type,指的是一个表中某个字段的类型,这样可以灵活使用)
  • v_stu    student%rowtype;(这种类型就是定义一个变量,这个变量的类型为一个表数据的行类型,用于接收查询的一整行数据

赋值方式

  • :=