좋아, 최근에 델파이를 다루는 사람이 거의 없다는 것을 알 수 있지만 질문에 대답하고 있습니다. 이제 우리는 오라클 데이터베이스에 저장된 프로 시저가 있다고 가정 해 봅시다 :
이제
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는 예약어입니다.
uniDac 구성 요소를 사용하지 않았지만 웹에 TUniStoredProc "매개 변수로 반환 된 커서 데이터를 편집 할 수 있습니다"라는 내용이 있습니다. 어떤 특정 구성 요소를 사용하고 있습니까? –
TUniStoredProcedure –