2011-12-20 3 views
2

SQL Server 데이터베이스에 연결하는 Delphi 2010로 작성된 응용 프로그램이 있습니다. 이제 오라클로 마이그레이션하는 중입니다. SQL Server를 사용하면 저장 프로 시저에 연결된 dbgrid에서 삽입, 업데이트, 삭제를 수행하는 것이 매우 쉬웠습니다.저장 프로 시저 구성 요소를 사용할 때 삽입, 삭제, 업데이트

SQL Server의 저장 프로 시저가 결과 집합 내에서 필요한 열을 반환하면 모든 작업을 수행 할 수 있도록 테이블로 쉽게 사용할 수 있기 때문입니다. 이제 오라클과 어떻게 관계가 있는지 알 수 없습니다. 데이터 소스에 DBGrid를 연결합니다. 데이터 셋은 저장 프로 시저 개체이지만 그리드를 편집 할 수 없습니다. 그냥 선택이 가능합니다.

이 작업을 수행하려면 어떻게해야합니까? UniDac 구성 요소 제품군을 사용하여 Oracle 데이터베이스에 연결합니다.

+0

uniDac 구성 요소를 사용하지 않았지만 웹에 TUniStoredProc "매개 변수로 반환 된 커서 데이터를 편집 할 수 있습니다"라는 내용이 있습니다. 어떤 특정 구성 요소를 사용하고 있습니까? –

+0

TUniStoredProcedure –

답변

3

좋아, 최근에 델파이를 다루는 사람이 거의 없다는 것을 알 수 있지만 질문에 대답하고 있습니다. 이제 우리는 오라클 데이터베이스에 저장된 프로 시저가 있다고 가정 해 봅시다 :

이제
CREATE OR REPLACE PROCEDURE GET_EMPLOYEES 
(V_CUR IN OUT SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN V_CUR FOR SELECT * FROM EMPLOYEES; 
END GET_EMPLOYEES; 

는, 델파이에서 저장 프로 시저 구성 요소를 선택 .SET의하고, StoredProcName의 GET_EMPLOYEES (아마 ODAC 또는 UniDac 구성 요소 스위트에서). 그런 다음 프로 시저가 커서로 반환하는 모든 필드를 추가 할 수 있습니다. 응용 프로그램을 실행하고 저장 프로 시저를 활성화하면 모든 레코드를 볼 수 있습니다. 그러나 삽입, 수정 또는 삭제하려고하면 실패합니다. 자, 아주 까다로운 일이 있습니다. 확인하면 모든 필드의 ReadOnly 속성이 True로 설정되어있는 것을 볼 수 있습니다. False로 설정 한 후에도 DBGrid를 편집 할 수는 있지만 실제 데이터베이스에서는 아무 것도 변경되지 않습니다.

그래서, 우리는 주요 부분에 왔습니다. DBGrid에서 바로 작업 할 수 있도록 이전 Delphi-SQL Server 파트너쉽은 어떻게 작동 했습니까? 우리는 마술이 없다는 것을 이해해야합니다. SQL이라면 SQL은 레코드 삽입, 업데이트 및 삭제의 한 가지 방법 밖에 없습니다. 적절한 SQL 문과 함께 있습니다. Delphi-SQL Server에서 우리는 결코 주목하지 않는 암시 적 SQL 문이있는 것 같습니다. 그러나 오라클과 함께, 우리는 각 작업에 대한 자체 진술을 제공해야합니다. 당신은 당신이 DBGrid를 통해 레코드를 삽입 할 UniDac 또는 ODAC는 다음 SQLInsert, SQLUpdate하는 StoredProc가 object.If에서 SQLDelete 속성 거기에 사용하는 경우 변수 다음과 같은 경우 는, 당신은

INSERT INTO EMPLOYEES VALUES(:EMPLOYEEID,:EMPLOYEENAME) 

에의 SQLInsert 속성을 편집해야합니다 : 있습니다 저장 프로 시저의 te 필드에 해당합니다. 단순히 varial을 바인딩합니다. 업데이트 및 삭제시 특정 레코드를 나타내는 고유 한 값이 필요합니다. 기본 키는 하나의 옵션입니다 (같은 목적으로 ROWID를 사용하는 방법을 알지 못했기 때문에 유일한 옵션 일 수 있습니다).따라서 SQL UPDATE에 대한 문의 및

DELETE FROM EMPLOYEES WHERE EMPLOYEEID=:EMPLOYEEID 

UPDATE EMPLOYEES SET EMPLOYEENAME=:EMPLOYEENAME WHERE EMPLOYEEID=:EMPLOYEEID 

P.S. 것 DELETE 방금 업데이트 및 삭제 문의 ROWID를 사용하는 방법을 찾았습니다. 앞의 문장의 RECORD_ROWID에서

UPDATE EMPLOYEES SET EMPLOYEENAME=:EMPLOYEENAME,..... WHERE ROWID=:RECORD_ROWID 
DELETE FROM EMPLOYEES WHERE ROWID=:RECORD_ROWID 

는 필드 이름이 별칭의 결과로 스토어드 프로 시저에서 리턴 : 저장 프로 시저에서는 다음과 같은 같은 문장을 당신의 UPDATE를 구성하고 삭제할 수 있습니다 너무 ROWID를 선택하고 그것에게 별칭을주는 경우 ROWID. 대신 ROWID를 사용하면 "ORA-01745 : 잘못된 호스트/바인드 변수 이름"오류가 발생합니다. 이것은 바인딩 변수에서 콜론 다음에 예약어가 올 수 없기 때문입니다. 그리고 ROWID는 예약어입니다.

3
  1. 오라클은 이러한 기능을 지원하지 않습니다. IOW, Oracle에서는 저장 프로 시저가 제공하는 결과 집합을 편집하거나 저장 프로 시저를 INSERT INTO <name>, UPDATE <name> 또는 DELETE FROM <name>에 포함 할 수 없습니다.
  2. SQL Server 개발자가 저장 프로 시저를 항상 "항상"사용하는 것은 (많은 이유로) 오라클 개발자에게는 일반적이지 않습니다. 하지만 오라클에서도 가능합니다. SP를 사용하여 데이터를 가져 오는 방법을 보려면 "REF CURSOR"을 검색하십시오. 그리고 DB에 업데이트를 게시하려면 일반 또는 패키지 된 (선호하는) SP를 사용하십시오. 이 프로시 저는 인수를 통해 이전/새 필드 값을 수신합니다.
  3. UniDAC에 대해 정확히 말할 수는 없지만 about AnyDAC이라고 말할 수 있습니다. 그러나 UniDAC과 비슷한 기능을 기대합니다. 업데이트를 게시하기 위해 SP를 사용하려면 TXxxUpdateSQL 구성 요소를 사용해야합니다.
+0

+1을 사용하지만 세 번째 설명과 관련하여 때때로 별도의 구성 요소가 없지만 대신 InsertSQL, UpdateSQL 및 DeleteSQL과 같은 일부 속성이 있습니다. –