如何在Bash中实现Oracle表wildcards值与传入参数的反向匹配?
从Oracle表中反向匹配传入参数的子串值
核心SQL实现
要找出wildcards表中wildcard列值是传入参数子串的记录,可使用Oracle的INSTR函数判断子串存在性,SQL语句如下:
SELECT wildcard FROM wildcards WHERE INSTR(:input_param, TRIM(wildcard)) > 0;
说明
INSTR(目标字符串, 子串):返回子串在目标字符串中的起始位置,返回值>0则表示子串存在。这里把传入参数作为目标字符串,表中wildcard值作为子串,实现反向匹配。TRIM(wildcard):处理wildcard列可能存在的前后空格,避免因空格导致匹配失败(比如示例中job_ftp的尾部空格)。- 由于表数据动态更新,每次执行该SQL都会查询最新的表记录,满足运行时新增数据的匹配需求。
Bash脚本中集成调用
假设脚本接收的参数为$1,可通过sqlplus执行上述SQL,示例代码如下:
#!/bin/bash # 处理传入参数的单引号转义,避免SQL语法错误 ESCAPED_PARAM=$(echo "$1" | sed "s/'/''/g") # 用sqlplus连接Oracle并执行查询 sqlplus -s your_username/your_password@your_db_service <<EOF SET HEAD OFF SET FEEDBACK OFF VAR input_param VARCHAR2(255); EXEC :input_param := '$ESCAPED_PARAM'; SELECT wildcard FROM wildcards WHERE INSTR(:input_param, TRIM(wildcard)) > 0; EXIT; EOF
说明
-s参数让sqlplus以静默模式运行,避免输出多余的连接信息。SET HEAD OFF和SET FEEDBACK OFF关闭表头和执行结果统计,只输出匹配到的wildcard值。- 单引号转义处理:通过
sed把参数中的单引号替换为两个单引号,符合Oracle字符串的转义规则,同时避免SQL注入风险。
内容的提问来源于stack exchange,提问作者defekas17
相关产品推荐
相关产品推荐

