Module N4
Dalibo SCOP
24.09
29 août 2024
Cette formation est sous licence CC-BY-NC-SA. Vous êtes libre de la redistribuer et/ou modifier aux conditions suivantes :
PostgreSQL® Postgres® et le logo Slonik sont des marques déposées par PostgreSQL Community Association of Canada.
Ce document ne couvre que les versions supportées de PostgreSQL au moment de sa rédaction, soit les versions 12 à 16.
Oracle et PostgreSQL n’ont pas le même langage PL :
Ce module est organisé en cinq parties :
to_char(1 param)
add_month()
decode()
DBMS_ALERT
DBMS_PIPE
DBMS_OUTPUT
DBMS_RANDOM
UTL_FILE
nom_sequence.nextval
nextval('nom_sequence')
dblink
pg_background
RETURN
RETURNS
EXECUTE IMMEDIATE
EXECUTE
SELECT
INTO
PERFORM
REVERSE LOOP
CONNECT BY
WITH RECURSIVE
REF CURSOR
REFCURSOR
nom_curseur%ROWTYPE
RECORD
BULK COLLECT
:NEW
:OLD
NEW
OLD
UPDATING
INSERTING
DELETING
TG_OP (UPDATE, INSERT, DELETE)
RETURN NEW
BEFORE
TABLE FUNCTION
nom_paquet
nom_fonction
PACKAGES
Les noms diffèrent :
NVL()
coalesce()
SYSDATE
LOCALTIMESTAMP
CURRENT_TIMESTAMP
NLSSORT(colname, 'nls_sort=GERMAN')
colname COLLATE "de_DE"
Les paramètres changent :
to_number(num)
to_number(num, '99...99D99...99')
to_date( string1, format_mask, nls_language)
to_date(text, text)
replace(a, b)
replace(a, b, ' ')
Les noms et les paramètres changent :
trunc(.*date.*) => date_trunc('day', ...date...)
substr( string, start_position, length ) => substring(string from start_position for length)
La réécriture est complète :
add_months => ”+ 'N months'::interval”
add_years => ”+ 'N year'::interval”
TO_NUMBER(TO_CHAR(…)) => to_char(…)::integer
decode("user_status",'active',"username",null) => (CASE WHEN user_status='active' THEN username ELSE NULL END)
nom.nextval
nextval('nom')
nom.currval
currval('nom')
:new.
NEW.
:old.
OLD.
INSERTING|DELETING|UPDATING
TG_OP='INSERT|DELETE|UPDATE'
:
DBMS_OUTPUT.(put_line|put|new_line)(...)
RAISE NOTICE '...'
FOR … IN … REVERSE min .. max
RAISE EXCEPTION
||
sprintf
ROWNUM
LIMIT
OFFSET
HAVING … GROUP BY
GROUP BY … HAVING
MINUS
EXCEPT
FROM DUAL
DEFAULT NULL
END fct_name;
END;
CASE
WHEN
THEN
IS NULL
IS NOT NULL
coalesce
CURSOR moncurseur;
moncurseur CURSOR;
IN
EXIT WHEN ...%NOTFOUND
IF NOT FOUND THEN EXIT; END IF;
STRICT
SELECT … INTO
EXCEPTION … NO_DATA_FOUND
TOO_MANY_ROWS
REGEX_LIKE( string, pattern )
string ~ pattern
SYS_CONTECT('USERENV', ...)
SDO_GEOM.*
SDO_*
Remplacement de :
STORAGE_ERROR
OUT_OF_MEMORY
ZERO_DIVIDE
DIVISION_BY_ZERO
INVALID_CURSOR
INVALID_CURSOR_STATE
SQLCODE
SQLSTATE
raise_application_error
SYS_REFCURSOR
SQL%NOTFOUND
NOT FOUND
SYS_EXTRACT_UTC
AT TIME ZONE 'UTC
dup_val_on_index
unique_violation
Étapes :
Non supportées nativement par PostgreSQL, Ora2Pg utilise une fonction de substitution :
_atx
Chargement des fonctions et procédures :
psql --single-transaction -U myuser -f schema/functions/functions.sql mydb psql --single-transaction -U myuser -f schema/procedures/procedures.sql mydb
Chargement des paquets de procédures stockées :
psql --single-transaction -U myuser -f schema/packages/packages.sql mydb
Absence de certaines fonctions ou paquets de fonctions dans l’export
COMPILE_SCHEMA
EXPORT_INVALID
Certains commentaires des paquets de fonctions ne sont pas importés
Valider le portage du code :
Deux actions permettent de tester à minima :
TEST
ora2pg -c config/ora2pg.conf -t TEST
TEST_VIEW
ora2pg -c config/ora2pg.conf -t TEST_VIEW
PG_DSN
N’hésitez pas, c’est le moment !
https://dali.bo/n4_quiz