oracle & 和 ' 特殊字符处理 ( like 'GAC/&_%' escape '&'; 这里面的 / 居然将& 转义了 为什么?) ...

文章详细介绍了在导入数据到Oracle时遇到AMP自定义变量的问题及解决办法,包括关闭define功能、替换字符及分拆字符串等三种方法,并提供了处理单引号的三种解决方案。
http://blog.youkuaiyun.com/gjswxhb/article/details/6083242
写道
今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示(plsql 也一样)要给一个自定义变量AMP赋值,一开始我很纳闷,数据是一系列的Insert语句,怎么会有自定义变量呢?后来搜索了一下关键字AMP发现,原来是因为在插入数据中有一个字段的内容如下:

http://mobile.three.com.hk/3DX?uid=0676&sid=rt_060908

Oracle把这里的URL的参数连接符&当成是一个自定义变量了,所以要求我给变量AMP赋值。怎么办呢?方法有三:



处理 & 字符
·方法一:在要插入的SQL语句前加上Set define off;与原SQL语句一起批量执行

我们在SQL*PLUS下执行 SQL> show all命令时,可以发现一个参数:define "&" (hex 26),如下图所示

......
concat "." (hex 2e)
copycommit 0
copytypecheck ON
define "&" (hex 26)
describe DEPTH 1 LINENUM OFF INDENT OFF
echo OFF
......

这个是Oracle里面用来识别自定义变量的设置,现在我们在SQL*PLUS下将其关闭:

SQL> Set define OFF;

然后再次执行导入脚本,OK!问题搞定。

注意:如果是在TOAD(plsql 也一样)中执行,建议在每一个要导入的脚本第一行加上前面那句关闭define的话,否则当你导入第二个含有特殊字符的脚本的时候,又会出错。
如果是在SQL*PLUS中执行,则只需要设置一次define OFF,后面就可以连续导入了。直到你重新设置define ON为止。







SET DEFINE OFF 的用法;
在SQL*Plus中默认的"&"表示替代变量,也就是说,只要在命令中出现该符号,SQL*Plus就会要你输入替代值。这就意味着你无法将一个含有该符号的字符串输入数据库或赋给变量,如字符串“SQL&Plus”系统会理解为以“SQL”打头的字符串,它会提示你输入替代变量Plus的值,如果你输入ABC,则最终字符串转化为“SQLABC”。
set define off 则关闭该功能,“&”将作为普通字符,如上例,最终字符就为“SQL&Plus”
set define off关闭替代变量功能
set define on 开启替代变量功能
set define * 将默认替代变量标志符该为“*”(也可以设为其它字符)





·方法二:在SQL语句中将'&'替换成chr(38),因为chr(38)是‘&’的ASCII码

SQL> Select 'Tom' || chr(38) || 'Jerry' from dual;





·方法三:分拆原来的字符串

SQL> Select 'Tom' || '&' || 'Jerry' from dual;




我们可以看到,方法一最为简便,而且效率也最高。方法二因为有一个调用函数的过程,所以性能稍差。方法三需要两次连接字符串,效率最差!





处理 ' 字符

那么如果字段的内容中包含了单引号要怎么插入呢?例如:It's fine。方法同样有三



·方法一:使用转义字符

SQL > Select 'test' || '''' from dual;

注意:这里的''''四个单引号是什么意思呢?首先第一个和最后一个都是Oracle中的字符串连接符,这个没有异议。那么第二个'和第三'又表示什么意思呢?第二个'是一个转义字符
第三个'才是我们真正的内容



·方法二:同样是使用转义字符,只不过方式不同而已

SQL > Select 'test ''' from dual;

注意:这里的第二个,第三个'就是我们上面方法一中提到的转义符和真正的内容



·方法三:在SQL中将'替换成chr(39),因为chr(39)是'的ASCII码

SQL > Select 'It' || chr(39) || 'fine' from dual;





以上 转自:http://lichangwei.javaeye.com/?page=3&show_full=true (本文稍作了修改)





以上的 ' 转义字符,只能转变 ' 的意思,或者说' 只能转变 ' 为字符,不能对其他字符进行转义 如通配符的转义



通配符的转义
通配符的转义没有专门的字符,或者说,统配符的转义字符用 关键字: ESCAPE 指定,



如下面的t 为转义字符,

SQL> select * from user_tables where table_name like 'GACt_%' escape 't';

TABLE_NAME TABLESPACE_NAME CLUSTER_NAME
------------------------------ ------------------------------ ------------------------------
GAC_NITIN SYSTEM





而 ' 也可以指定为 通配符的转义字符 (必须先通过 ' 将 ' 转义)

