2016-06-23 5 views
0

Oracle (12) PL/SQL 저장 프로 시저를 호출하는 VB6 앱이 있습니다. ADODB 연결 개체를 사용합니다.ADO를 다듬어 사용하는 VB6의 매개 변수를 방지하는 방법

응용 프로그램에서 전달 된 문자열 매개 변수에는 공백이있을 수 있습니다. 오라클이이를 받으면 후행 공백이 사라집니다.

후행 공백을 남기고 싶습니다. 나는 모든 곳을 수색했는데 후행 공백이 매개 변수에서 다듬어 져야한다고 말하는 VB, ADO 또는 Oracle의 동작에 대한 온라인 참조를 찾을 수 없습니다.

Oracle에서 저장 프로 시저에 대한 매개 변수는 varchar2로 정의됩니다. VB6에서는 CreateParameter()를 사용하여 매개 변수를 adVarChar로 추가합니다 (다른 문자열 유형을 시도했지만 도움이되지 않습니다). 호출은 이름, 유형, 방향, 크기 및 값을 지정합니다.

Execute 호출 바로 전에 Command.Parameters 컬렉션을 검사하여 후행 공백이 있는지 확인할 수 있습니다.

Oracle 참조는 varchar2 데이터 형식에서 후행 공백이 이 아니고이 무시된다는 것을 명시 적으로 나타냅니다.

VB 또는 데이터베이스에서이 문제의 원인이 될 수있는 옵션이 있는지 설명 할 수 있습니까?

+0

코드를 보여 주실 수 있습니까? –

+0

IIRC에서 후행 공백은 DB에 저장되며 값을 검색하면 거기에 있습니다. 그것들은 무시됩니다. 즉, WHERE 절과 CASE 형 검사를 할 때'Foo'가'Foo'와 같다고 SQL 언어 표준이 말합니다. –

+0

아, 주제에 대한 몇 가지 문서가 있습니다. 오라클이 아닌 SQL Server에서 왔지만, 오라클이 ansi 표준을 참조하고 있습니다 (Ansi SQL-92, 섹션 8.2, <비교 조건>, 일반 규칙 # 3) https://support.microsoft .com/ko-kr/kb/316626 Sql Server에서는 동등 비교 대신 LIKE 비교를 수행하여이 문제를 해결할 수 있습니다. 오라클이 동일한 동작을하는지는 알 수 없습니다. –

답변

0

null을 추가하면 작동합니까? 공백이있는 문자열의 끝에 chr(0)?

매개 변수를 전달하는 코드를 표시 할 수 있습니까? 문자열의 길이에 대해 무엇을 전달하고 있습니까? 즉. len()을하기 전에 트림을하고 있습니까?

+0

null을 사용하려고했는데 (실제로 chr (0)으로 막혔다 - vbNullChar를 사용해야했다.) 차이점이 없었다. Oracle에 도달하면 공간은 사라집니다. 코드가 다양한 기능에 적층하지만,이 ** 요약 된 ** PARAMS를 생성 버전 대략적이다 : 'SetParam 에서' –

+1

파라미터를 생성하고 커맨드 객체 '가 입력 파라미터 로 가정에 추가 mghrid를 사용하는 경우 .Col = 열 '길이가 0 인 경우 CreateParameter 초크 또는 형식이 날짜이고 텍스트가' '인 경우 따라서 IIfs cmd.Parameters.Append cmd.CreateParameter (Name, DataType, adParamInput, IIf (Len (.Text) = 0, 1, Len (.Text)), IIf (.Text = "", Null, .Text)) 로 끝납니다. ' Grid.SetParam cmd, eColumns.Domain, "pDomain ", adVarChar –

+0

보시다시피 길이를 지나기 전에 트림이 없습니다. 제출 직전에 매개 변수 객체를 확인할 수 있으며 공백이 있습니다. –

0

지금까지 언급 한 사항을 추가 할 수있는 충분한 점수가 아직 부족합니다. 해결책을 제시 할 때이 내용을 확장했습니다.

Oracle Objects for OLE (OO4O)는 최신 데이터베이스 버전과의 호환성을위한 최상의 방법입니다. oip12.dll에 대한 참조를 추가하고 사용해보십시오. 내 간단한 테스트 케이스는 sproc이 실제로 후행 공백을 유지하는 매개 변수로 'abc'(즉 3 공백)를 보내는 경우를 보여줍니다. 실제로 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"; 

나는 db 액세스 주변의 래퍼를 사용하므로 예제를 공유하기가 쉽지 않습니다. 적어도 당신과 연결됩니다.

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 
+0

이 모든 세부 정보를 보내 주셔서 감사 드리며이를 수행하는 방법이 있음을 확인하십시오. 나는 잠겨있는 환경에 있기 때문에 불행히도 단기간에 OO4O를 참고 자료로 추가 할 수는 없습니다. (실제로 Stack Exchange에 제출할 수 없도록 여기에 잠겨 있습니다. 내 휴대 전화를 통해이 모든 정보를 얻을 수 있습니다.) Google이 예상하는대로 작동하는 것을 알아두면 좋을 것입니다. 나는 OO4O에 대해 살펴보고 그것이 Devs에게 제공되도록 요청할 것이다. –

+0

불행히도 고전 VB에서 사용한 모든 것은 OO4O입니다. 그것은 물론 당신이 사용하고있는 ADO 공급자를 사용하는 솔루션이있을 수 있지만 그것들에 익숙하지 않습니다. 일이 실패한 곳 (또는 성공할 수있는 경우)을 증명하기 위해 간단한 테스트를 작성하는 것은 쉽습니다. ODBC 공급자에 액세스 할 수 있으면 시도해 볼 수도 있습니다. – topshot