如何在PLSQL中提取字符串里$CF$_TRANSFER_ID的指定值?
在PL/SQL中提取指定参数值的实现方法
针对你需要从给定的参数字符串中提取$CF$_TRANSFER_ID对应值的需求,这里提供两种实用的PL/SQL实现方式:
方法一:使用正则表达式REGEXP_SUBSTR
正则表达式可以直接匹配参数名和对应的值,代码简洁高效:
DECLARE v_param_str VARCHAR2(1000) := '!PARAMETER_MESSAGE $FILE_TYPE=Dummy $SET_ID=1 $COMPANY=ABC $CLIENT_SERVER=C $FILE_TEMPLATE_ID=DummyTemp $FILE_DIRECTION_DB=2 $CF$_TRANSFER_ID=143 $PARAM_SET=TRUE $FILE_NAME=D:\temp\file.csv'; v_transfer_id VARCHAR2(20); BEGIN -- 匹配$CF$_TRANSFER_ID=后面的内容,直到换行或字符串结束 v_transfer_id := REGEXP_SUBSTR(v_param_str, '\$CF\$\_TRANSFER_ID=([^\n]+)', 1, 1, NULL, 1); DBMS_OUTPUT.PUT_LINE('提取到的CF_TRANSFER_ID值:' || v_transfer_id); END; /
正则说明:
\$CF\$\_TRANSFER_ID=:匹配参数名(转义特殊字符$和_)([^\n]+):捕获换行符之前的所有字符,也就是参数对应的值- 最后一个参数
1表示返回第一个捕获组的内容
方法二:使用INSTR和SUBSTR组合
如果项目对正则表达式有限制,可以用字符串定位和截取的方式:
DECLARE v_param_str VARCHAR2(1000) := '!PARAMETER_MESSAGE $FILE_TYPE=Dummy $SET_ID=1 $COMPANY=ABC $CLIENT_SERVER=C $FILE_TEMPLATE_ID=DummyTemp $FILE_DIRECTION_DB=2 $CF$_TRANSFER_ID=143 $PARAM_SET=TRUE $FILE_NAME=D:\temp\file.csv'; v_start_pos NUMBER; v_end_pos NUMBER; v_transfer_id VARCHAR2(20); BEGIN -- 找到参数名的结束位置(即=号的位置) v_start_pos := INSTR(v_param_str, '$CF$_TRANSFER_ID=') + LENGTH('$CF$_TRANSFER_ID='); -- 找到参数值后的换行符位置,若到末尾则用字符串长度 v_end_pos := INSTR(v_param_str, CHR(10), v_start_pos); IF v_end_pos = 0 THEN v_end_pos := LENGTH(v_param_str) + 1; END IF; -- 截取参数值 v_transfer_id := SUBSTR(v_param_str, v_start_pos, v_end_pos - v_start_pos); DBMS_OUTPUT.PUT_LINE('提取到的CF_TRANSFER_ID值:' || v_transfer_id); END; /
逻辑说明:
- 先用
INSTR定位$CF$_TRANSFER_ID=的位置,加上参数名长度得到值的起始位置 - 再用
INSTR找起始位置后的第一个换行符,作为值的结束位置 - 如果找不到换行符(说明是最后一行),就用字符串总长度作为结束位置
- 最后用
SUBSTR截取中间的内容
两种方法执行后都会输出143,可以根据实际场景选择合适的方式。
内容的提问来源于stack exchange,提问作者user2153047
相关产品推荐
相关产品推荐

