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

37.11. 다음에서 이전 중입니다.오라클PL/SQL

이 섹션에서는 다음과 같은 차이점을 설명합니다.포스트그레SQL's범퍼카 토토/pgSQL언어와 오라클의PL/SQL언어, 포팅하는 개발자를 돕기 위해 Oracle에서 다음으로 애플리케이션을 제공합니다.포스트그레SQL.

범퍼카 토토/pgSQLPL/SQL과 유사합니다. 여러 측면에서. 블록 구조의 명령형 언어입니다. 그리고 모든 변수는 선언되어야 합니다. 할당, 루프, 조건문도 비슷합니다. 유지해야 할 주요 차이점 이동할 때 주의하세요.PL/SQL범퍼카 토토/pgSQL다음은:

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

  • 함수 이름을 오버로드할 수 있습니다.포스트그레SQL. 이것은 종종 작업에 사용됩니다. 기본 매개변수가 부족합니다.

  • 커서가 필요하지 않습니다.범퍼카 토토/pgSQL, 쿼리를에 입력하세요.for성명. (참조예 37-3.)

  • PostgreSQL당신은 다음을 수행해야 합니다 함수 본문에서 작은따옴표를 이스케이프 처리하세요. 참조섹션 37.2.1.

  • 패키지 대신에 스키마를 사용하여 그룹으로 기능합니다.

37.11.1. 포팅 예시

예 37-2간단한 함수를 이식하는 방법을 보여줍니다.PL/SQL범퍼카 토토/pgSQL.

예 37-2. 다음에서 간단한 함수 포팅하기PL/SQL범퍼카 토토/pgSQL

다음은오라클 PL/SQL기능:

함수 생성 또는 교체 cs_fmt_browser_version(v_name IN varchar, v_version IN varchar)
반환 varchar IS
시작
    v_version이 NULL인 경우
        RETURN v_name;
    종료하면;
    RETURN v_name || '/' || v_version;
끝;
/
오류 표시;

이 기능을 살펴보고 차이점을 살펴보겠습니다.범퍼카 토토/pgSQL:

  • PostgreSQL하지 않습니다 명명된 매개변수가 있습니다. 명시적으로 별칭을 지정해야 합니다. 함수 내부에 있습니다.

  • 오라클가질 수 있습니다IN, 아웃INOUT함수에 전달된 매개변수.INOUT14442_14545포스트그레SQL만 있음IN매개변수.

  • 반환키워드 함수 프로토타입(함수 본문 아님)은 다음과 같습니다.반품inPostgreSQL.

  • PostgreSQL, 함수는 작은따옴표를 사용하여 생성됩니다. 함수 본문의 구분 기호이므로 이스케이프해야 합니다. 함수 본문 내부의 작은따옴표.

  • /오류 표시명령은 다음과 같습니다 에는 존재하지 않습니다.PostgreSQL.

이 함수를 다음으로 이식하면 다음과 같습니다.PostgreSQL:

함수 생성 또는 교체 cs_fmt_browser_version(varchar, varchar)
varchar AS '를 반환합니다.
선언
    $1에 대한 v_name 별칭;
    $2에 대한 v_version 별칭;
시작
    v_version이 NULL인 경우
        v_name을 반환합니다.
    종료하면;
    RETURN v_name || ''/'' || v_version;
끝;
' 언어 plpgsql;

예 37-3다른 함수를 생성하는 함수를 이식하는 방법을 보여줍니다. 함수 및 그에 따른 인용 문제를 처리하는 방법을 설명합니다.

예 37-3. 생성하는 함수 포팅 다른 기능PL/SQL범퍼카 토토/pgSQL

다음 절차는 a에서 행을 가져옵니다.선택문을 작성하고 큰 함수를 빌드합니다. 결과는 다음과 같습니다.IF문장, 효율성을 위해서. 특히 주목하세요. 커서와의 차이점for루프,

이것은 오라클 버전입니다:

프로시저 생성 또는 교체 cs_update_referrer_type_proc IS
    커서 Referrer_keys IS 
        SELECT * cs_referrer_keys에서 
        ORDER BY try_order;

    a_output VARCHAR(4000); 
시작 
    a_output := '함수 생성 또는 교체 cs_find_referrer_type(v_host IN VARCHAR, v_domain IN VARCHAR, 
v_url IN VARCHAR) RETURN VARCHAR IS BEGIN'; 

    FOR Referrer_key IN Referrer_keys LOOP 
        a_output := a_output || ' IF v_' || Referrer_key.kind || '좋아요''' || 
