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;
时间: 2024-10-01 04:32:41

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

关于js中onclick字符串传参问题

规则: 外变是“”,里面就是‘’外边是‘’,里边就是“” 示例: var a="111"; var html="<a onclick='selecthoods(\" "+a + "\"); >AAA</a>"; 注意点:需要用转义字符

Mybatis 字符串传参异常解析

Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'XXX' in 'class java.lang.String'  解析 异常信息如下: 1.在DAO层,CardMapper.java接口里面 入参加上 @Param("XXX") 2.在cardMapper.xml中 <if test="provCode != null

转:ORACLE存储过程笔记1----基本语法(以及与informix的比较)

一.基本语法(以及与informix的比较) create [or replace] procedure procedure_name (varible {IN|OUT|IN OUT} type)  {IS|AS} [varible { in | out | in out }]  type;[varible { in | out | in out }] type;...... [cursor curor_name IS select subclause] begin body end [proc

重构之路 组合查询之传参+存储过程

上篇博文给大家一起讨论了实现组合查询的一种方法,即在U层将select语句的where子句部分组装好,赋给一个字符串变量,传到D层然后与select子句组成完整的sql语句,之后执行,返回查询结果,就是这么简单,但是博文的结尾也留下了一个疑问,这种方法的安全性有点欠佳,有没有相对好一点的办法呢? 答案是肯定的,这次我们一起来看看我实现的另一种方法.首先给大家简单介绍一下这种方法的思路,其实也比较简单,最初我是想在程序代码里写sql查询语句的,然后将组合查询的各个条件的值当做实体参数(现在实体层定

Date对象,封闭空间,函数传参和封装,获取非行间样式,字符串操作

一.Date对象 1. 获取 oDate.getFullYear() 获取年份 oDate.getMonth()+1  获取月份( 0-11)----->1-12 oDate.getDate()  获取日 1-31 oDate.getHours() 获取小时 oDate.getMinutes() 获取分 oDate.getSeconds() 获取秒 oDate.getMilliseconds();   //毫秒 oDate.getDay() 获取星期几 0-6     0:星期天 例:数码时钟

Azure sql database 监控存储过程的传参情况

背景 实施开发的同事找到我,反馈说项目中使用Azure sql database 之后,无法使用Profiler来监控自己开发的存储过程的参数传参情况.确实profiler这些实例级别的工具在Azure sql database下是不支持的,那我们有没有办法,变相实现监控参数情况,特写一篇博客记录一下. 测试环境 Microsoft SQL Azure (RTM) - 12.0.2000.8 Mar 30 2017 01:30:03 Copyright (C) 2016 Microsoft Co

Python字符串的修改以及传参

前两天去面试web developer,面试官提出一个问题,用JavaScript或者Python实现字符串反转,我选择了Python,然后写出了代码(错误的): 1 #!/usr/bin/env python 2 #-*-coding:utf-8-*- 3 __author__ = 'ZhangHe' 4 def reverse(s): 5 l = 0 6 r = len(s) - 1 7 while l < r: 8 s[l],s[r] = s[r],s[l] 9 l += 1 10 r -

MySQL 存储过程传参之in, out, inout 参数用法

存储过程传参:存储过程的括号里,可以声明参数. 语法是 create procedure p([in/out/inout] 参数名  参数类型 ..) in :给参数传入值,定义的参数就得到了值 out:模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程(在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值) inout:调用者还可以通过 inout 参数传递值给存储过程,也可以从存储过程内部传值给调用者 如果仅仅想把数据传给 MySQL 存储过

日期对象的常用用法(传参以及转字符串日期)

一.传参 我们用var now=new Date() 获得自定义的时间对象 函数中没有传递任何参数,表示此对象now自动获取了当前的时间. 如果想要创建一个自定义时间的对象,需要在new Date()中传递参数,接收毫秒数. 可以使用Date.parse()来获得自定义时间的毫秒数. 4种方法如下: var mydate1=new Date(Date.parse("12/12/2013")); console.log(mydate1); var mydate2=new Date(&qu