我有一个VB6应用程序,它调用Oracle(12)PL / SQL存储过程。它使用ADODB连接对象。
从app传递的字符串参数可能有尾随空格。当Oracle收到它们时,任何尾随空格都消失了。
我希望保留尾随空格。我已经到处搜索,无法在线查找VB,ADO或Oracle的行为,其中说尾随空格是应该在参数中修剪。
在Oracle中,存储过程的参数定义为varchar2。 在VB6中,我使用CreateParameter()将params添加为adVarChar(我已尝试过其他字符串类型但它没有帮助)。该调用指定了名称,类型,方向,大小和值。
在执行调用之前,我可以检查Command.Parameters集合并验证是否存在任何尾随空格。
Oracle引用明确声明使用varchar2数据类型,尾随空格不被忽略。
有人可以描述VB或数据库中是否有选项导致此问题,并且可以关闭吗?
答案 0 :(得分:0)
如果你附加一个null,它是否有效,即。 chr(0)
到包含空格的字符串的末尾?
你能展示传递参数的代码吗?你为串的长度传递了什么 - 即。你在做len()之前做过修剪吗?
答案 1 :(得分:0)
现在仍然没有足够的观点来添加评论,因为我扩展了它,因此它有资格作为解决方案。
Oracle Objects for OLE(OO4O)是与现代数据库版本兼容的最佳选择。添加对oip12.dll的引用并试用它。我的快速测试案例显示,如果我发送' abc' (这是3个空格)作为参数,sproc确实保留了尾随空格。我实际上使用的是oip10.dll,但数据库是12c。我使用的快速Oracle示例。
CREATE TABLE TEMPTestTrailingSpace
(F1 VARCHAR2(30) NOT NULL
,F2 NUMBER(12,0) NOT NULL
,DATEIN DATE NOT NULL
) ;
create public synonym TEMPTestTrailingSpace for trace_owner.TEMPTestTrailingSpace;
grant SELECT on TEMPTestTrailingSpace to "TRACE_USER";
Insert into TEMPTestTrailingSpace values ('abc',1,sysdate);
Insert into TEMPTestTrailingSpace values ('abc ',2,sysdate);
Insert into TEMPTestTrailingSpace values ('abc ',3,sysdate);
Insert into TEMPTestTrailingSpace values ('abc ',4,sysdate);
Insert into TEMPTestTrailingSpace values ('abd',5,sysdate);
Insert into TEMPTestTrailingSpace values ('abd ',6,sysdate);
Insert into TEMPTestTrailingSpace values ('abd ',7,sysdate);
Create or Replace Procedure getTestRecord
(
P_PN IN VARCHAR2,
p_rec OUT number
)
IS
BEGIN
SELECT f2
INTO p_rec
FROM TEMPTestTrailingSpace
WHERE f1 = p_pn;
END;
/
create public synonym getTestRecord for trace_owner.getTestRecord;
grant execute on getTestRecord to "TRACE_USER";
我在数据库访问中使用了一个包装器,因此分享一个示例并不容易。这至少可以让你联系起来。
Public ooSession As Object
Public ooDB As Object
Dim ConnStr As String
Set ooSession = New OracleInProcServer.OraSessionClass
ConnStr = userID & "/" & password
Set ooDB = ooSession.OpenDatabase(dataSource, ConnStr, 0&) 'dataSource = Oracle SID or alias in TNSNames.ora file