Referrer_key.key_string || ''' 그런 다음 '''를 반환합니다 || referrer_key.referrer_type || 
'''; 종료 IF;'; 
    엔드 루프; 

    a_output := a_output || ' NULL을 반환합니다. 끝;'; 
    즉시 실행 a_output; 
끝; 
/ 
오류 표시;

이 함수는 다음과 같이 종료됩니다.PostgreSQL:

CREATE FUNCTION cs_update_referrer_type_proc() 정수 AS '를 반환합니다.
선언
    Referrer_keys 기록;  -- FOR에 사용할 일반 레코드를 선언합니다.
    a_output varchar(4000);
시작 
    a_output := ''기능 생성 cs_find_referrer_type(varchar, varchar, varchar) 
                  varchar AS ''''를 반환합니다. 
                     선언 
                         $1에 대한 v_host 별칭; 
                         $2에 대한 v_domain 별칭; 
                         $3에 대한 v_url 별칭;
                     시작하다 ''; 

    -- FOR 루프에서 쿼리 결과를 검색하는 방법에 주목하세요.
    -- FOR <record 구문을 사용합니다.

    FOR Referrer_keys IN SELECT * FROM cs_referrer_keys ORDER BY try_order LOOP
        a_output := a_output || '' IF v_'' || Referrer_keys.kind || ''좋아요'''''''''' 
                 || Referrer_keys.key_string || '''''''''' 그런 다음 ''''''를 반환합니다. 
                 || referrer_keys.referrer_type || ''''''; 종료 IF;''; 
    엔드 루프; 

    a_output := a_output || '' NULL을 반환합니다. 끝; '''' 언어 plpgsql;''; 

    -- EXECUTE는 어떤 변수도 대체하지 않기 때문에 작동합니다.
    -- 그렇지 않으면 실패할 것입니다.  함수를 실행하는 또 다른 방법은 PERFORM을 참조하세요.

    a_output을 실행합니다. 
끝; 
' 언어 plpgsql;

예 37-4함수를 포팅하는 방법을 보여줍니다.아웃매개변수 및 문자열 조작.포스트그레SQL다음이 없습니다입력기능이 있지만 작업할 수 있습니다. 다른 기능의 조합을 사용하여 주변을 둘러쌉니다.섹션 37.11.3이 있습니다범퍼카 토토/pgSQL구현instr포팅에 사용할 수 있는 것 더 쉬워요.

예 37-4. 문자열을 사용하여 프로시저 이식하기 조작과아웃다음 매개변수PL/SQL범퍼카 토토/pgSQL

다음오라클PL/SQL 프로시저는 URL을 구문 분석하고 여러 가지를 반환하는 데 사용됩니다. 요소(호스트, 경로 및 쿼리).범퍼카 토토/pgSQL함수는 하나만 반환할 수 있습니다. 가치. 에서포스트그레SQL, 하나 이 문제를 해결하는 방법은 절차를 세 개로 나누는 것입니다. 다른 기능: 하나는 호스트를 반환하는 것이고 다른 하나는 호스트를 반환하는 것입니다. 경로와 쿼리에 대한 또 다른 경로입니다.

이것은 Oracle 버전입니다:

프로시저 생성 또는 교체 cs_parse_url(
    v_url IN VARCHAR,
    v_host OUT VARCHAR, -- 다시 전달됩니다.
    v_path OUT VARCHAR, -- 이것도 마찬가지입니다.
    v_query OUT VARCHAR) -- 그리고 이건
IS
    a_pos1 INTEGER;
    a_pos2 INTEGER;
시작
    v_host := NULL;
    v_path := NULL;
    v_query := NULL;
    a_pos1 := instr(v_url, '//');

    만약 a_pos1 = 0이면
        반환;
    종료하면;
    a_pos2 := instr(v_url, '/', a_pos1 + 2);
    만약 a_pos2 = 0이면
        v_host := substr(v_url, a_pos1 + 2);
        v_path := '/';
        반품;
    종료하면;

    v_host := substr(v_url, a_pos1 + 2, a_pos2 - a_pos1 - 2);
    a_pos1 := instr(v_url, '?', a_pos2 + 1);

    만약 a_pos1 = 0이면
        v_path := substr(v_url, a_pos2);
        반품;
    종료하면;

    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)는 varchar를 '로 반환합니다.
선언
    $1에 대한 v_url 별칭;
    v_host varchar;
    v_path varchar;
    a_pos1 정수;
    a_pos2 정수;
    a_pos3 정수;
