更新时间:2025-06-04 GMT+08:00
instr
数据库类型与版本
- 源库类型与版本:Oracle所有版本。
- 目标库类型与版本:GaussDB V2.0-2.7之前版本。
转换替代方案:
CREATE OR REPLACE FUNCTION dsc_ora_ext.dsc_fn_instr /* 1st param (i_str) is the text expression to search 2nd param (i_substr) is the string to search for 3rd param (i_startpos) is a nonzero INTEGER indicating where in string the function begins the search. When it is negative, then INSTR counts and searches backward from the end of string. Default value is 1. 4th param (i_occurrence) An INTEGER indicating which occurrence of string the function should search for. It must be positive; Default value is 1. */ ( i_str IN TEXT , i_substr IN TEXT , i_startpos IN INTEGER = 1 , i_occurrence IN INTEGER = 1 ) RETURN INTEGER IMMUTABLE AS v_search_str TEXT; v_shift INTEGER := 0; v_pos INTEGER; BEGIN IF i_str IS NULL OR i_substr IS NULL THEN -- if source string or substring is empty RETURN NULL; END IF; IF i_occurrence <= 0 THEN RAISE EXCEPTION 'ERROR-01428: argument -1 is out of range'; END IF; IF i_startpos = 0 THEN RETURN 0; END IF; /* When i_startpos is negative, then the function should count and searches backward from the end of string. */ IF i_startpos < 0 THEN i_str := REVERSE(i_str); i_substr := REVERSE(i_substr); v_pos := -1 * i_startpos; ELSE v_pos := i_startpos; END IF; FOR idx IN 1..i_occurrence LOOP v_shift := v_shift + v_pos; v_search_str := SUBSTR(i_str, v_shift); v_pos := STRPOS(v_search_str, i_substr); IF v_pos = 0 THEN RETURN 0; END IF; END LOOP; IF i_startpos > 0 THEN RETURN v_pos + v_shift - 1; ELSE RETURN LENGTH(i_str) - LENGTH(i_substr) - v_pos - v_shift + 3; END IF; END;