2010-02-17 2 views
2

(Ceci est similaire à une question que je posais plus tôt: Porting Oracle Procedure to PostgreSQL)Portage Oracle Procédure (avec des appels de fonction spécifiques) Pour Postgres PL/PGSQL

J'ai besoin au port:

/* 
|| The following private procedure will execute a dynamic pl/sql 
|| statement passed to it. 
*/ 
    CREATE OR REPLACE FUNCTION DB_SHELL_UTIL_PKG.EXECUTE_STMT (stmt VARCHAR) IS 
    v_num_rows  integer; 
    v_cursor_table integer; 
    BEGIN 
    v_cursor_table := dbms_sql.open_cursor; 
    dbms_sql.parse (v_cursor_table, stmt, dbms_sql.v7); 
    v_num_rows := dbms_sql.execute (v_cursor_table); 
    dbms_sql.close_cursor(v_cursor_table); 
    END execute_stmt; 

et

/* 
|| The following private procedure will write out to a system 
|| file the statement passed to it. 
*/ 
    CREATE OR REPLACE FUNCTION DB_SHELL_UTIL_PKG.write_log_info (p_path IN VARCHAR2, 
          p_file_name IN VARCHAR2, 
          stmt IN VARCHAR2) IS 
     log_file UTL_FILE.FILE_TYPE; 
    BEGIN 
     log_file := UTL_FILE.FOPEN (p_path, p_file_name, 'A'); 
     UTL_FILE.PUT_LINE (log_file,stmt); 
     UTL_FILE.FCLOSE(log_file); 
    EXCEPTION 
     WHEN OTHERS THEN 
     UTL_FILE.FCLOSE(log_file); 
     RAISE; 
    END write_log_info; 

et

/* 
|| The following procedure will drop the user passed to it 
|| and then record its action by writing out to a system file 
*/ 
    PROCEDURE DROP_DB_PRO ( p_db_name IN VARCHAR2, 
        p_path IN VARCHAR2, 
        p_file_name IN VARCHAR2, 
        p_status OUT VARCHAR2 ) IS 
    v_stmt VARCHAR2(1500); 
    BEGIN 
    v_stmt := 'DROP USER '||p_db_name||' CASCADE'; 
    execute_stmt (v_stmt); 
    p_status := 'USER '||p_db_name|| ' HAS BEEN DROPPED'; 
    v_stmt := 'THE USER '||p_db_name||' HAS BEEN DROPPED'; 
    write_log_info(p_path, p_file_name, v_stmt); 
    EXCEPTION 
    WHEN OTHERS THEN 
    v_stmt := 'EXCEPTION raised in DROP_DB_PRO'; 
    write_log_info (p_path, p_file_name, v_stmt); 
    RAISE; 
    END DROP_DB_PRO; 

d'Oracle à PG/PLSQL ...

j'ai obtenu jusqu'ici:

CREATE OR REPLACE FUNCTION DB_SHELL_UTIL_PKG.EXECUTE_STMT (stmt VARCHAR) 
    RETURNS void as ' 
    DECLARE 
    v_num_rows  integer; 
    v_cursor_table integer; 
    BEGIN 
    v_cursor_table := dbms_sql.open_cursor; 
    dbms_sql.parse (v_cursor_table, stmt, dbms_sql.v7); 
    v_num_rows := dbms_sql.execute (v_cursor_table); 
    dbms_sql.close_cursor(v_cursor_table); 
    END execute_stmt; 
' LANGUAGE plpgsql; 

qui s'étrangle:

ERROR: syntax error at or near "dbms_sql" 
LINE 1: dbms_sql.parse ($1 , $2 , dbms_sql.v7) 

et

CREATE OR REPLACE FUNCTION DB_SHELL_UTIL_PKG.write_log_info (p_path VARCHAR, 
          p_file_name VARCHAR, 
          stmt VARCHAR) 
RETURNS void as ' 
     log_file UTL_FILE.FILE_TYPE; 
    BEGIN 
     log_file := UTL_FILE.FOPEN (p_path, p_file_name, ''A''); 
     UTL_FILE.PUT_LINE (log_file,stmt); 
     UTL_FILE.FCLOSE(log_file); 
    EXCEPTION 
     WHEN OTHERS THEN 
     UTL_FILE.FCLOSE(log_file); 
     RAISE; 
    END write_log_info; 
' LANGUAGE plpgsql; 

qui selfs sur:

ERROR: syntax error at or near "log_file" 
LINE 6:  log_file UTL_FILE.FILE_TYPE 

et

CREATE OR REPLACE FUNCTION DB_SHELL_UTIL_PKG.DROP_DB_PRO ( p_db_name VARCHAR, 
        p_path VARCHAR, 
        p_file_name VARCHAR, 
        p_status VARCHAR ) 
    RETURNS varchar as ' 
    DECLARE 
    v_stmt VARCHAR(1500); 
    BEGIN 
    v_stmt := 'DROP USER '||p_db_name||' CASCADE'; 
    execute_stmt (v_stmt); 
    p_status := 'USER '||p_db_name|| ' HAS BEEN DROPPED'; 
    v_stmt := 'THE USER '||p_db_name||' HAS BEEN DROPPED'; 
    write_log_info(p_path, p_file_name, v_stmt); 
    return(p_status); 
    EXCEPTION 
    WHEN OTHERS THEN 
    v_stmt := 'EXCEPTION raised in DROP_DB_PRO'; 
    write_log_info (p_path, p_file_name, v_stmt); 
    RAISE; 
    END DROP_DB_PRO; 
    ' LANGUAGE plpgsql; 

Aide avec l'un de ces serait très apprécié (je suis nouveau dans le monde des fonctions/procédures stockées)

Répondre

4

Pour la DBMS_SQL un, regardez Dynamic SQL in plpgsql

Pour UTL_FILE, vous devrez regarder au-delà de plpgsql ou au Orafce

+0

Si Orafce ne fonctionne pas pour vos besoins UTL_FILE, au-delà de plpgsql, vous devriez regarder plperl (non approuvé) ou l'un des autres langages de procédure stockés. – Kuberchaun

1

Orafce peut UTL_FILE, juste besoin de mettre à jour la documentation

Questions connexes