이 섹션은 간의 차이점을 설명합니다.postgresql's스포츠 토토/pgsql언어 및 Oracle 's스포츠 토토/sql언어 의 응용 프로그램Oracle® toPostgreSQL.
스포츠 토토/pgsqlPL/SQL과 유사합니다 여러 측면에서. 블록 구조화되고 명령적인 언어이며 그리고 모든 변수는 선언되어야합니다. 과제, 루프, 조건부는 비슷합니다. 당신이 유지 해야하는 주요 차이점 에서 포팅 할 때 마음스포츠 토토/sqlto스포츠 토토/pgsqlare :
매개 변수에 대한 기본값은 없습니다PostgreSQL.
당신은에서 함수 이름을 과부하 할 수 있습니다.postgresql. 이것은 종종 작동하는 데 사용됩니다 기본 매개 변수가 부족합니다.
커서가 필요 없음스포츠 토토/pgsqlfor진술. (보다예제 35-6.)
inPostgreSQL당신은 필요합니다 함수에서 달러 인용 또는 탈출 단일 따옴표 사용 몸. 보다섹션 35.2.1.
패키지 대신 스키마를 사용하여 구성하십시오 그룹으로의 기능.
패키지가 없으므로 패키지 레벨이 없습니다 변수. 이것은 다소 성가시다. 당신은 할 수 있습니다 세션 당 상태를 임시 테이블에 유지하려면 대신.
예제 35-5간단한 기능을 포트하는 방법을 보여줍니다스포츠 토토/sqlto스포츠 토토/pgsql.
예 35-5. 에서 간단한 기능 포팅스포츠 토토/sqlto스포츠 토토/pgsql
여기에Oracle 스포츠 토토/sql기능 :
함수 생성 또는 교체 CS_FMT_BROWSER_VERSION (v_name in varchar, v_version in varchar) 반환 바르 르 차입니다 시작하다 v_version이 null이면 그렇다면 반환 v_name; 끝 IF; 반환 v_name || '/'|| v_version; 끝; / 오류 표시;
이 기능을 살펴보고의 차이점을 보자.스포츠 토토/pgsql:
Oracle가능in, out및inout매개 변수가 함수로 전달되었습니다.inout14538_14641PostgreSQLin매개 변수 매개 변수의 사양이 없습니다.
thereturn키워드 함수 프로토 타입 (기능 본문이 아님)이됩니다반환inpostgresql. 또한,isas, 그리고 당신은 a를 추가해야합니다.언어절로스포츠 토토/pgsql유일한 기능 언어는 아닙니다.
inPostgreSQL, 기능 본문은 문자열 문자로 간주됩니다. 당신은 그 주변의 견적 마크 또는 달러 인용문을 사용해야합니다. 이것은 종료를 대신합니다/Oracle 접근법에서.
the오류 표시명령 존재하지 않음PostgreSQL, 오류 가보고되어 필요하지 않습니다 자동으로.
이것은이 기능이 포팅되었을 때 어떻게 보이는지입니다.PostgreSQL:
함수 작성 또는 교체 CS_FMT_BROWSER_VERSION (V_NAME VARCHAR, v_version varchar) Varchar를 $$로 반환합니다 시작하다 v_version이 null이면 그렇다면 반환 v_name; 끝 IF; 반환 v_name || '/'|| v_version; 끝; $$ 언어 plpgsql;
예제 35-6다른 기능을 생성하는 함수를 포트하는 방법을 보여줍니다 기능 및 다음 인용 문제를 처리하는 방법.
예 35-6. 생성하는 함수를 포팅합니다 의 또 다른 함수스포츠 토토/sqlto스포츠 토토/pgsql
다음 절차는 a에서 행을 잡습니다.select진술 및 큰 기능을 구축합니다 결과와 함께if진술, 효율성을 위해. 특히 주목하십시오 커서와의 차이점for루프.
이것은 Oracle 버전입니다 :
절차 작성 또는 교체 CS_UPDATE_REFERRER_TYPE_PROC IS Cursor referrer_keys입니다 CS_REFERRER_KEYS에서 *를 선택하십시오 try_order의 주문; func_cmd varchar (4000); 시작하다 func_cmd : = '함수 생성 또는 교체 CS_FIND_REFERRER_TYPE (v_host in varchar, Varchar의 V_Domain, Varchar의 V_URL) Return varchar가 시작됩니다. '; referrer_key의 경우 referrer_keys 루프 func_cmd : = func_cmd || 'V_'|| referrer_key.kind || '좋아요' ''|| referrer_key.key_string || ````그런 다음 반환 '' '|| referrer_key.referrer_type || '' ';; 끝 If; '; 엔드 루프; func_cmd : = func_cmd || '귀환 널; 끝;'; 즉시 func_cmd를 실행합니다. 끝; / 오류 표시;
이 함수가 어떻게 끝나는 지PostgreSQL:
함수 생성 또는 교체 CS_UPDATE_REFERRER_TYPE_PROC () voids는 $ func $로 void을 반환합니다 선언하다 참조 _key 레코드; - a에 사용할 일반 레코드를 선언하십시오. func_body 텍스트; func_cmd 텍스트; 시작하다 func_body : = '시작'; - 루프 용 쿼리 결과를 스캔하는 방법에 주목하십시오. - for <crecor 구성을 사용합니다. 선택 *에서 cs_referrer_keys wrome에서 referrer_key의 경우 try_order loop의 주문 func_body : = func_body || 'V_'|| referrer_key.kind || '좋아요'|| quote_literal (referrer_key.key_string) || '그런 다음 반환'|| quote_literal (referrer_key.referrer_type) || ';; 끝 If; ' ; 엔드 루프; func_body : = func_body || '귀환 널; 끝;'; func_cmd : = '기능 생성 또는 교체 CS_FIND_REFERRER_TYPE (V_HOST VARCHAR, v_domain varchar, v_url varchar) varchar를 '로 반환합니다. || quote_literal (func_body) || '언어 plpgsql;' ; func_cmd를 실행합니다. 반품; 끝; $ func $ language plpgsql;
함수의 본문이 어떻게 별도로 구축되는지 확인하십시오. 그리고 통과quote_literalto 인용 표시가 두 배로 늘어납니다. 이 기술이 필요합니다 우리는 정의를 위해 달러 인용문을 안전하게 사용할 수 없기 때문에 새로운 기능 : 우리는 어떤 줄이 될지 확실하지 않습니다. 에서 보간referrer_key.key_string필드. (우리는 여기서referrer_key.kind항상 신뢰할 수 있습니다 BEhost, 도메인또는url그러나referrer_key.key_string무엇이든, 특히 그것은 달러 표지판을 포함 할 수 있습니다.) 이것 기능은 실제로 Oracle Original의 개선입니다. 이 깨진 코드를 생성하지 않기 때문에referrer_key.key_string또는referrer_key.referrer_type견적을 포함하십시오 점수.
예제
35-7|out매개 변수 및 문자열 조작.PostgreSQLinstr
기능이지만 작업 할 수 있습니다
다른 기능의 조합을 사용하여 주변.in섹션
35.11.3a스포츠 토토/pgsql구현instr
포팅에 사용할 수 있습니다
더 쉬운.
예 35-7. 문자열로 절차를 포팅합니다 조작 및out매개 변수PL/SQLtoPL/PGSQL
다음OraclePL/SQL 절차는 URL을 구문 분석하고 여러 반환하는 데 사용됩니다. 요소 (호스트, 경로 및 쿼리). 안에PostgreSQL, 함수 만 반환 할 수 있습니다 하나의 가치. 이것을 해결하는 한 가지 방법은 반환하는 것입니다. 값 복합 유형 (행 유형).
이것은 Oracle 버전입니다 :
절차 작성 또는 교체 CS_PARSE_URL ( Varchar의 v_url, V_HOST OUT VARCHAR-- 이것은 다시 전달됩니다 V_PATH OUT VARCHAR- - 이것도 v_query out varchar) - 그리고 이것 이다 A_POS1 정수; A_POS2 정수; 시작하다 v_host : = null; v_path : = null; v_query : = null; a_pos1 : = inst (v_url, '//'); A_POS1 = 0이면 반품; 끝 IF; a_pos2 : = inst (v_url, '/', a_pos1 + 2); a_pos2 = 0이면 v_host : = substr (v_url, a_pos1 + 2); v_path : = '/'; 반품; 끝 IF; v_host : = substr (v_url, a_pos1 + 2, a_pos2 -a_pos1-2); a_pos1 : = inst (v_url, '?', a_pos2 + 1); A_POS1 = 0이면 v_path : = substr (v_url, a_pos2); 반품; 끝 IF; v_path : = substr (v_url, a_pos2, a_pos1 -a_pos2); v_query : = substr (v_url, a_pos1 + 1); 끝; / 오류 표시;
여기에 가능한 번역이 있습니다스포츠 토토/pgsql:
유형 생성 CS_PARSE_URL_RESULT AS ( v_host varchar, v_path varchar, V_Query Varchar ); 기능 생성 또는 교체 CS_PARSE_URL (V_URL VARCHAR) CS_PARSE_URL_RESULT를 $$로 반환합니다 선언하다 RES CS_PARSE_URL_RESULT; A_POS1 정수; A_POS2 정수; 시작하다 res.v_host : = null; res.v_path : = null; res.v_query : = null; a_pos1 : = inst (v_url, '//'); A_POS1 = 0이면 리턴 레스; 끝 IF; a_pos2 : = inst (v_url, '/', a_pos1 + 2); a_pos2 = 0이면 res.v_host : = substr (v_url, a_pos1 + 2); res.v_path : = '/'; 리턴 레스; 끝 IF; res.v_host : = substr (v_url, a_pos1 + 2, a_pos2 -a_pos1-2); a_pos1 : = inst (v_url, '?', a_pos2 + 1); A_POS1 = 0이면 res.v_path : = substr (v_url, a_pos2); 리턴 레스; 끝 IF; res.v_path : = substr (v_url, a_pos2, a_pos1 -a_pos2); res.v_query : = substr (v_url, a_pos1 + 1); 리턴 레스; 끝; $$ 언어 plpgsql;
이 기능은 다음과 같이 사용할 수 있습니다.
선택 *에서 CS_PARSE_URL ( 'http://foobar.com/query.cgi?baz');
예제 35-8수많은 사용 절차를 포트하는 방법을 보여줍니다 Oracle에 특화된 기능.
예 35-8. 절차 포팅PL/SQLtoPL/PGSQL
Oracle 버전 :
절차 작성 또는 교체 CS_CREATE_JOB (v_job_id)는 IS입니다 a_running_job_count 정수; Pragma Autonomous_transaction;(1)시작 독점 모드의 잠금 테이블 CS_JOBS;(2)cs_jobs에서 a_running_job_count로 count (*)를 선택하십시오. a_running_job_count 0 인 경우 저지르다; - 무료 잠금(3)REASE_APPLICATION_ERROR (-20000, '새 작업을 만들 수 없습니다 : 현재 작업이 실행 중입니다.'); 끝 IF; cs_active_job에서 삭제; cs_active_job (job_id) 값 (v_job_id)에 삽입; 시작하다 cs_jobs (job_id, start_stamp) 값 (v_job_id, sysdate)에 삽입; 예외 dup_val_on_index 일 때 null; - 이미 존재하는지 걱정하지 마십시오 끝; 저지르다; 끝; / 오류 표시
이와 같은 절차는 쉽게 변환 할 수 있습니다PostgreSQL함수 반환void. 이 절차는 특히 우리에게 일부를 가르쳐 줄 수 있기 때문에 특히 흥미 롭습니다 것들:
이것은 우리 가이 절차를 포트 할 수있는 방법입니다스포츠 토토/pgsql:
함수 생성 또는 교체 CS_CREATE_JOB (v_JOB_ID 정수)는 void를 $$로 반환합니다. 선언하다 a_running_job_count 정수; 시작하다 독점 모드에서 잠금 테이블 CS_JOBS; end_stamp가 null 인 cs_jobs에서 a_running_job_count로 count (*)를 선택하십시오. a_running_job_count 0 인 경우 예외 제외 '새 작업을 만들 수 없음 : 현재 작업이 실행 중입니다';(1)END IF; cs_active_job에서 삭제; cs_active_job (job_id) 값 (v_job_id)에 삽입; 시작하다 cs_jobs (job_id, start_stamp) 값 (v_job_id, now ())에 삽입; 예외 고유 _violation이있을 때(2)- 이미 존재하는지 걱정하지 마십시오 끝; 반품; 끝; $$ 언어 plpgsql;
이 섹션은 언제 볼 수있는 몇 가지 다른 사항을 설명합니다. 포팅 오라클PL/SQL함수PostgreSQL.
in스포츠 토토/pgsql예외는에 의해 잡혔다.예외조항, 블록 이후 모든 데이터베이스 변경시작자동으로 롤백됩니다. 즉, 행동은 오라클에서 얻을 수있는 것과 같습니다. 와 함께
시작 SavePoint S1; ... 여기 코드 ... 예외 언제 ... 그럼 S1 롤백; ... 여기 코드 ... 언제 ... 그럼 S1 롤백; ... 여기 코드 ... 끝;
사용하는 Oracle 절차를 번역하는 경우SavePoint및롤백으로이 스타일에서는 작업이 쉽습니다. 그냥 생략SavePoint및롤백으로. 절차가있는 경우 사용SavePoint및롤백으로다른 방식으로 일부 실제 생각이 필요합니다.
스포츠 토토/pgsql버전executePL/SQL버전이지만 있습니다
사용하는 것을 기억하려면quote_literal (텍스트)
및quote_string (텍스트)
에 설명 된대로섹션
35.6.5. 유형의 구성execute 'select * from $ 1';작동하지 않습니다
이 기능을 사용하지 않는 한.
PostgreSQL두 가지를 제공합니다 실행 최적화를위한 기능 생성 수정 자 :"변동성"(함수 여부 동일한 인수가 주어지면 항상 같은 결과를 반환합니다) 그리고"엄격함"( 인수가 null이면 함수를 반환합니다). 상담PostgreSQL : 문서 : 8.0 : 스포츠 토토 사이트 만들기자세한 내용 참조 페이지.
이러한 최적화 속성을 사용할 때함수 생성진술이 보일 수 있습니다 다음과 같은 것 :
함수 생성 foo (...)는 정수를 $$로 반환합니다 ... $$ 언어 plpgsql 엄격한 불변성;
이 섹션에는 세트에 대한 코드가 포함되어 있습니다
오라클 호환instr
함수
포팅 노력을 단순화하는 데 사용할 수 있습니다.
- - Oracle의 상대를 모방하는 기기 기능 - 구문 : inst (String1, String2, [n], [m])는 []가 선택적 매개 변수를 나타냅니다. - -Mth 발생을 위해 Nth 캐릭터에서 시작하여 String1을 검색합니다. - String2. n이 음수이면 뒤로 검색하십시오. M이 통과되지 않으면 - 1이라고 가정합니다 (첫 번째 문자에서 검색이 시작됩니다). - 기능 악기 (Varchar, Varchar)를 작성하십시오. 정수를 $$로 반환합니다 선언하다 POS 정수; 시작하다 POS : = 기기 ($ 1, $ 2, 1); POS 리턴; 끝; $$ 언어 plpgsql 엄격한 불변; 기능 악기 만들기 (String varchar, String_to_search varchar, beg_index 정수) 정수를 $$로 반환합니다 선언하다 POS 정수 NOL NULL DEFAULT 0; temp_str varchar; 정수를 구걸하십시오. 길이 정수; ss_length 정수; 시작하다 beg_index 0이면 temp_str : = substring (beg_index의 문자열); pos : = 위치 (temp_str의 String_to_search); POS = 0이면 반환 0; 또 다른 POS + BEG_INDEX를 반환합니다 -1; 끝 IF; 또 다른 ss_length : = char_length (String_to_search); 길이 : = char_length (문자열); beg : = 길이 + beg_index -ss_length + 2; beg 0 루프 temp_str : = 서브 스트링 (ss_length의 beg에서 문자열); pos : = 위치 (temp_str의 String_to_search); POS 0이라면 반환 구걸; 끝 IF; Beg : = Beg -1; 엔드 루프; 반환 0; 끝 IF; 끝; $$ 언어 plpgsql 엄격한 불변; 기능 악기 생성 (String varchar, String_to_search Varchar, beg_index 정수, cose_index 정수) 정수를 $$로 반환합니다 선언하다 POS 정수 NOL NULL DEFAULT 0; alkes_number 정수 NOL NULL DEFAULT 0; temp_str varchar; 정수를 구걸하십시오. 나는 정수; 길이 정수; ss_length 정수; 시작하다 beg_index 0이면 beg : = beg_index; temp_str : = substring (beg_index의 문자열); 1. Occur_index 루프 pos : = 위치 (temp_str의 String_to_search); I = 1이면 beg : = beg + pos -1; 또 다른 beg : = beg + pos; 끝 IF; temp_str : = 서브 스트링 (beg + 1의 문자열); 엔드 루프; POS = 0이면 반환 0; 또 다른 반환 구걸; 끝 IF; 또 다른 ss_length : = char_length (String_to_search); 길이 : = char_length (문자열); beg : = 길이 + beg_index -ss_length + 2; beg 0 루프 temp_str : = 서브 스트링 (ss_length의 beg에서 문자열); pos : = 위치 (temp_str의 String_to_search); POS 0이라면 alkes_number : = alkes_number + 1; alke_number = cose_index가있는 경우 반환 구걸; 끝 IF; 끝 IF; Beg : = Beg -1; 엔드 루프; 반환 0; 끝 IF; 끝; $$ 언어 plpgsql 엄격한 불변성;