Oracle存储过程,以逗号分隔字符串传参的处理

Oracle存储过程,经常会遇见传入的参数是逗号分隔。

处理需要3步:

第一步,创建Type类型

第二部,创建函数

第三部,创建存储过程

代码如下:

第一步:

create or replace type varTableType as table
   of nvarchar2(40)

第二步:

create or replace function str2numList123( p_string in varchar2 ) return
          varTableType
           as
           v_str long default p_string || ',';
           v_n number;
           v_data varTableType := varTableType();
           begin
           loop
          v_n := to_number(instr( v_str, ',' ));
          exit when (nvl(v_n,0) = 0);
          v_data.extend;
          v_data( v_data.count ) := ltrim(rtrim(substr(v_str,1,v_n-1)));
          v_str := substr( v_str, v_n+1 );
          end loop;
          return v_data;
          end;

第三步:

CREATE OR REPLACE PROCEDURE PROC_UPDATE_LIUYANG(VIDNUMERIC VARCHAR2,
                                                VMARK      VARCHAR2,
                                                VKEEPTYPE  VARCHAR2,
                                                VMODIFYBY  VARCHAR2, verrorint out int) AS
  CURSOR CUR_KEEPTYPE IS
    SELECT *
      FROM THE (SELECT CAST(STR2NUMLIST123(VKEEPTYPE) AS VARTABLETYPE)
                  FROM DUAL);
  OLD_KEEP_TYPE VARCHAR2(60);
  VTEMPLATE_ID  VARCHAR2(60);
  VSMPSORT      VARCHAR2(40);
  VSAMPLENAME   VARCHAR2(60);
  VSPECIFACTION VARCHAR2(60);
  VPRODUCTUNIT  VARCHAR2(30);
  VBATCHNAME    VARCHAR2(60);
  VCOUNT        INT;
BEGIN
  verrorint := 0;
  SELECT T.CT_KEEP_TYPE
    INTO OLD_KEEP_TYPE
    FROM SAMPLE T
   WHERE T.ID_NUMERIC = LPAD(VIDNUMERIC, 10);
  SELECT S.TEMPLATE_ID
    INTO VTEMPLATE_ID
    FROM SAMPLE S
   WHERE S.ID_NUMERIC = LPAD(VIDNUMERIC, 10);
  SELECT S.CT_SMP_SORT
    INTO VSMPSORT
    FROM SAMPLE S
   WHERE S.ID_NUMERIC = LPAD(VIDNUMERIC, 10);
  SELECT S.SAMPLE_NAME
    INTO VSAMPLENAME
    FROM SAMPLE S
   WHERE S.ID_NUMERIC = LPAD(VIDNUMERIC, 10);
  SELECT S.CT_SMP_SPECIFICATION
    INTO VSPECIFACTION
    FROM SAMPLE S
   WHERE S.ID_NUMERIC = LPAD(VIDNUMERIC, 10);
  SELECT S.PRODUCT_UNIT
    INTO VPRODUCTUNIT
    FROM SAMPLE S
   WHERE S.ID_NUMERIC = LPAD(VIDNUMERIC, 10);
  SELECT S.BATCH_NAME
    INTO VBATCHNAME
    FROM SAMPLE S
   WHERE S.ID_NUMERIC = LPAD(VIDNUMERIC, 10);
  SELECT COUNT(0)
    INTO VCOUNT
    FROM INVENTORY_HEADER H
   WHERE H.IDENTITY = VTEMPLATE_ID;
  INSERT INTO SAMPLE_AUDIT_TRAILS
    (SAMPLE, CREATE_BY, CREATE_ON, REASION, OPERATE_TYPE)
  VALUES
    (LPAD(VIDNUMERIC, 10),
     VMODIFYBY,
     SYSDATE,
     VMARK,
     '取样台账中对样品留样类型有之前的' || OLD_KEEP_TYPE || '调整为现在' || VKEEPTYPE);
  IF VCOUNT = 0 THEN
    INSERT INTO INVENTORY_HEADER
      (IDENTITY, BASE_UNIT, DESCRIPTION)
    VALUES
      (VTEMPLATE_ID,
       VPRODUCTUNIT,
       VSAMPLENAME || VSPECIFACTION || VSMPSORT);
  END IF;
  DELETE FROM CT_KEEP_SAMPLE CKS
   WHERE CKS.ID_NUMERIC = LPAD(VIDNUMERIC, 10);
  DELETE FROM INVENTORY_ITEM II WHERE II.SAMPLE_ID = TRIM(VIDNUMERIC);
  UPDATE SAMPLE S
     SET S.CT_KEEP_TYPE = VKEEPTYPE
   WHERE S.ID_NUMERIC = LPAD(VIDNUMERIC, 10);
  FOR C_K IN CUR_KEEPTYPE LOOP
    IF C_K.COLUMN_VALUE = '常规留样' THEN
      INSERT INTO CT_KEEP_SAMPLE
        (ID_NUMERIC, CT_K_TYPE)
      VALUES
        (LPAD(VIDNUMERIC, 10), C_K.COLUMN_VALUE);
    ELSE
      INSERT INTO INVENTORY_ITEM
        (INVENTORY_ID, SAMPLE_ID, ITEM_TYPE, ITEM_CODE, description)
      VALUES
        (VTEMPLATE_ID,
         TRIM(VIDNUMERIC),
         C_K.COLUMN_VALUE,
         VBATCHNAME,
         C_K.COLUMN_VALUE);
    END IF;
  END LOOP;
  commit;
EXCEPTION
  WHEN OTHERS THEN
    verrorint := 1;
    ROLLBACK;
END PROC_UPDATE_LIUYANG;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值