SQL> select * from user_tables where table_name like 'GAC''_%' escape '''';

TABLE_NAME TABLESPACE_NAME CLUSTER_NAME
------------------------------ ------------------------------ ------------------------------
GAC_NITIN SYSTEM

以上两种情况可以理解,下面两种情况却费解了,

下面这条语句执行时,没有弹出对话框,也就是说plsql 没有将 & 当作表示替代变量的符号, 是 / 将其转义了吗? 为什么 / 能将其转义? escape 指定的不是 / 啊? 为什么他还能转义?

SQL> select * from user_tables where table_name like 'GAC/&_%' escape '&';

TABLE_NAME TABLESPACE_NAME CLUSTER_NAME
------------------------------ ------------------------------ --------------
GAC_NITIN SYSTEM



而下面的语句在执行是却弹出对话框要求为 _ 赋替代值, 这是否能说明 escape 没有将其转义, 还是因为到第一个& 时还不知道 escape

已经期指定为:转义字符?

SQL> select * from user_tables where table_name like 'GAC&_%' escape '&';

TABLE_NAME TABLESPACE_NAME CLUSTER_NAME
------------------------------ ------------------------------ ----------------
GAC_NITIN SYSTEM



很奇怪, like 'GAC/&_%' escape '&'; 这里面的 / 居然将& 转义了 为什么?



这些可能涉及到闭包之类的知识(隐隐约约记得编译原理老师讲过) 当初没学会, 现在要加倍努力!

 

有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾。 ************** 异常文本 ************** System.EntryPointNotFoundException: 无法在 DLL“icsneo40.dll”中找到名为“icsneoFindDevices”的入口点。 在 CSnet.icsNeoDll.icsneoFindDevices(NeoDeviceEx& pNeoDevice, Int32& pNumDevices, UInt32 DeviceTypes, UInt32 numDeviceTypes, OptionsNeoEx& pOptionsFindNeoEx, UInt32 reserved) 在 Bms.Bll.CANModel.ValueCANExtension.StartCAN() 在 Bms.Bll.CANModel.BaseCanExtension.OpenCAN() 在 Bms.Bll.BaseDataManger.StartBms() 在 USr4RMg9RdFFCA1iw5R.bMnMeKx2Hu(Object , USr4RMg9RdFFCA1iw5R ) 在 BMSApp.S73P1h.OverViewPage.BpvTHApXa1(Object , EventArgs ) 在 System.Windows.Forms.Control.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnClick(EventArgs e) 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 在 CCWin.SkinControl.SkinButton.qRpZFGwT0Q6MNbSEADM6(Object , Object ) 在 CCWin.SkinControl.SkinButton.OnMouseUp(MouseEventArgs e) 在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 在 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.ButtonBase.WndProc(Message& m) 在 System.Windows.Forms.Button.WndProc(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ************** 已加载的程序集 ************** mscorlib 程序集版本:4.0.0.0 Win32 版本:4.8.9310.0 built by: NET481REL1LAST_C 基本代码:file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll ---------------------------------------- BMSApp 程序集版本:1.0.0.0 Win32 版本:1.0.0.0 基本代码:file:///D:/%E4%B8%8A%E4%BD%8D%E6%9C%BA/%E6%99%BA%E6%96%B0/BMSAPP20240508/BMSAPP20240508/BMSApp.exe ---------------------------------------- System.Core 程序集版本:4.0.0.0 Win32 版本:4.8.9316.0 built by: NET481REL1LAST_C 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll ---------------------------------------- System 程序集版本:4.0.0.0 Win32 版本:4.8.9320.0 built by: NET481REL1LAST_B 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll ---------------------------------------- System.Windows.Forms 程序集版本:4.0.0.0 Win32 版本:4.8.9251.0 built by: NET481REL1LAST_C 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll ---------------------------------------- System.Drawing 程序集版本:4.0.0.0 Win32 版本:4.8.9032.0 built by: NET481REL1 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll ---------------------------------------- CSkin 程序集版本:16.1.14.3 Win32 版本:16.1.14.3 基本代码:file:///D:/%E4%B8%8A%E4%BD%8D%E6%9C%BA/%E6%99%BA%E6%96%B0/BMSAPP20240508/BMSAPP20240508/CSkin.DLL ---------------------------------------- Bms.Entity 程序集版本:1.0.0.0 Win32 版本:1.0.0.0 基本代码:file:///D:/%E4%B8%8A%E4%BD%8D%E6%9C%BA/%E6%99%BA%E6%96%B0/BMSAPP20240508/BMSAPP20240508/Bms.Entity.DLL ---------------------------------------- Bms.Windows.Framework 程序集版本:1.0.0.0 Win32 版本:1.0.0.0 基本代码:file:///D:/%E4%B8%8A%E4%BD%8D%E6%9C%BA/%E6%99%BA%E6%96%B0/BMSAPP20240508/BMSAPP20240508/Bms.Windows.Framework.DLL ---------------------------------------- System.Configuration 程序集版本:4.0.0.0 Win32 版本:4.8.9032.0 built by: NET481REL1 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll ---------------------------------------- System.Xml 程序集版本:4.0.0.0 Win32 版本:4.8.9032.0 built by: NET481REL1 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll ---------------------------------------- Bms.Bll 程序集版本:1.0.0.0 Win32 版本:1.0.0.0 基本代码:file:///D:/%E4%B8%8A%E4%BD%8D%E6%9C%BA/%E6%99%BA%E6%96%B0/BMSAPP20240508/BMSAPP20240508/Bms.Bll.DLL ---------------------------------------- Bms.Core 程序集版本:1.0.0.0 Win32 版本:1.0.0.0 基本代码:file:///D:/%E4%B8%8A%E4%BD%8D%E6%9C%BA/%E6%99%BA%E6%96%B0/BMSAPP20240508/BMSAPP20240508/Bms.Core.DLL ---------------------------------------- log4net 程序集版本:1.2.11.0 Win32 版本:1.2.11.0 基本代码:file:///D:/%E4%B8%8A%E4%BD%8D%E6%9C%BA/%E6%99%BA%E6%96%B0/BMSAPP20240508/BMSAPP20240508/log4net.DLL ---------------------------------------- vxlapi_NET 程序集版本:9.7.1.13386 Win32 版本:9.7.1.13386 基本代码:file:///D:/%E4%B8%8A%E4%BD%8D%E6%9C%BA/%E6%99%BA%E6%96%B0/BMSAPP20240508/BMSAPP20240508/vxlapi_NET.DLL ---------------------------------------- ZedGraph 程序集版本:5.1.5.28844 Win32 版本:5.1.5.28844 基本代码:file:///D:/%E4%B8%8A%E4%BD%8D%E6%9C%BA/%E6%99%BA%E6%96%B0/BMSAPP20240508/BMSAPP20240508/ZedGraph.DLL ---------------------------------------- System.Data 程序集版本:4.0.0.0 Win32 版本:4.8.9214.0 built by: NET481REL1LAST_B 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll ---------------------------------------- mscorlib.resources 程序集版本:4.0.0.0 Win32 版本:4.8.9032.0 built by: NET481REL1 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/mscorlib.resources.dll ---------------------------------------- Python.Runtime 程序集版本:2.5.2.0 Win32 版本:2.5.2.0 基本代码:file:///D:/%E4%B8%8A%E4%BD%8D%E6%9C%BA/%E6%99%BA%E6%96%B0/BMSAPP20240508/BMSAPP20240508/Python.Runtime.DLL ---------------------------------------- System.Windows.Forms.resources 程序集版本:4.0.0.0 Win32 版本:4.8.9032.0 built by: NET481REL1 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/System.Windows.Forms.resources.dll ---------------------------------------- System.Numerics 程序集版本:4.0.0.0 Win32 版本:4.8.9032.0 built by: NET481REL1 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll ---------------------------------------- Accessibility 程序集版本:4.0.0.0 Win32 版本:4.8.9032.0 built by: NET481REL1 基本代码:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll ---------------------------------------- ************** JIT 调试 ************** 要启用实时(JIT)调试, 该应用程序或计算机的 .config 文件(machine.config)的 system.windows.forms 节中必须设置 jitDebugging 值。 编译应用程序时还必须启用 调试。 例如: <configuration> <system.windows.forms jitDebugging="true" /> </configuration> 启用 JIT 调试后,任何未经处理的异常 都将被发送到在此计算机上注册的 JIT 调试程序, 而不是由此对话框处理
最新发布
10-18
System.EntryPointNotFoundException异常通常发生在尝试从非托管代码(例如,C++ DLL)中调用一个特定的入口点(方法或函数),但是在该DLL中找不到该入口点名称时。以下是一些可能的解决办法: ### 检查DLL版本 确保使用的“icsneo40.dll”版本与代码兼容。不同版本的DLL可能会有不同的函数签名或入口点名称。可以尝试获取最新版本的DLL并替换现有的文件,或者使用与开发环境中测试时相同的版本。 ### 检查函数名称大小写 确认“icsneoFindDevices”的名称大小写是否正确。在非托管代码中,函数名的大小写是敏感的。有时候,由于代码中的拼写错误或大小写不一致,会导致找不到入口点。 ### 检查DLL文件路径 确保“icsneo40.dll”文件位于程序可以访问的路径下。通常,DLL文件应该与可执行文件在同一目录下,或者位于系统的搜索路径中(如System32目录)。可以通过将DLL文件复制到可执行文件所在的目录来解决路径问题。 ### 检查DLL依赖项 “icsneo40.dll”可能依赖于其他DLL文件。如果缺少这些依赖项,可能会导致入口点找不到。可以使用工具(如Dependency Walker)来检查“icsneo40.dll”的依赖关系,并确保所有依赖的DLL文件都存在且版本兼容。 ### 重新安装相关组件 如果“icsneo40.dll”是某个软件或库的一部分,可以尝试重新安装该软件或库,以确保所有文件都正确安装。 ### 使用P/Invoke声明时指定正确的调用约定 在使用P/Invoke(Platform Invoke)从托管代码调用非托管代码时,需要确保指定了正确的调用约定(如`CallingConvention.Cdecl`或`CallingConvention.StdCall`)。例如: ```csharp using System; using System.Runtime.InteropServices; class Program { [DllImport("icsneo40.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int icsneoFindDevices(); static void Main() { try { int result = icsneoFindDevices(); Console.WriteLine("Function call result: " + result); } catch (EntryPointNotFoundException ex) { Console.WriteLine("Entry point not found: " + ex.Message); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值