이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 41.13. Oracle 토토 사이트/SQL에서 포팅버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

37.11. 에서 포팅Oracle범퍼카 토토/sql

이 섹션은 간의 차이점을 설명합니다.postgresql's범퍼카 토토/pgsql언어 및 Oracle 's범퍼카 토토/sql언어 Oracle에서에 대한 응용 프로그램postgresql.

범퍼카 토토/pgsql는 PL/SQL과 유사합니다 여러 측면에서. 블록 구조화되고 명령적인 언어이며 그리고 모든 변수는 선언되어야합니다. 과제, 루프, 조건부는 비슷합니다. 당신이 유지 해야하는 주요 차이점 에서 포팅 할 때 마음범퍼카 토토/sqlto범퍼카 토토/pgsqlare :

  • 매개 변수에 대한 기본값은 없습니다PostgreSQL.

  • 당신은에서 함수 이름을 과부하 할 수 있습니다.postgresql. 이것은 종종 작동하는 데 사용됩니다 기본 매개 변수가 부족합니다.

  • 커서가 필요 없음범퍼카 토토/pgsqlfor진술. (보다예제 37-3.)

  • inpostgresql당신은 필요합니다 기능 본문에서 단일 따옴표를 피하십시오. 보다섹션 37.2.1.

  • 패키지 대신 스키마를 사용하여 구성하십시오 그룹으로의 기능.

37.11.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, outinout매개 변수가 함수로 전달되었습니다.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. 이 절차는 특히 우리에게 일부를 가르쳐 줄 수 있기 때문에 특히 흥미 롭습니다 것들:

(1)
없음Pragma진술 안에PostgreSQL.
(2)
당신이 할 경우잠금 테이블in범퍼카 토토/pgsql, 잠금 장치 호출 트랜잭션이 될 때까지 해제되지 않습니다 완성된.
(3)
당신은 또한 거래를 할 수 없습니다범퍼카 토토/pgsql함수. 전체 기능 (및 그에서 호출 된 다른 기능)은 다음과 같습니다 한 번의 거래에서 실행되고PostgreSQL문제가 잘못되면 거래.
(4)
예외는 A로 대체해야합니다if진술.

이것은 우리 가이 절차를 포트 할 수있는 방법입니다범퍼카 토토/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;
(1)
당신이 통지 (또는 오류)를 제기 할 수있는 방법에 주목하십시오범퍼카 토토/pgsql.

37.11.2. 볼 다른 것들 을 위한

이 섹션은 언제 볼 수있는 몇 가지 다른 사항을 설명합니다. 포팅 오라클범퍼카 토토/sql함수PostgreSQL.

37.11.2.1. execute

PL/PGSQL버전execute와 유사하게 작동합니다범퍼카 토토/sql버전이지만 있습니다 사용하는 것을 기억하려면quote_literal (텍스트)andquote_string (텍스트)설명대로섹션 37.6.4. 유형의 구성execute ''select * from $ 1 '';작동하지 않습니다 이 기능을 사용하지 않는 한.

37.11.2.2. 최적화PL/PGSQL기능

PostgreSQL두 가지를 제공합니다 실행을 최적화하기위한 기능 생성 수정 자 : the 변동성 (함수가 항상 동일하게 반환되는지 여부 동일한 논증이 주어지면 결과) 및"엄격함"(함수가 반환되는지 여부 논쟁이 널이면 NULL). 의 설명을 참조하십시오.함수 생성자세한 내용.

이러한 최적화 속성을 사용하려면기능 생성진술이 볼 수 있습니다 다음과 같은 것 :

함수 만들기 foo (...)는 정수를 반환합니다.
...
'언어 plpgsql 엄격한 불변;

37.11.3. 충수

이 섹션은 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;