이 섹션은 간의 차이점을 설명합니다.postgresql's범퍼카 토토/pgsql언어 및 Oracle 's범퍼카 토토/sql언어 Oracle에서에 대한 응용 프로그램postgresql.
범퍼카 토토/pgsql는 PL/SQL과 유사합니다 여러 측면에서. 블록 구조화되고 명령적인 언어이며 그리고 모든 변수는 선언되어야합니다. 과제, 루프, 조건부는 비슷합니다. 당신이 유지 해야하는 주요 차이점 에서 포팅 할 때 마음범퍼카 토토/sqlto범퍼카 토토/pgsqlare :
매개 변수에 대한 기본값은 없습니다PostgreSQL.
당신은에서 함수 이름을 과부하 할 수 있습니다.postgresql. 이것은 종종 작동하는 데 사용됩니다 기본 매개 변수가 부족합니다.
커서가 필요 없음범퍼카 토토/pgsqlfor진술. (보다예제 37-3.)
inpostgresql당신은 필요합니다 기능 본문에서 단일 따옴표를 피하십시오. 보다섹션 37.2.1.
패키지 대신 스키마를 사용하여 구성하십시오 그룹으로의 기능.
예제 37-2간단한 함수를 포트하는 방법을 보여줍니다범퍼카 토토/sqlto범퍼카 토토/pgsql.
예 37-2. 에서 간단한 기능 포팅범퍼카 토토/sqlto범퍼카 토토/pgsql
여기에Oracle 범퍼카 토토/sql기능 :
함수 생성 또는 교체 CS_FMT_BROWSER_VERSION (VARCHAR의 V_NAME, v_version in Varchar) 반환 바르 르 차입니다 시작하다 v_version이 null이면 그렇다면 반환 v_name; 끝 IF; 반환 v_name || '/'|| v_version; 끝; / 오류 표시;
이 기능을 살펴보고의 차이점을 보자.범퍼카 토토/pgsql:
PostgreSQL그렇지 않습니다 매개 변수 이름이 지정되었습니다. 당신은 그들을 명시 적으로 별명해야합니다 당신의 기능 내부.
Oracle할 수 있습니다in, out및inout매개 변수가 함수로 전달되었습니다.inout14395_14498PostgreSQLin매개 변수.
thereturn키워드 함수 프로토 타입 (기능 본문이 아님)이됩니다반환inpostgresql.
inPostgreSQL, 함수는 단일 따옴표를 사용하여 생성됩니다 기능 본문의 구분기이므로 탈출해야합니다. 기능 본문 내부의 단일 따옴표.
the/표시 오류명령 존재하지 않음PostgreSQL.
이것은이 기능이 포팅되었을 때 어떻게 보이는지입니다.PostgreSQL:
함수 생성 또는 교체 CS_FMT_BROWSER_VERSION (Varchar, Varchar) varchar를 '로 반환합니다. 선언하다 v_name 별칭 $ 1; $ 2에 대한 v_version 별칭; 시작하다 v_version이 null이면 그렇다면 반환 v_name; 끝 IF; 반환 v_name || ''/''|| v_version; 끝; '언어 plpgsql;
예제 37-3다른 기능을 생성하는 함수를 포트하는 방법을 보여줍니다 기능 및 인용 문제를 처리하는 방법.
예 37-3. 생성하는 함수를 포팅합니다 의 또 다른 함수범퍼카 토토/sqlto범퍼카 토토/pgsql
다음 절차는 a에서 행을 잡습니다.select진술 및 큰 기능을 구축합니다 결과와 함께if진술, 효율성을 위해. 특히 주목하십시오 커서와의 차이점for루프,
이것은 Oracle 버전입니다 :
절차 작성 또는 교체 CS_UPDATE_REFERRER_TYPE_PROC IS Cursor referrer_keys입니다 CS_REFERRER_KEYS에서 *를 선택하십시오 try_order의 주문; a_output varchar (4000); 시작하다 A_OUTPUT : = '기능 작성 또는 교체 CS_FIND_REFERRER_TYPE (VARCHOR의 V_HOST, VARCHAR, VARCHAR, VADDOMAIN Varchar의 v_url) 반환 바르 차르가 시작됩니다. '; referrer_key의 경우 referrer_keys 루프 a_output : = a_output || 'V_'|| referrer_key.kind || '좋아요' ''|| referrer_key.key_string || ````그런 다음 반환 '' '|| referrer_key.referrer_type || '' ';; 끝 If; '; 엔드 루프; a_output : = a_output || '귀환 널; 끝;'; 즉각적인 a_output를 실행합니다. 끝; / 오류 표시;
이 기능이 어떻게 끝나는 지PostgreSQL:
함수 만들기 CS_UPDATE_REFERRER_TYPE_PROC () 정수를 반환합니다. 선언하다 참조 _keys 레코드; - a에 사용할 일반 레코드를 선언하십시오. a_output varchar (4000); 시작하다 a_output : = ''기능 생성 CS_FIND_REFERRER_TYPE (Varchar, Varchar, Varchar) varchar를`` '' '로 반환합니다. 선언하다 $ 1의 V_host 별칭; V_Domain 별칭 $ 2; 3 달러에 대한 v_url 별칭; 시작하다 ''; - 루프 용 쿼리 결과를 스캔하는 방법에 주목하십시오. - for <crecor 구성을 사용합니다. select * in select * from cs_referrer_keys writ_order loop의 referrer_keys 용. a_output : = a_output || ''v_ ''|| referrer_keys.kind || '' 좋다 '''''''''' || referrer_keys.key_string || `` '' '' '' '' ''그런 다음‘ '' '' ' || referrer_keys.referrer_type || '' '' '';; 끝 If; ''; 엔드 루프; a_output : = a_output || ``return null; 끝; '' ''언어 plpgsql; ''; - 실행은 변수를 대체하지 않기 때문에 작동합니다. - 그렇지 않으면 실패합니다. 기능을 실행하는 다른 방법으로 수행하십시오. a_output를 실행하십시오. 끝; '언어 plpgsql;
예제
37-4|out매개 변수 및 문자열 조작.PostgreSQLinstr
기능이지만 작동 할 수 있습니다
다른 기능의 조합을 사용하여 주변.in섹션
37.11.3a범퍼카 토토/pgsql구현instr
포팅에 사용할 수 있습니다
더 쉬운.
예 37-4. 문자열로 절차를 포팅합니다 조작 및out매개 변수범퍼카 토토/sqlto범퍼카 토토/pgsql
다음OraclePL/SQL 절차는 URL을 구문 분석하고 여러 반환하는 데 사용됩니다. 요소 (호스트, 경로 및 쿼리).범퍼카 토토/pgsql함수는 하나만 반환 할 수 있습니다 값. 안에PostgreSQL, 하나 이 주위에서 작업하는 방법은 절차를 3으로 나누는 것입니다. 다른 기능 : 하나는 호스트를 반환하고 다른 하나는 쿼리의 경로,
이것은 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_HOST (VARCHAR) VARCHARS를 반환합니다. 선언하다 $ 1의 V_URL 별칭; v_host varchar; v_path varchar; A_POS1 정수; A_POS2 정수; A_POS3 정수; 시작하다 v_host : = 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 : = ''/''; 반환 v_host; 끝 IF; v_host : = substr (v_url, a_pos1 + 2, a_pos2 -a_pos1-2); 반환 v_host; 끝; '언어 plpgsql;
예제 37-5다수를 사용하는 절차를 포트하는 방법을 보여줍니다 Oracle에 특화된 기능.
예 37-5. 절차 포팅PL/SQLto범퍼카 토토/pgsql
오라클 버전 :
절차 작성 또는 교체 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)rase_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으로 예외; - 이미 존재하는지 걱정하지 마십시오(4)끝; 저지르다; 끝; / 오류 표시
이와 같은 절차는 쉽게 변환 할 수 있습니다PostgreSQL기능 반환Integer. 이 절차는 특히 우리에게 일부를 가르쳐 줄 수 있기 때문에 특히 흥미 롭습니다 것들:
이것은 우리 가이 절차를 포트 할 수있는 방법입니다범퍼카 토토/pgsql:
함수 작성 또는 교체 CS_CREATE_JOB (Integer) 정수를 반환합니다. 선언하다 $ 1에 대한 v_job_id 별칭; a_running_job_count 정수; a_num 정수; 시작하다 독점 모드에서 잠금 테이블 CS_JOBS; end_stamp가 null 인 cs_jobs에서 a_running_job_count로 count (*)를 선택하십시오. a_running_job_count 0 인 경우 그 다음에 예외 제기``새 작업을 만들 수 없음 : 현재 작업이 실행 중입니다. ''; 끝 IF; cs_active_job에서 삭제; cs_active_job (job_id) 값 (v_job_id)에 삽입; cs_jobs에서 job_id = v_job_id; 찾을 수없는 경우 - 마지막 쿼리에 아무것도 반환되지 않은 경우 -이 작업은 테이블에 있지 않으므로 삽입하십시오. cs_jobs (job_id, start_stamp) 값 (v_job_id, current_timestamp)에 삽입; 반환 1; 또 다른 ``일자리가 이미 실행되는 일 ''; 통지를 제기하십시오.(1)END IF; 반환 0; 끝; '언어 plpgsql;
이 섹션은 언제 볼 수있는 몇 가지 다른 사항을 설명합니다. 포팅 오라클범퍼카 토토/sql함수PostgreSQL.
PL/PGSQL버전execute와 유사하게 작동합니다범퍼카 토토/sql버전이지만 있습니다
사용하는 것을 기억하려면quote_literal (텍스트)
andquote_string (텍스트)
설명대로섹션
37.6.4. 유형의 구성execute ''select * from $ 1 '';작동하지 않습니다
이 기능을 사용하지 않는 한.
PostgreSQL두 가지를 제공합니다 실행을 최적화하기위한 기능 생성 수정 자 : the 변동성 (함수가 항상 동일하게 반환되는지 여부 동일한 논증이 주어지면 결과) 및"엄격함"(함수가 반환되는지 여부 논쟁이 널이면 NULL). 의 설명을 참조하십시오.함수 생성자세한 내용.
이러한 최적화 속성을 사용하려면기능 생성진술이 볼 수 있습니다 다음과 같은 것 :
함수 만들기 foo (...)는 정수를 반환합니다. ... '언어 plpgsql 엄격한 불변;
이 섹션은 Oracle과 호환에 대한 코드가 포함되어 있습니다instr
사용할 수있는 기능
포팅 노력을 단순화하려면
- - Oracle의 상대를 모방하는 기기 기능 - 구문 : inst (String1, String2, [n], [m])는 []가 선택적 매개 변수를 나타냅니다. - -Mth 발생을 위해 Nth 캐릭터에서 시작하여 String1을 검색합니다. - String2. n이 음수이면 뒤로 검색하십시오. M이 통과되지 않으면 - 1이라고 가정합니다 (첫 번째 문자에서 검색이 시작됩니다). - 기능 기기 생성 (Varchar, Varchar)은 정수를 '로 반환합니다. 선언하다 POS 정수; 시작하다 POS : = 기기 ($ 1, $ 2, 1); POS 리턴; 끝; '언어 plpgsql; 기능 기기 생성 (Varchar, Varchar, Varchar)은 정수를 '로 반환합니다. 선언하다 $ 1의 문자열 별칭; String_to_search alias $ 2; Beg_index 별칭 $ 3; 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; 기능 악기 생성 (Varchar, Varchar, Integer, Integer)은 정수를 다시 반환합니다. 선언하다 $ 1의 문자열 별칭; String_to_search alias $ 2; Beg_index 별칭 $ 3; 4 달러에 대한 alse_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;