code: func convertNvLob(idx int, f *p.ParameterField, v interface{}) (driver.Value, error) {
  
  	if v == nil {
  		return v, nil
  	}
  
  	switch v := v.(type) {
  	case Lob:
  		if v.rd == nil {
  			return nil, fmt.Errorf("lob error: initial reader %[1]T %[1]v", v)
  		}
  		f.SetLobReader(v.rd)
  		return fmt.Sprintf("<lob %d", idx), nil
  	case *Lob:
  		if v.rd == nil {
  			return nil, fmt.Errorf("lob error: initial reader %[1]T %[1]v", v)
  		}
  		f.SetLobReader(v.rd)
  		return fmt.Sprintf("<lob %d", idx), nil
  	case NullLob:
  		if !v.Valid {
  			return nil, nil
  		}
  		if v.Lob.rd == nil {
  			return nil, fmt.Errorf("lob error: initial reader %[1]T %[1]v", v)
  		}
  		f.SetLobReader(v.Lob.rd)
  		return fmt.Sprintf("<lob %d", idx), nil
  	case *NullLob:
  		if !v.Valid {
  			return nil, nil
  		}
  		if v.Lob.rd == nil {
  			return nil, fmt.Errorf("lob error: initial reader %[1]T %[1]v", v)
  		}
  		f.SetLobReader(v.Lob.rd)
  		return fmt.Sprintf("<lob %d", idx), nil
  	}
  
  	rv := reflect.ValueOf(v)
  
  	switch rv.Kind() {
  
  	case reflect.Ptr:
  		// indirect pointers
  		if rv.IsNil() {
  			return nil, nil
  		}
  		return convertNvLob(idx, f, rv.Elem().Interface())
  	}
  
  	return nil, fmt.Errorf("unsupported lob conversion type error %[1]T %[1]v", v)
  }
docs: // Lob