| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| 이전 | Postgre메이저 토토 사이트 : 문서 : 9.3 : PL/PG메이저 토토 사이트 -메이저 토토 사이트 절차 언어 | 40장.윈 토토/pgSQL - SQL절차적 언어 | 다음 | |
이 섹션에서는 다음과 같은 차이점을 설명합니다.PostgreSQL's윈 토토/pgSQL언어와 오라클의PL/SQL언어, 포팅하는 개발자를 돕기 위해 의 지원서오라클® ~포스트그레SQL.
윈 토토/pgSQLPL/SQL과 유사합니다. 여러 측면에서. 블록 구조의 명령형 언어이며, 모든 변수는 선언되어야 합니다. 할당, 루프, 조건부 비슷합니다. 다음과 같은 경우 염두에 두어야 할 주요 차이점은 다음과 같습니다. 다음에서 이전 중입니다.PL/SQL에윈 토토/pgSQL다음은:
SQL 명령에 사용된 이름이 다음 열 이름일 수 있는 경우 테이블 또는 함수 변수에 대한 참조,PL/SQL열 이름으로 취급합니다. 이것 에 해당함윈 토토/pgSQL's윈 토토pgsql.variable_contribute = use_column기본값이 아닌 동작입니다. 에서 설명함섹션 40.10.1. 처음에는 이러한 모호함을 피하는 것이 가장 좋습니다. 하지만 그에 따라 많은 양의 코드를 포팅해야 하는 경우 이 동작에 대한 설정변수_충돌가장 좋은 해결책이 될 수 있습니다.
에PostgreSQL함수 본문 문자열 리터럴로 작성되어야 합니다. 그러므로 당신은 사용해야합니다 함수 본문에 달러 따옴표를 사용하거나 작은 따옴표를 이스케이프하세요. (보다섹션 40.11.1.)
패키지 대신에 스키마를 사용하여 함수를 다음과 같이 구성하십시오. 여러 떼.
패키지가 없으므로 패키지 수준이 없습니다. 변수든. 이것은 다소 성가신 일입니다. 당신은 유지할 수 있습니다 대신 임시 테이블의 세션별 상태입니다.
정수for다음으로 루프반전작동 방식이 다릅니다:PL/SQL두 번째 숫자부터 다음까지 카운트다운됩니다. 첫 번째, 동안윈 토토/pgSQL개수 첫 번째 숫자에서 두 번째 숫자로 내려갑니다. 루프 경계가 필요합니다. 이식할 때 교체해야 합니다. 이런 비호환성은 안타깝지만 변경될 가능성은 없습니다. (보다섹션 40.6.3.5.)
for질의에 대한 루프(제외 커서)도 다르게 작동합니다. 대상 변수에는 다음이 있어야 합니다. 선언되었지만PL/SQL항상 암시적으로 선언합니다. 이것의 장점은 루프가 종료된 후에도 변수 값에 계속 액세스할 수 있습니다.
커서 사용에는 다양한 표기법 차이가 있습니다 변수.
예 40-8간단한 함수를 이식하는 방법을 보여줍니다.PL/SQL에윈 토토/pgSQL.
예 40-8. 다음에서 간단한 함수 포팅하기PL/SQL에윈 토토/pgSQL
다음은오라클 PL/SQL기능:
함수 생성 또는 교체 cs_fmt_browser_version(v_name varchar,
v_version varchar)
반환 varchar IS
시작하다
v_version이 NULL인 경우
RETURN v_name;
종료하면;
RETURN v_name || '/' || v_version;
끝;
/
오류 표시;
이 기능을 살펴보고 차이점을 비교해보세요 에게윈 토토/pgSQL:
그반환함수에 있는 키워드 프로토타입(함수 본문이 아님)은 다음과 같습니다.반품에PostgreSQL. 또한,IS되다AS, 그리고 다음을 추가해야 합니다.언어절 왜냐하면윈 토토/pgSQL이(가) 유일한 기능은 아닙니다 언어.
에PostgreSQL, 함수 body는 문자열 리터럴로 간주되므로 인용부호를 사용해야 합니다. 주위에 표시나 달러 따옴표가 있습니다. 이는 다음을 대체합니다. 종료하는 중/Oracle 접근 방식에서.
그오류 표시명령이 존재하지 않습니다 안에포스트그레SQL이며 필요하지 않습니다. 오류는 자동으로 보고되기 때문입니다.
이 기능을 다음으로 이식하면 다음과 같습니다.PostgreSQL:
함수 생성 또는 교체 cs_fmt_browser_version(v_name varchar,
v_version varchar)
varchar를 $$로 반환합니다.
시작하다
v_version이 NULL인 경우
RETURN v_name;
종료하면;
RETURN v_name || '/' || v_version;
끝;
$$ 언어 plpgsql;예 40-9다른 기능을 생성하는 기능을 이식하는 방법을 보여줍니다. 그리고 그에 따른 인용 문제를 처리하는 방법.
예 40-9. 다른 것을 생성하는 함수 포팅 함수PL/SQL에윈 토토/pgSQL
다음 절차는 a에서 행을 가져옵니다.선택문을 작성하고 다음을 사용하여 큰 함수를 빌드합니다. 결과는IF진술을 위해 효율성이 높습니다.
이것은 Oracle 버전입니다:
프로시저 생성 또는 교체 cs_update_referrer_type_proc IS
커서 Referrer_keys IS
SELECT * cs_referrer_keys에서
ORDER BY try_order;
func_cmd VARCHAR(4000);
시작하다
func_cmd := '함수 생성 또는 교체 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
func_cmd := func_cmd ||
' IF v_' || Referrer_key.kind
|| '좋아요''' || Referrer_key.key_string
|| ''' 그런 다음 '''를 반환합니다 || Referrer_key.referrer_type
|| '''; 종료 IF;';
엔드 루프;
func_cmd := func_cmd || ' NULL을 반환합니다. 끝;';
즉시 실행 func_cmd;
끝;
/
오류 표시;
이 함수는 다음과 같이 종료됩니다.PostgreSQL:
함수 생성 또는 교체 cs_update_referrer_type_proc()는 $func$로 void를 반환합니다.
선언하다
Referrer_keys 커서는 IS입니다.
SELECT * cs_referrer_keys에서
ORDER BY try_order;
func_body 텍스트;
func_cmd 텍스트;
시작하다
func_body := '시작';
FOR Referrer_key IN Referrer_keys LOOP
func_body := func_body ||
' IF v_' || Referrer_key.kind
|| '좋아요' || quote_literal(referrer_key.key_string)
|| ' 그런 다음 반환 ' || quote_literal(referrer_key.referrer_type)
|| '; END IF;' ;
엔드 루프;
func_body := func_body || ' NULL을 반환합니다. 끝;';
func_cmd :=
'함수 생성 또는 교체 cs_find_referrer_type(v_host varchar,
v_domain varchar,
v_url varchar)
varchar AS '를 반환합니다.
|| quote_literal(func_body)
|| ' 언어 plpgsql;' ;
실행 func_cmd;
끝;
$func$ 언어 plpgsql;
함수 본문이 어떻게 별도로 구축되고 통과했습니다quote_literal두 배로 늘리려면 그 안에 따옴표를 붙입니다. 이 기술이 필요한 이유는 새 기능을 정의할 때 달러 인용을 안전하게 사용하십시오. 어떤 문자열이 삽입될지 확실히 알 수 있습니다.referrer_key.key_string필드. (우리는 가정 여기 그referrer_key.kind될 수 있습니다 항상 신뢰할 수 있음호스트, 도메인또는url하지만referrer_key.key_string아마도 특히 달러 기호가 포함될 수 있습니다.) 기능은 실제로 Oracle 원본보다 개선된 것입니다. 다음과 같은 경우에는 깨진 코드가 생성되지 않습니다.referrer_key.key_string또는referrer_key.referrer_type인용문 포함 점수.
예
40-10함수를 포팅하는 방법을 보여줍니다.출력매개변수 및 문자열 조작.포스트그레SQL내장되어 있지 않습니다.인스트함수이지만 생성할 수 있습니다.
하나는 다른 기능을 조합하여 사용하는 것입니다. 안에섹션 40.12.3이 있습니다윈 토토/pgSQL구현
의instr당신이 만드는 데 사용할 수 있는 것
포팅이 더 쉬워졌습니다.
예제 40-10. 문자열 조작으로 프로시저 포팅 그리고아웃매개변수:PL/SQL에윈 토토/pgSQL
다음오라클PL/SQL 절차는 URL을 구문 분석하고 여러 요소(호스트, 경로 및 쿼리).
이것은 Oracle 버전입니다:
프로시저 생성 또는 교체 cs_parse_url(
v_url IN VARCHAR,
v_host OUT VARCHAR, -- 다시 전달됩니다.
v_path OUT VARCHAR, -- 이것도 마찬가지입니다.
v_query OUT VARCHAR) -- 그리고 이건
이다
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(
v_url IN VARCHAR,
v_host OUT VARCHAR, -- 다시 전달됩니다.
v_path OUT VARCHAR, -- 이것도 마찬가지입니다.
v_query OUT VARCHAR) -- 그리고 이건
AS $$
선언하다
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);
끝;
$$ 언어 plpgsql;
이 함수는 다음과 같이 사용될 수 있습니다:
SELECT * FROM cs_parse_url('http://foobar.com/query.cgi?baz');예 40-11다양한 기능을 사용하는 프로시저를 이식하는 방법을 보여줍니다. Oracle에만 해당됩니다.
예 40-11. 프로시저 포팅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일 때; -- 이미 존재하더라도 걱정하지 마세요.
끝;
저지르다;
끝;
/
오류 표시
이러한 절차는 다음으로 쉽게 변환될 수 있습니다.포스트그레SQL함수 반환무효. 특히 이 과정이 흥미롭다. 왜냐하면 그것은 우리에게 몇 가지를 가르쳐 줄 수 있기 때문입니다.
이것이 우리가 이 절차를 다음으로 포팅할 수 있는 방법입니다.윈 토토/pgSQL:
함수 생성 또는 교체 cs_create_job(v_job_id 정수) $$로 void를 반환합니다.
선언하다
a_running_job_count 정수;
시작하다
독점 모드에서 LOCK TABLE cs_jobs;
SELECT 개수(*) INTO a_running_job_count FROM cs_jobs WHERE end_stamp가 NULL입니다.
IF a_running_job_count 0 그러면
RAISE EXEPTION '새 작업을 생성할 수 없습니다. 작업이 현재 실행 중입니다.';(1)END IF;
cs_active_job에서 삭제;
cs_active_job(job_id) 값(v_job_id)에 삽입;
시작하다
INSERT INTO cs_jobs(job_id, start_stamp) VALUES(v_job_id, now());
예외
WHEN 고유_위반 THEN(2)-- 이미 존재하더라도 걱정하지 마세요.
끝;
끝;
$$ 언어 plpgsql;
이 절차와 다음 절차의 주요 기능적 차이점은
Oracle과 동등한 것은cs_jobs테이블은 소집 때까지 유지됩니다
거래가 완료됩니다. 또한 호출자가 나중에 중단하는 경우(
오류로 인한 예) 이 절차의 효과는 다음과 같습니다.
롤백되었습니다.이 섹션에서는 다음과 같은 경우 주의해야 할 몇 가지 사항을 설명합니다. 오라클 포팅PL/SQL기능을포스트그레SQL.
에윈 토토/pgSQL, 예외가 발생한 경우 에 의해 잡혔습니다.예외절, 모두 블록 이후 데이터베이스 변경 사항시작자동으로 롤백됩니다. 즉, 행동은 동등하다. Oracle에서 얻을 수 있는 이점은 다음과 같습니다.
시작
세이브포인트 s1;
... 코드는 여기에 ...
예외
언제 ... 그때
s1으로 롤백합니다.
... 코드는 여기에 ...
언제 ... 그때
s1으로 롤백합니다.
... 코드는 여기에 ...
끝;
다음을 사용하는 Oracle 프로시저를 번역하는 경우세이브포인트그리고다음으로 롤백이 스타일에서는 작업이 쉽습니다. 그냥 생략하면 됩니다.세이브포인트그리고다음으로 롤백. 다음을 사용하는 프로시저가 있는 경우세이브포인트그리고다음으로 롤백다른 방식으로는 실제적인 생각이 필요할 것입니다.
그윈 토토/pgSQL버전실행다음과 유사하게 작동합니다PL/SQL버전이지만, 해야 합니다.
사용하는 것을 기억하세요quote_literal그리고quote_ident설명된 대로섹션
40.5.4. 유형의 구성실행
'$1에서 * 선택';다음을 사용하지 않으면 안정적으로 작동하지 않습니다.
이러한 기능을 수행합니다.
포스트그레SQL두 개를 줍니다 실행을 최적화하기 위한 함수 생성 수정자:"변동성"(함수가 항상 반환되는지 여부 동일한 인수가 주어지면 동일한 결과) 및"엄격함"(함수가 null을 반환하는지 여부 모든 인수는 null입니다.) 상담하세요함수 생성참조 페이지 세부.
이러한 최적화 속성을 사용할 때 귀하의함수 생성문은 다음과 같습니다. 이런 것:
CREATE FUNCTION foo(...) 정수를 $$로 반환합니다. ... $$ LANGUAGE plpgsql STRICT IMMUTABLE;
이 섹션에는 Oracle 호환 세트에 대한 코드가 포함되어 있습니다.instr다음에 사용할 수 있는 함수
포팅 작업을 단순화하세요.
--
-- Oracle의 대응 기능을 모방한 instr 함수
-- 구문: instr(string1, string2 [, n [, m]])
-- 여기서 []는 선택적 매개변수를 나타냅니다.
--
-- n번째 문자부터 시작하여 string1에서 m번째 문자를 검색합니다.
-- 문자열2의 n이 음수이면 abs(n)번째부터 거꾸로 검색합니다.
-- string1 끝의 문자입니다.
-- n이 전달되지 않으면 1로 가정합니다(첫 번째 문자부터 검색 시작).
-- m이 전달되지 않으면 1로 가정합니다(첫 번째 발생 찾기).
-- string1에서 string2의 시작 인덱스를 반환하거나 string2를 찾을 수 없으면 0을 반환합니다.
--
CREATE FUNCTION instr(varchar, varchar) 정수를 $$로 반환합니다.
시작하다
RETURN instr($1, $2, 1);
끝;
$$ LANGUAGE plpgsql 엄격한 불변;
CREATE FUNCTION instr(string varchar, string_to_search_for varchar,
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_for IN temp_str);
IF pos = 0이면
0을 반환합니다.
또 다른
RETURN pos + beg_index - 1;
종료하면;
ELSIF beg_index < 0 THEN
ss_length := char_length(string_to_search_for);
길이 := char_length(string);
구걸 := 길이 + 1 + 구걸_색인;
구걸하는 동안 0 LOOP
temp_str := substring(string FROM beg FOR ss_length);
IF string_to_search_for = temp_str THEN
반환 구걸;
종료하면;
구걸하다 := 구걸하다 - 1;
엔드 루프;
0을 반환합니다.
또 다른
0을 반환합니다.
종료하면;
끝;
$$ LANGUAGE plpgsql 엄격한 불변;
CREATE FUNCTION instr(string varchar, string_to_search_for varchar,
beg_index 정수, 발생_index 정수)
$$로 정수를 반환합니다.
선언하다
위치 정수 NOT NULL DEFAULT 0;
발생_번호 정수 NOT NULL DEFAULT 0;
temp_str varchar;
정수를 구걸하다;
나는 정수;
길이 정수;
ss_length 정수;
시작하다
IF 발생_지수 <= 0 THEN
RAISE '인수 ''%''이(가) 범위를 벗어났습니다.', 발생_색인
ERRCODE 사용 = '22003';
종료하면;
IF beg_index 0 그러면
구걸 := beg_index - 1;
FOR i IN 1..occur_index LOOP
temp_str := substring(string FROM beg + 1);
pos := position(string_to_search_for IN temp_str);
IF pos = 0이면
0을 반환합니다.
종료하면;
구걸하다 := 구걸하다 + pos;
엔드 루프;
반환 구걸;
ELSIF beg_index < 0 THEN
ss_length := char_length(string_to_search_for);
길이 := char_length(string);
구걸 := 길이 + 1 + 구걸_색인;
구걸하는 동안 0 LOOP
temp_str := substring(string FROM beg FOR ss_length);
IF string_to_search_for = temp_str THEN
발생_번호 := 발생_번호 + 1;
IF 발생_번호 = 발생_인덱스 THEN
반환 구걸;
종료하면;
종료하면;
구걸하다 := 구걸하다 - 1;
엔드 루프;
0을 반환합니다.
또 다른
0을 반환합니다.
종료하면;
끝;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;| 이전 | 배트맨 토토 : 문서 : 9.3 : 배트맨 토토 9.3.25 문서화 | PostgreSQL : 문서 : 9.3 : PL/메이저 토토 사이트 -메이저 토토 사이트 절차 언어 |
| 개발을 위한 팁윈 토토/pgSQL | Postgre메이저 토토 사이트 : 문서 : 9.3 : PL/PG메이저 토토 사이트 -메이저 토토 사이트 절차 언어 | PL/Tcl - Tcl 절차 언어 |