database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 9684 게시물 읽기
No. 9684
오라클 쿼리를 PGSQL로 변환
작성자
탁구공
작성일
2016-07-29 17:05
조회수
8,419

안녕하세요 아직 초보입니다.

 

오라클 쿼리를 pgsql로 변환을 해야하는데 도움이 필요합니다.

 

sqlplus -s "CONTROLM"/"PASSWORD"@"CTRLM" << EOF_STMT > ${MSG_COMM_FILE}

 

WHENEVER SQLERROR EXIT 99

WHENEVER OSERROR EXIT 98

 

SET FEEDBACK OFF

SET SERVEROUTPUT ON

SET LINESIZE 2000

 

DECLARE

 

v1_CONDNAME varchar2(50);

v1_STATE varchar2(2);

v1_CNT number;

 

BEGIN

 

IF SUBSTR('${USR_NO}',1,1) != 'K' OR '${USR_NO}' = 'K0004000' THEN

BEGIN

SELECT COUNT(*)

INTO v1_CNT

FROM CMR_AJF

WHERE ODATE = '${ODATE}'

AND (APPLIC = '${CTM_APPL_NAME}' OR APPLIC = '${CTM_APPL_NAME_NEW}')

AND APPLGROUP LIKE '${CTM_GRP_NAME}'

;

 

dbms_output.put_line( 'CTM_SCH='||v1_CNT );

 

EXCEPTION WHEN NO_DATA_FOUND THEN

dbms_output.put_line( 'CTM_SCH='||'Not Scheduled' );

WHEN others THEN

dbms_output.put_line( 'RET_SQLCODE='||sqlcode );

END;

 

ELSE

 

dbms_output.put_line( 'CTM_SCH='||1 );

 

END IF;

 

BEGIN

SELECT CONDNAME

INTO v1_CONDNAME

FROM CMR_CONTAB

WHERE TRIM(CONDDATE) = SUBSTR('${ODATE}', 5, 4)

AND CONDNAME = '${CTM_COND_NAME}'

;

 

dbms_output.put_line( 'CONDNAME='||v1_CONDNAME );

dbms_output.put_line( 'RET_SQLCODE=0' );

 

EXCEPTION WHEN NO_DATA_FOUND THEN

dbms_output.put_line( 'RET_SQLCODE=0' );

WHEN others THEN

dbms_output.put_line( 'RET_SQLCODE='||sqlcode );

END;

 

 

BEGIN

SELECT DISTINCT STATE

INTO v1_STATE

FROM CMR_AJF

WHERE ODATE = '${ODATE}'

AND (APPLIC = '${CTM_APPL_NAME}' OR APPLIC = '${CTM_APPL_NAME_NEW}')

AND APPLGROUP LIKE '${CTM_GRP_NAME}'

AND STATE NOT IN ('C','1','B') -- '1':Order And Confirm, '8':Normal End, 'C' : Order

AND ROWNUM = 1

;

 

dbms_output.put_line( 'CTM_STATE='||v1_STATE );

dbms_output.put_line( 'RET_1SQLCODE=0' );

 

EXCEPTION WHEN NO_DATA_FOUND THEN

dbms_output.put_line( 'RET_1SQLCODE=0' );

WHEN others THEN

dbms_output.put_line( 'RET_1SQLCODE='||sqlcode );

END;

 

END;

/

EOF_STMT

이 글에 대한 댓글이 총 2건 있습니다.

Oracle에서 PostgreSQL로 전환하는 작업은 두 데이터베이스 모두 잘 알아야합니다.

자료형의 차이, 함수의 차이, 쿼리 구문 차이, .... 꽤 많은 부분이 약간씩 다릅니다.

해 보면서 하나씩 배워가야죠 뭐.

 

쉘 스크립트 같은데서 사용하던 내용의 부분만 인용한 것 같은데요.

 

모든 것은 그대로 두고,

sqlplus -s 접속문자열

이 부분은

 psql -q 접속문자열

형태로 바꾸고,

(이 말은 psql 명령어를 이용해서 어떻게 데이터베이스에 접속하는가를 알아야 하겠지요)

whenever 구문은 없음으로 모두 빼고,

set 명령으는

psql에서 사용하는 \pset 관련으로 변경하고,

(윗 예제라면 모두 빼도 됩니다)

 

다음

declear

begin

end;

/

이 부분은 오라클의 plsql 구문입니다.

이것은 plpgsql 구문으로 바꾸어야 합니다.

plpgsql 내장 프로시져 언어를 알아야겠지요. (아래에서 간략하게 소개하겠습니다.)

여튼 이렇게 plpgsql 구문을 psql에서 단순히 stdin으로 사용하려면,

do 라는 sql 명령어를 알아야합니다.  

do $$

plpgsql 구문들....

$$;

이런식으로 사용됩니다.

 

plsql에서 plpgsql 전환에 대해서는

두 내장 언어의 차이점을 잘 알아야하겠죠.

 

윗 부분을 모두 전환하는 것은 이 답변 성격에 맞지 않아,

예제로 작성하겠습니다.

 

다음은 쉘 스크립트 전부입니다.

 

#!/bin/sh

userid=`whoami`
MSG_COMM_FILE="msg.result"

psql -q -h localhost -U postgres postgres << END_OF_PLPGSQL 2> ${MSG_COMM_FILE}
do \$_\$
declare
v1_cnt numeric;

begin
    select count(*) into v1_cnt 
    from pg_tables where tableowner = '${userid}';
    raise info 'object count = %', v1_cnt;
end;
\$_\$;
END_OF_PLPGSQL

echo "Done!"

윗 내용을 파일로 저장해서 쉘에서 실행하면, msg.result 파일에 작업 결과가 담기겠죠.

 

김상기(ioseph)님이 2016-07-29 18:40에 작성한 댓글입니다.

 안녕하세요 답변 감사합니다

제가 왕초보라서 이해를 하지 못했습니다 죄송합니다

또한 감사합니다

 

 

탁구공님이 2016-08-01 21:23에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
9690AIX7.1 에서 PG 컴파일 오류 [2]
NK
2016-08-08
7036
9689PG 파일 시스템 구성 [1]
NK
2016-08-05
7432
9685PG 설치 시 READLINE 관련 오류 질문입니다. [2]
NK
2016-07-31
7164
9684오라클 쿼리를 PGSQL로 변환 [2]
탁구공
2016-07-29
8419
9683postgresql 클로닝을 떳는데요 [1]
서호연
2016-07-28
8039
9682libpq 사용시 물리적 네트워크단선에 대한 처리 방법 문의 [3]
질의
2016-07-27
7153
9681psql 한글 깨짐 문의 [4]
하하
2016-07-26
10588
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.052초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다