Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Le poste peut être clos. J'ai pu intégrer les fonctions fournies par orafce.
Pour l'appel à ces fonctions, il suffit de faire un select devant.
Pouvez vous me communiquer la procédure pour migrer des packages Oracle en Postgres svp ?
D'avance ;merci
$ ora2pg -v
Ora2Pg v19.0
J'aimerais reproduire ce que vous avez fait mais je n'y arrive pas .
Pouvez vous me donner le contenu de votre fichier topic28262.sql svp ? ainsi que celui de votre fichier de configuration ora2pg.conf
merci.
Bonjour,
Merci beaucoup pour votre retour sur ma fonction et oui je vais tester la nouvelle version d'ora2pg.
Cordialement,
Bonjour,
J'utilise ora2pg pour convertir le Pl/sql en plpgsql ...
Bonjour, Merci pour votre réponse, cela marche.
J'ai un autre problème dans la création d'une fonction.
Je suis bien en 9.6. la fonction current_setting existe. cela vient peut etre de la version d'ora2pg qui n'est pas à jour sur mon poste ?
Bonjour merci j'ai résolu l'incident précédemment évoqué.
Toujours dans le cadre de ma migration d'Oracle vers Postgres. J'ai créé l'extension orafce qui contient des fonctions absentes dans Postgres par exemple dbms_output.
Voir mon premier post.
J'ai l'erreur suivante lorsque je tente de créer ma fonction dans Postgres :
ERREUR: erreur de syntaxe sur ou près de « dbms_output »
LINE 27: dbms_output.NEW_LINE;
voici le code de ma fonction :
SET client_encoding TO 'UTF8';
SET search_path = toto,dbms_output,oracle,utl_file;
\set ON_ERROR_STOP ON
CREATE OR REPLACE FUNCTION toto.table_to_file ( VAR_NOM_TABLE text, VAR_NOM_FICH text, VAR_CONDITION text DEFAULT NULL, VAR_DELIMITEUR CHAR DEFAULT '@', VAR_DEBUG boolean DEFAULT FALSE ) RETURNS numeric AS $body$
DECLARE
TabCol CURSOR FOR SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH
from USER_TAB_COLUMNS
where TABLE_NAME=VAR_NOM_TABLE;
TabColLigne RECORD;
CurseurExecSql numeric;
Ignore numeric;
NbLigne numeric;
TotalLigne numeric;
DataLength numeric;
ReturnLength numeric;
Iteration numeric;
AllCol varchar(10000) := ''''||VAR_NOM_TABLE||':''';
Requete varchar(10000);
Ligne varchar(32000);
MAX_CAR_DATA CONSTANT numeric := 32000;
MAX_CAR_REQ CONSTANT numeric := 10000;
MAX_BUF_UTL CONSTANT numeric := 1023;
MAX_BUF_VARCHAR CONSTANT numeric := 2000;
fh UTL_FILE.FILE_TYPE;
I RECORD;
BEGIN
RAISE NOTICE '%% to file %%', 'Copying Table ', VAR_NOM_TABLE, VAR_NOM_FICH, ' ...';
dbms_output.NEW_LINE;
/* ----------------------------------------------------------- */
/* Construction de la chaine de carcatere contenant l'ensemble */
/* des noms des colonnes de la table VAR_NOM_TABLE */
/* Verification du depassement de longueur des donnees */
/* Verification des types : LONG, RAW : non supporte */
/* ----------------------------------------------------------- */
DataLength := 0;
open TabCol;
LOOP
fetch TabCol into TabColLigne;
IF NOT FOUND THEN EXIT; END IF; -- apply on TabCol
IF(POSITION('LONG' in TabColLigne.DATA_TYPE) != 0) OR (POSITION('RAW' in TabColLigne.DATA_TYPE) != 0)
THEN
AllCol := AllCol || '||''' || VAR_DELIMITEUR || '''';
RAISE NOTICE 'WARNING: Can''t ouput for %', TabColLigne.COLUMN_NAME;
RAISE NOTICE ' in table %', VAR_NOM_TABLE;
RAISE NOTICE ' Because type is RAW, LONG RAW or LONG';
DBMS_OUTPUT.NEW_LINE;
ELSE
DataLength := DataLength + TabColLigne.DATA_LENGTH + 1;
AllCol := AllCol || '||' || TabColLigne.COLUMN_NAME || '||''' || VAR_DELIMITEUR || '''';
END IF;
END LOOP;
close TabCol;
/* ------------------------------------------------- */
/* Verification pbme eventuel de longueur de donnees */
/* ------------------------------------------------- */
IF DataLength > MAX_BUF_VARCHAR
THEN
RAISE NOTICE 'WARNING: Possible buffer overflow...! ';
RAISE NOTICE ' Data length : %', DataLength;
RAISE NOTICE ' Max buffer : %', MAX_CAR_DATA;
DBMS_OUTPUT.NEW_LINE;
END IF;
/* ----------------------------------------------------- */
/* Construction de la requete a executer */
/* Si demande d'infos. de DEBUG, affichage de la requete */
/* ----------------------------------------------------- */
Requete := 'SELECT '||AllCol||' from '||VAR_NOM_TABLE||' '||VAR_CONDITION;
IF VAR_DEBUG
THEN
fh := UTL_FILE.FOPEN( '/tmp', 'DEBUG.log', 'w' );
UTL_FILE.PUT( fh, 'REQUETE : ' );
UTL_FILE.PUT_LINE( fh, Requete );
UTL_FILE.PUT( fh, 'LONGUEUR TOTALE DES DONNEES(octets) : ' );
UTL_FILE.PUT_LINE( fh, DataLength );
UTL_FILE.FCLOSE( fh );
END IF;
/* -------------------------------------------------------------- */
/* Execution de la requete et ecriture de chaque ligne du curseur */
/* resultat dans le fichier specifie en parametre dans le rep. */
/* /tmp */
/* -------------------------------------------------------------- */
CurseurExecSql := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE( CurseurExecSql, Requete, DBMS_SQL.V7 );
DBMS_SQL.DEFINE_COLUMN( CurseurExecSql, 1, Ligne, MAX_CAR_DATA );
Ignore := DBMS_SQL.EXECUTE( CurseurExecSql );
TotalLigne := 0;
fh := UTL_FILE.FOPEN( '/tmp', VAR_NOM_FICH, 'a' );
LOOP
NbLigne := DBMS_SQL.FETCH_ROWS( CurseurExecSql );
IF NbLigne > 0
THEN
TotalLigne := NbLigne + TotalLigne;
DBMS_SQL.COLUMN_VALUE( CurseurExecSql, 1, Ligne );
Iteration := FLOOR( LENGTH(Ligne) / MAX_BUF_UTL );
FOR I IN 1..Iteration LOOP
UTL_FILE.PUT( fh, REPLACE(SUBSTR(Ligne, I, MAX_BUF_UTL), CHR(10), ' '));
END LOOP;
UTL_FILE.PUT_LINE( fh, REPLACE(SUBSTR(Ligne, Iteration+1, LENGTH(Ligne)-(Iteration*MAX_BUF_UTL)), CHR(10), ' '));
ELSE
EXIT;
END IF;
END LOOP;
DBMS_SQL.CLOSE_CURSOR( CurseurExecSql );
UTL_FILE.fclose( fh );
RAISE NOTICE '%%', TotalLigne, ' Lines.';
DBMS_OUTPUT.NEW_LINE;
RETURN TotalLigne;
/* ----------------------- */
/* Gestion des EXCEPTIONS */
/* ----------------------- */
EXCEPTION
when UTL_FILE.INVALID_PATH then
RAISE NOTICE 'ERREUR: chemin invalide -> /tmp';
RETURN 0;
when UTL_FILE.INVALID_FILEHANDLE then
RAISE NOTICE 'ERREUR: File Handle';
RETURN 0;
when UTL_FILE.INVALID_MODE then
RAISE NOTICE 'ERREUR: ouverture fichier';
RETURN 0;
when UTL_FILE.INVALID_OPERATION then
RAISE NOTICE 'ERREUR: operation invalide';
RETURN 0;
when UTL_FILE.WRITE_ERROR then
RAISE NOTICE 'ERREUR: ecriture fichier';
RETURN 0;
when OTHERS then
IF DBMS_SQL.IS_OPEN( CurseurExecSql )
THEN
DBMS_SQL.CLOSE_CURSOR( CurseurExecSql );
END IF;
RAISE;
RETURN 0;
END;
$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
STABLE;
voici mon search_path :
search_path
----------------------------------------------
toto, public, oracle, dbms_output, utl_file
Pouvez-vous m'aider svp?
Nn il ne la gère pas. J'ai aussi ce problème.
Le GOTO n'existe pas sous Postgres.
Savez-vous comment migrer ce code :
begin
select 'COUPE'
into STRICT tpcray
from cr
where segment = ncray;
goto maj_delta;
exception
when no_data_found then null;
when others then return null;
end;
tpcray := 'OK';
------------------------------------
-- Mise a jour de la valeur delta --
------------------------------------
<<maj_delta>>
if(tpcray = 'KO') then delta := 10;
end if;
Merci d'avance.
Voici la fonction Oracle que je dois convertir en postgreSQL :
function max_val(val1 Number, val2 Number) return Number is
begin
if (val1 is null) then return val2; end if;
if (val2 is null) then return val1; end if;
if (val1 > val2) then return val1; end if;
return val2;
end max_val;
L'outil ora2pg me prodtui la fonction suivante :
function max_val(val1 bigint, val2 bigint) return bigint is;
BEGIN
if(val1 is null) then return val2; end if;
if(val2 is null) then return val1; end if;
if(val1 > val2) then return val1; end if;
return val2;
END;
et c'est cette fonction convertie qui ne fonctionne pas.
Toujours dans le cadre de ma migration de fonctions Oracle vers Postgres... Je dois migrer cette fonction suivante mais cela ne marche pas :
function max_val(val1 bigint, val2 bigint) return bigint is;
J'ai le message d'erreur suivant :
ERREUR: erreur de syntaxe sur ou près de « bigint »
LINE 34: function max_val(val1 bigint, val2 bigint) return bi...
^
CONTEXT: nom de type « max_val(val1 bigint, val2 bigint) return bigint is » invalide
Pouvez vous m'expliquer la raison de cette erreur? Avez-vous une solution ?
D'avance merci.
est ce qu'il faut ecrire le contenu de titi.sql comme cela :
set search_path="$user", public, pg_catalog,public,dbms_output;
BEGIN;
select DBMS_OUTPUT.ENABLE(5);
select DBMS_OUTPUT.SERVEROUTPUT(TRUE);
select DBMS_OUTPUT.PUT_LINE('Messages enabled');
END;
Merci pour votre retour.
Bonjour et merci pour votre réponse. Cela fonctionne.
Par contre pouvez m'expliquer svp comment incorporer ce code dans un fichier titi.sql et pour qu'il fonctionne :
set search_path="$user", public, pg_catalog,public,dbms_output;
BEGIN
DBMS_OUTPUT.ENABLE(5)
DBMS_OUTPUT.SERVEROUTPUT(TRUE)
DBMS_OUTPUT.PUT_LINE('Messages enabled')
END;
D'avance merci.
postgres=# \df+ dbms_output.
List of functions
Schema | Name | Result data type | Argument data types | Type | Security | Volatility | Owner | Language | Source code | Description
-------------+--------------+------------------+------------------------------------------+--------+----------+------------+----------+----------+----------------------------+-------------------------------
dbms_output | disable | void | | normal | invoker | volatile | moi | c | dbms_output_disable | Disable package functionality
dbms_output | enable | void | | normal | invoker | volatile | moi | c | dbms_output_enable_default | Enable package functionality
dbms_output | enable | void | buffer_size integer | normal | invoker | volatile | moi | c | dbms_output_enable | Enable package functionality
dbms_output | get_line | record | OUT line text, OUT status integer | normal | invoker | volatile | moi | c | dbms_output_get_line | Get line from output buffer
dbms_output | get_lines | record | OUT lines text[], INOUT numlines integer | normal | invoker | volatile | moi | c | dbms_output_get_lines | Get lines from output buffer
dbms_output | new_line | void | | normal | invoker | volatile | moi | c | dbms_output_new_line | Put new line char to output
dbms_output | put | void | a text | normal | invoker | volatile | moi | c | dbms_output_put | Put some text to output
dbms_output | put_line | void | a text | normal | invoker | volatile | moi | c | dbms_output_put_line | Put line to output
dbms_output | serveroutput | void | boolean | normal | invoker | volatile | moi | c | dbms_output_serveroutput | Set drowing output
VoIla l'extension que j'ai créé :
postgres=# select * from pg_extension;
extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
---------+----------+--------------+----------------+------------+-----------+--------------
plpgsql | 10 | 11 | f | 1.0 | |
orafce | 16385 | 2200 | f | 3.6 | |
(2 rows)
et je suis censé utiliser orafce...
Et même quand je veux taper le code directement dans la console cela ne marche pas :
postgres=# begin
postgres-# DBMS_OUTPUT.SERVEROUTPUT(TRUE);
ERREUR: erreur de syntaxe sur ou près de « DBMS_OUTPUT »
LINE 2: DBMS_OUTPUT.SERVEROUTPUT(TRUE);
^
Pardon le code du fichier titi.sql pour tester ma fonction est le suivant :
set search_path="$user", public, pg_catalog,public,dbms_output;
BEGIN
DBMS_OUTPUT.SERVEROUTPUT(TRUE);
DBMS_OUTPUT.PUT_LINE('Messages enabled');
END;
récupéré depuis le site : https://www.enterprisedb.com/docs/en/9. … 1.143.html
Bonjour,
Je dois migrer Oracle vers Postgres.
J'ai des vues Oracle qui font appel à des fonctions comme dbms_output non présente dans postgres.
J' ai donc intégrées les fonctions manquantes avec orafce. J'ai créé l'extension orafce qui a créé les schémas :
List of schemas
Name | Owner
--------------+----------
dbms_alert | moi
dbms_assert | moi
dbms_output | moi
dbms_pipe | moi
dbms_random | moi
dbms_utility | moi
oracle | moi
plunit | moi
plvchr | moi
plvdate | moi
plvlex | moi
plvstr | moi
plvsubst | moi
public | postgres
utl_file | moi
et les fonctions , notamment :
postgres=# \df dbms_output.
List of functions
Schema | Name | Result data type | Argument data types | Type
-------------+--------------+------------------+------------------------------------------+--------
dbms_output | disable | void | | normal
dbms_output | enable | void | | normal
dbms_output | enable | void | buffer_size integer | normal
dbms_output | get_line | record | OUT line text, OUT status integer | normal
dbms_output | get_lines | record | OUT lines text[], INOUT numlines integer | normal
dbms_output | new_line | void | | normal
dbms_output | put | void | a text | normal
dbms_output | put_line | void | a text | normal
dbms_output | serveroutput | void | boolean | normal
(9 rows)
Pour tester mes fonctions j'exécute cela :
postgres:~/fonctions$ psql < titi.sql
SET
ERREUR: erreur de syntaxe sur ou près de « DBMS_OUTPUT »
LINE 2: DBMS_OUTPUT.ENABLE(5)
^
postgres:~/fonctions$ cat titi.sql
set search_path="$user", public, pg_catalog,public,dbms_output;
BEGIN
DBMS_OUTPUT.ENABLE(5)
DBMS_OUTPUT.SERVEROUTPUT(TRUE)
DBMS_OUTPUT.PUT_LINE('Messages enabled')
END;
Donc voila , cela ne marche pas. Je ne sais pas utiliser mes fonctions qui sont pourtant bien créées. Merci de ne pas vous moquer, j'ai bien conscience qu'il me manque une compétence.
Le code des fonctions est disponible ici : https://github.com/orafce/orafce/blob/m … 6--3.7.sql
et par exemple cela focntionne :
postgres=# select DBMS_OUTPUT.ENABLE(5);
ATTENTION: Limit increased to 2000 bytes.
enable
--------
(1 row)
postgres=# select DBMS_OUTPUT.SERVEROUTPUT(TRUE);
serveroutput
--------------
(1 row)
postgres=# select DBMS_OUTPUT.PUT_LINE('Messages enabled');
Messages enabled
put_line
----------
(1 row)
Pages : 1