2012-01-11 4 views
8

오라클에서 PostgreSQL으로 DML (INSERT/UPDATE/DELETE) 쿼리를 변환 한 결과 이제는 동일한 행 집합을 생성하는지 확인해야합니다. 즉, oracle과 postgresql을 가정하면 동일한 행이 삭제됩니다 데이터베이스 업데이트가 PostgreSQL의 측면에서 등 같은 행을 갱신, 처음에 동일한 데이터를 포함, 내가 DML 문에 복귀 절을 사용할 수 있습니다 즉,PostgreSQL에 상응하는 Oracle INSERT ... RETURNING *;

INSERT INTO test(id, name) VALUES(42, 'foo') RETURNING *; 

무엇 위의 문에 대한 좋은 것은 내가 돌아 '앞에 추가 할 수 있다는 것입니다 * '을 DML 구문에 적용하거나 테이블의 이름을 모른 채 모든 DML 구문에 적용하여 select 문과 같은 모든 행을 가져옵니다.

그러나 오라클 측에서는 빛나는 것 같지 않습니다. 문서에 따르면, Oracle 8i (나는 함께 일하고있다)는 RETURNING 절을 지원하지만, 결과를 변수에 저장해야하며, 수동으로 열 이름을 지정하는 대신 모든 결과 열을 가져 오는 분명한 방법이없는 것으로 보입니다.

따라서 테이블이나 열 이름을 하드 코딩하지 않고 '돌아 오는 *'PostgreSQL을 에뮬레이트 할 oracle 문 (또는 일련의 명령문)이 있는지 여부가 문제입니다.

fn('INSERT INTO test(id, name) VALUES(42, ''foo'')') 

그것은 SQL 문에 의해 행 (일반적인 경우 또는 수정) 삽입의 집합을 반환한다 : 즉,이 같은 오라클 함수를 작성하는 방법이있다.

업데이트 : 실제로는 a very similar question (PostgreSQL이 아닌 SQL 서버에서 오라클로 변환)을 찾았습니다. 그래도 가능한 한 더 간단한 대답을 듣고 싶습니다.

+0

Java에서이 SQL을 호출하고 있습니까? –

+0

아니요, 실제로 파이썬 스크립트에서 호출하고 있습니다. 따라서, pername을 반환하는 colname, 1 colname2를 작성하려면 원본 구문을 파싱하고 열과 테이블 이름을 추출해야합니다. 사소한 일. – alexk

+0

왜 지원이 중단되고 중단 된 Oracle 버전을 사용하고 있습니까? –

답변

3

특히 현재 8i와 같은 오라클의 구버전에서는 불가능합니다. 유사한 질문으로이 answer을보십시오.

4

EXECUTE IMMEDIATE, RETURNINGREF CURSOR이 포함 된 솔루션을 상상할 수 있지만 분명히 단순하지는 않습니다. 나는 이전에 임의의 타입의 레코드가 사용될 문제에 대해 this one, involving XML과 같은 솔루션을 발견했습니다. 그들은 적어도 아주 이상한 사람입니다. 나는 두 가지 별도의 쿼리 실행에 의지해야한다고 생각합니다 ... 특히 Oracle 8i에서는 대부분의 기능을 통해 이익을 얻을 수 없을 것입니다.

간단히 말해서 Oracle에서 Postgres ... RETURNING 절만큼 강력한 SQL 구문은 없다고 생각합니다.

관련 문제