반응형

윈도우 환경에서 Oracle Client 설치를 해도 ADO를 이용한 접속이 제대로 안되는 경우가 있다.

TNS, 포트 등 기본적인 설정상의 문제가 아니라면 다음을 확인 해보자.

 

1) OraOLEDB.Oracle 경우

 

접속 문자열에서 Provider를 'OraOLEDB.Oracle' 로 지정한 경우 시스템에 'Oracle Provider for OLE DB' 공급자가 정상적으로 등록되어 있어야 한다. 

 

등록여부는 다음과 같이 확인 할 수 있다.

 

1. 확장자 'UDL'로 임의의 파일을 생성 한다.

2. 해당 파일의 속성 창에서 '공급자' 페이지를 확인 한다.  

만약 위와 같이 'Oracle Provider for OLE DB' 가 나타나지 않으면 Oracle 사이트에서 ODAC를 받아서 설치를 한다. 

(http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html) 

그런데 기존에 Oracle client 설치시 함께 설치를 했는데도 나오지 않는 경우에는 regsvr32 명령으로 OraOLEDB11.dll(11g 기준)을 레지스트리에 다시 등록을 해 본다.

만약 ODAC를 기존 Oracle client와 다른 별도의 경로에 설치 한 경우, network\admin\tnsnames.ora 파일에 TNS를 등록해야 한다.
그리고 32비트, 64비트용이 각각 존재 하므로 만약 64비트 윈도우즈 환경에서 32비트 프로그램이 Oracle 접속이 되지 않는다면
32비트 ODAC의 설치가 필요 하다.

참고로 공급자에 제대로 등록이 되어 있지 않은 상태에서 Oracle 접속을 시도할 경우 경우 다음과 같은 오류가 발생 한다. 

2) MSDAORA.1 경우

접속 문자열에서 Provider를 'MSDAORA.1'로 지정한 경우 시스템에 'Microsoft OLE DB Provider for Oracle' 공급자가 정상적으로 등록되어 있어야 한다. 위와 동일한 방법으로 확인 할 수 있다. 

그런데 MSDAORA는 32비트에서만 제공된다. 64비트에서는 더 이상 지원이 안되기 때문에 사용할 수가 없다.

처음에 이것을 몰라서 엄청 애를 먹었다. 꼭 Provider를 MSDAORA를 사용 해야 한다면 어플리케이션을 32비트로 컴파일 해서 사용하고 그렇지 않으면 OraOLEDB.Oracle 를 대신 사용해야 한다.

참고로 공급자에 제대로 등록이 되어 있지 않은 상태에서 Oracle 접속을 시도할 경우 경우 다음과 같은 오류가 발생 한다. 
어떤 경우에 아래와 같이 각각 다른 형태의 메시지가 나타나는 지는 알 수가 없었다.
 

 

이 글이 도움이 되셨으면 댓글을 남겨 주세요!

 
반응형
  1. 초보개발자 2020.01.10 15:45

    현재 꼭 provider를 MSDAORA를 사용해야만 하는 상황인데

    공급자가 제대로 등록이 되어 있지 않아서 공급자를 찾을수없습니다. 올바르게 설치되지 않았을 수 있습니다 라는 에러가 나는데
    해결방법을 도무지 모르겠습니다.
    이것저것 다 설치해봤는데도 해결이 안되는데 혹시 방법이 있을까해서 코멘트를 남겨봅니다.

    • Favicon of https://hackhyun.tistory.com 해나야 2020.02.07 13:18 신고

      안녕하세요. comment 남기신 내용만 보고는 도움을 드리기는 어려울 것 같습니다.
      포스트에 있듯이 MSDAORA는 32비트용만 제공되므로 혹시 이 문제는 아닌지 확인 해보시기 바랍니다.

반응형

 

 

MS SQL 서버에서는 Stored Procedure 내에 그냥 SELECT 문을 써서 rowset을 클라이언트로 보낼 수 있어서
Delphi 에서 간단히 TADOStoredProc를 사용해서 파라미터만 넘겨주면 되었는데,
Oracle 에서는 이것이 되지 않아서 인터넷 에서 여러 자료를 검색하고 테스트를 해 보았지만 잘 되지 않았다.

