【转】Oracle的SQL语句中如何处理‘&’符号

本文介绍在Oracle SQL中如何正确使用转义字符‘&’,避免因该字符导致的用户输入请求问题,并提供了解决方案,即利用chr(38)代替‘&’。

在Oracle中,如果在sql中出现'&'符号,会被自动转义;
而被要求输入在&符号后跟随的字符串的值,例如:
update tablename set columnName='http://www.g.cn/cv2.jsp?spid=222&cid=333';
执行这个操作 时,Oracle会提示
Enter value for cid:
原因是在Oracle中 & 符号是作为转义字符使用的。
解 决方法:
用Oracle的字符串处理函数chr处理。chr(38)表示 &符号
改写:
update tablename set columnName='http://www.g.cn/cv2.jsp?spid=222'||chr(38)||'cid=333';
由 此联想开去,在数据库中存入html的一些符号式,很可能都会出现这种情况,那么如法炮制即可,如果有些符号的编码不知道的,可以通过下面的方法来查询:
select ascii('&') from dual; ......

 

原文地址:http://www.ej38.com/showinfo/sql-Oracle-209257.html

### Oracle SQL 中不支持 `&&` 的原因 在 Oracle 数据库中,`&` 符号用于表示绑定变量,默认情况下会提示用户输入值。而双 ampersand (`&&`) 并不是标准的 SQL 语法的一部分,在 Oracle SQL*Plus 或者 SQL Developer 工具里不会被识别为有效的操作符[^2]。 如果希望表达逻辑上的 AND 运算,则应该使用关键字 `AND` 而不是符号 `&&` 来连接条件。例如: ```sql SELECT * FROM employees WHERE department_id = 10 AND salary > 5000; ``` 对于需要多次使用的同一个替换变量的情况,确实可以用两个连续的单个 `&` (即 `&&`),但这仅限于特定上下文中作为重复引用同一变量的方式,并不代表布尔运算中的 “与”。 ### 替代方案 当涉及到复杂查询或者想要避免交互式输入时,有几种方式可以绕过这个问题: #### 使用显式的参数定义 可以通过编写 PL/SQL 匿名块来声明并赋值给局部变量,从而实现更灵活的操作而不必依赖命令行工具的行为特性: ```plsql DECLARE v_url VARCHAR2(200); BEGIN -- 显式设置 URL 变量 v_url := 'http://www.example.com/path?param1=value1&param2=value2'; INSERT INTO some_table (url_column) VALUES (v_url); END; / ``` #### 利用环境配置禁用自动替换功能 也可以调整客户端工具(如 SQL*Plus)的工作模式以防止其试图解析这些符号为特殊的控制序列。比如执行如下指令可关闭此行为: ```bash SET DEFINE OFF ``` 这之后再运行含有普通 `&` 字符串的内容就不会弹出询问框了。 另外一种方法是在启动 sqlplus 后立即指定 `-s` 参数或通过其他手段改变默认设定,使得整个会话期间都不会遇到此类干扰。 #### 处理URL或其他文本字段内的特殊字符 针对像构建带有查询字符串部分的 HTTP 链接这样的场景,除了上述提到过的义机制外,还可以考虑采用程序化的方式来组装最终要插入数据库里的数据项,确保所有必要的编码换都在应用程序层面完成后再提交到服务器端保存。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值