시작 
    v_host := NULL; 
    a_pos1 := instr(v_url, ''//'');

    만약 a_pos1 = 0이면 
        반환 '''';  -- 공백을 반환합니다.
    종료하면; 

    a_pos2 := instr(v_url,''/'',a_pos1 + 2);
    만약 a_pos2 = 0이면 
        v_host := substr(v_url, a_pos1 + 2); 
        v_path := ''/''; 
        RETURN v_host; 
    종료하면; 

    v_host := substr(v_url, a_pos1 + 2, a_pos2 - a_pos1 - 2 ); 
    RETURN v_host; 
끝; 
' 언어 plpgsql;

예 37-5여러 가지를 사용하는 프로시저를 포팅하는 방법을 보여줍니다. Oracle에만 해당되는 기능입니다.

예 37-5. 프로시저 포팅PL/SQL범퍼카 토토/pgSQL

오라클 버전:

프로시저 생성 또는 교체 cs_create_job(v_job_id IN INTEGER) IS
    a_running_job_count INTEGER;
    PRAGMA AUTONOMOUS_TRANSACTION;(1)시작
    독점 모드에서 LOCK TABLE cs_jobs;(2)end_stamp가 NULL인 cs_jobs에서 a_running_job_count INTO 개수(*) 선택;

    IF a_running_job_count  0 그러면
        커밋; -- 자유 잠금(3)raise_application_error(-20000, '새 작업을 생성할 수 없습니다: 작업이 현재 실행 중입니다.');
    종료하면;

    cs_active_job에서 삭제;
    cs_active_job(job_id) 값(v_job_id)에 삽입;

    시작
        INSERT INTO cs_jobs(job_id, start_stamp) VALUES(v_job_id, sysdate);
        dup_val_on_index가 NULL인 경우 예외; -- 이미 존재하더라도 걱정하지 마세요.(4)END;
    저지르다;
끝;
/
오류 표시

이러한 절차는 다음으로 쉽게 변환될 수 있습니다.포스트그레SQL함수 반환하는정수. 이 절차는 특히 흥미로운 점은 우리에게 몇 가지를 가르쳐 줄 수 있기 때문입니다. 것들:

(1)
없습니다프라그마문장 에서PostgreSQL.
(2)
만약 당신이 다음을 수행한다면락 테이블in범퍼카 토토/pgSQL, 자물쇠는 호출 트랜잭션이 완료될 때까지 해제되지 않음 끝났습니다.
(3)
또한 거래를 할 수 없습니다범퍼카 토토/pgSQL함수. 전체 함수(및 거기에서 호출되는 다른 함수)는 다음과 같습니다. 하나의 트랜잭션으로 실행되며PostgreSQL롤백합니다. 문제가 발생하면 거래하세요.
(4)
다음으로 대체되어야 하는 예외는IF성명.

이 절차를 다음으로 포팅할 수 있는 방법은 다음과 같습니다.범퍼카 토토/pgSQL:

함수 생성 또는 교체 cs_create_job(integer) 정수를 '로 반환합니다.
선언
    $1에 대한 v_job_id 별칭;
    a_running_job_count 정수;
    a_num 정수;
시작
    독점 모드에서 LOCK TABLE cs_jobs;
    SELECT 개수(*) INTO a_running_job_count FROM cs_jobs WHERE end_stamp가 NULL입니다.

    IF a_running_job_count  0
    그런 다음
        RAISE EXCEPTION ''새 작업을 생성할 수 없습니다. 작업이 현재 실행 중입니다.'';
    종료하면;

    cs_active_job에서 삭제;
    cs_active_job(job_id) 값(v_job_id)에 삽입;

    SELECT 개수(*) INTO a_num FROM cs_jobs WHERE job_id=v_job_id;
    IF NOT FOUND THEN -- 마지막 쿼리에서 아무것도 반환되지 않은 경우
        -- 이 작업은 테이블에 없으므로 삽입해 보겠습니다.
        INSERT INTO cs_jobs(job_id, start_stamp) VALUES(v_job_id, current_timestamp);
        1을 반환합니다.
    그 외
        RAISE NOTICE ''작업이 이미 실행 중입니다.'';(1)END IF;

    0을 반환합니다.
끝;
' 언어 plpgsql;
(1)
알림(또는 오류)을 어떻게 제기할 수 있는지 알아보세요.범퍼카 토토/pgSQL.

37.11.2. 기타 볼만한 사항 에 대한

이 섹션에서는 다음과 같은 경우 주의해야 할 몇 가지 사항을 설명합니다. 오라클 포팅PL/SQL기능을PostgreSQL.

37.11.2.1. 실행

범퍼카 토토/pgSQL버전실행다음과 유사하게 작동합니다PL/SQL버전이지만 귀하는 사용하는 것을 기억하기 위해quote_literal(텍스트)그리고quote_string(텍스트)설명된 대로섹션 37.6.4. 유형의 구성''SELECT * FROM $1'' 실행;작동하지 않습니다 이 기능을 사용하지 않는 한.

37.11.2.2. 최적화 중범퍼카 토토/pgSQL기능

PostgreSQL두 개를 줍니다 실행을 최적화하기 위한 함수 생성 수정자: 변동성(함수가 항상 동일한 값을 반환하는지 여부) 동일한 인수가 주어지면 결과) 및"엄격함"(함수가 반환되는지 여부 인수가 null인 경우 null입니다. 설명을 참조하세요.함수 생성자세한 내용은.

이러한 최적화 속성을 사용하려면, 귀하의함수 생성문은 다음과 같습니다. 이런 것:

CREATE FUNCTION foo(...) 정수를 '로 반환합니다.
...
' LANGUAGE plpgsql STRICT IMMUTABLE;

37.11.3. 부록

이 섹션에는 Oracle 호환 코드가 포함되어 있습니다.instr사용할 수 있는 기능 포팅 작업을 단순화합니다.

--
-- Oracle의 대응 기능을 모방한 instr 함수
-- 구문: instr(string1, string2, [n], [m]) 여기서 []는 선택적 매개변수를 나타냅니다.
-- 
-- n번째 문자부터 시작하여 string1에서 m번째 발생을 검색합니다.
-- 문자열2의  n이 음수이면 뒤로 검색합니다.  m이 전달되지 않으면,
-- 1로 가정합니다(검색은 첫 번째 문자부터 시작됩니다).
--

CREATE FUNCTION instr(varchar, varchar) 정수 AS '를 반환합니다.
선언
    위치 정수;
시작
    위치:= instr($1, $2, 1);
    반환 위치;
끝;
' 언어 plpgsql;

CREATE FUNCTION instr(varchar, varchar, varchar) 정수 AS '를 반환합니다.
선언
    $1에 대한 문자열 별칭;
    string_to_search $2에 대한 별칭;
    $3에 대한 beg_index 별칭;
    위치 정수 NOT NULL DEFAULT 0;
    temp_str varchar;
    정수를 구걸하다;
    길이 정수;
    ss_length 정수;
시작
    IF beg_index  0 그러면
        temp_str := substring(string FROM beg_index);
        pos := position(string_to_search IN temp_str);

        IF pos = 0이면
            0을 반환합니다.
        그 외
            RETURN pos + beg_index - 1;
        종료하면;
    그 외
        ss_length := char_length(string_to_search);
        길이 := char_length(string);
        구걸 := 길이 + 구걸_색인 - ss_length + 2;

        구걸하는 동안  0 LOOP
            temp_str := substring(string FROM beg FOR ss_length);
            pos := position(string_to_search IN temp_str);

            IF 위치  0 THEN
                반환 구걸;
            종료하면;

            구걸하다 := 구걸하다 - 1;
        엔드 루프;

        0을 반환합니다.
    종료하면;
끝;
' 언어 plpgsql;

CREATE FUNCTION instr(varchar, varchar, 정수, 정수) RETURNS 정수 AS '
선언
    $1에 대한 문자열 별칭;
    string_to_search $2에 대한 별칭;
    $3에 대한 beg_index 별칭;
    $4에 대한 발생_색인 별칭;
    위치 정수 NOT NULL DEFAULT 0;
    발생_번호 정수 NOT NULL DEFAULT 0;
    temp_str varchar;
    정수를 구걸하다;
    나는 정수;
    길이 정수;
    ss_length 정수;
시작
    IF beg_index  0 그러면
        구걸 := 구걸_index;
        temp_str := substring(string FROM beg_index);

        FOR i IN 1..occur_index LOOP
            pos := position(string_to_search IN temp_str);

            I = 1이면
                구걸 := 구걸 + pos - 1;
            그 외
                구걸하다 := 구걸하다 + pos;
            종료하면;

            temp_str := substring(string FROM beg + 1);
        엔드 루프;

        IF pos = 0이면
            0을 반환합니다.
        그 외
            반환 구걸;
        종료하면;
    그 외
        ss_length := char_length(string_to_search);
        길이 := char_length(string);
        구걸 := 길이 + 구걸_색인 - ss_length + 2;

        구걸하는 동안  0 LOOP
            temp_str := substring(string FROM beg FOR ss_length);
            pos := position(string_to_search IN temp_str);

            IF 위치  0 THEN
                발생_번호 := 발생_번호 + 1;

                IF 발생_번호 = 발생_인덱스 THEN
                    반환 구걸;
                종료하면;
            종료하면;

            구걸하다 := 구걸하다 - 1;
        엔드 루프;

        0을 반환합니다.
    종료하면;
끝;
' 언어 plpgsql;