그러다 시행착오 끝에 결국 해결방법을 찾아서 정리를 해 본다.

1. 우선 SP는 패키지를 이용해서 다음과 같은 식으로 정의 한다.

create or replace package pkgname is
     TYPE tRefCur IS REF CURSOR;
     procedure procname (
	Cust IN VARCHAR2,
	rs1 out tRefCur);
end pkgname;

create or replace package Body pkgname is
   procedure procname (
	Cust IN VARCHAR2,
	rs1 out tRefCur)
   Is
   Begin	
     open rs1 for
     SELECT
	 CustNo          
	,CustName          
	,Owner                 
	,EmpId                                     
	,TelNo            
	,BizNo        
	,vacct_no              
     FROM
	CustMst
     WHERE
	CustName like Cust || '%';

   End procname;
end pkgname;
2. TADOConnection 컴포넌트의 ConnectionString을 이용하여 Oracle 접속 문자열을 세팅 한다.

Provider=OraOLEDB.Oracle.1;Password=패스워드;Persist Security Info=True;
User ID=유저;Data Source=데이터소스;Extended Properties="plsqlrset=1"

 

3. 화면은 간단히 다음과 같이 만들었다.

   검색창에 조회조건을 넣고 Find 버튼을 누르면 SP 호출을 통해서 rowset을 가져와서 TDBGrid에 보여 준다.

 

 

4. Find 버튼에 대한 Event Procedure 에서 다음과 같이 한다.

 

procedure TForm1.btnFindClick(Sender: TObject);
begin
  with ADOStoredProc1 do begin
    Close;
    Parameters.Clear;
    Parameters.CreateParameter('Cust', ftString, pdInput, 20, null).Value := txtFind.Text;
    Open;
  end;
end;

또는 미리 TADOStoredProc의 Parameters 속성에서 INPUT 파라미터를 정의하고 다음과 같이 해도 된다.

 

 

procedure TForm1.btnFindClick(Sender: TObject);
begin
  with ADOStoredProc1 do begin
    Close;
    Parameters.ParamByName('Cust').Value := txtFind.Text;
    Open;
  end;
end;

 

이 글이 도움이 되셨으면 좋아요 눌러 주시거나 댓글을 남겨 주시면 감사 하겠습니다.

 

반응형
반응형

1. Oracle Client 를 설치 및 TNS 설정(tnsnames.ora)

2. SSMS에서 서버개체>연결된 서버 마우스 오른쪽 버튼> 새 연결된 서버 ... 선택

3. 일반 에서 공급자는 Oracle Provider for OLE DB를 선택, 제품이름 및 데이터원본에는 TNS 명 입력


4. 보안에서 '다음 보안 컨텍스트를 사용하여 연결' 선택 후 ID, PW 입력 후 확인



5. SSMS 에서 서버 개체>연결된 서버>공급자>OraOLEDB.Oracle 속성에서 Inprocess 허용을 check 해 준다.

반응형
반응형
Oracle 서버에서 아무 문제 없이 수행되는 쿼리를 MS SQL에서 OpenQuery로 실행 하면


계속해서 "ORA-00936: 누락된 표현식"을(를) 반환했습니다. 라는 오류가 발생 하였다.


Linked Server 속성을 변경 해보기도 하고, 쿼리를 수정 해보기도 하고 별 짓을 해도 마찬 가지 였다.

한참을 고생한 다음에야 원인을 알아 내었다.

원인은 바로 "comment" 였다. 즉 주석 문자('--')가 들어 있으면 제대로 쿼리가 수행이 안 되었던 것이다.

아마도 개행문자(CR, LF)를 인식하지 못하고 OpenQuery로 전달되는 쿼리문장을 한 줄의 텍스트로 넘기는 모양이다.

그래서 주석문자 이후 모두 주석으로 인식하여 Oracle 서버 쪽에서 파싱 중에 오류를 내는 것 같다.

애효... 별 것이 다 말썽이다.
반응형

+ Recent posts