diff --git a/src/pl/ob_pl_stmt.cpp b/src/pl/ob_pl_stmt.cpp index 5f2a9e2cf4..e85e824fce 100644 --- a/src/pl/ob_pl_stmt.cpp +++ b/src/pl/ob_pl_stmt.cpp @@ -4522,7 +4522,8 @@ int lookup_pl_symbol(const void *pl_ns, const char *symbol, size_t len, int64_t const oceanbase::pl::ObPLBlockNS *ns = static_cast(pl_ns); if (OB_FAIL(ns->resolve_symbol(var_name, type, pl_data_type, parent_id, var_index))) { LOG_WARN("failed to get var index", K(var_name), K(ret)); - } else if (oceanbase::pl::ObPLExternalNS::LOCAL_VAR == type) { + } else if (oceanbase::pl::ObPLExternalNS::LOCAL_VAR == type + && !pl_data_type.is_cursor_type()) { // mysql can not access explicit cursor in sql/expression *idx = var_index; } else { /*do nothing*/ } } diff --git a/src/sql/resolver/ob_resolver_utils.cpp b/src/sql/resolver/ob_resolver_utils.cpp index ee8d07eae9..730fe1d4e7 100644 --- a/src/sql/resolver/ob_resolver_utils.cpp +++ b/src/sql/resolver/ob_resolver_utils.cpp @@ -772,10 +772,17 @@ int ObResolverUtils::check_type_match(const pl::ObPLResolveCtx &resolve_ctx, || ObExtendTC == ob_obj_type_class(dst_type)) { ret = OB_ERR_INVALID_TYPE_FOR_OP; LOG_WARN("argument count not match", K(ret), K(src_type), K(dst_type)); - } else { - // 检查普通类型之间是否可以互转 - OZ (ObObjCaster::can_cast_in_oracle_mode(dst_type, + } else { // 检查普通类型之间是否可以互转 + if (lib::is_oracle_mode()) { + OZ (ObObjCaster::can_cast_in_oracle_mode(dst_type, dst_pl_type.get_meta_type()->get_collation_type(), src_type, src_coll_type)); + } else if (!cast_supported( + src_type, src_coll_type, dst_type, dst_pl_type.get_meta_type()->get_collation_type())) { + ret = OB_ERR_INVALID_TYPE_FOR_OP; + LOG_WARN("inconsistent datatypes", + K(ret), K(src_type), K(src_coll_type), + K(dst_type), K(dst_pl_type.get_meta_type()->get_collation_type())); + } } bool is_numric_type = (IS_NUMRIC_TYPE(src_type) && IS_NUMRIC_TYPE(dst_type)); OX (match_info = ObRoutineMatchInfo::MatchInfo(