/ / Portierung der Oracle-Prozedur (mit bestimmten Funktionsaufrufen) An Postgres PL / PGSQL - Datenbank, Oracle, Postgresql, Plpgsql

Oracle-Prozedur (mit bestimmten Funktionsaufrufen) auf Postgres PL / PGSQL portieren - Datenbank, Oracle, Postgresql, Plpgsql

(Dies ist ähnlich einer Frage, die ich zuvor gestellt habe: Oracle-Prozedur nach PostgreSQL portieren)

Ich muss portieren:

/*
||  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;

und

/*
||  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;

und

/*
||  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;

Von Oracle zu PG / PLSQL ...

Ich bin so weit gekommen:

  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;

Welche Drosseln an:

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

und

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;

welche drosselt auf:

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

und

  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;

Hilfe bei all diesen Fragen wäre sehr willkommen (Ich bin neu in der Welt der Funktionen / gespeicherten Prozeduren)

Antworten:

4 für die Antwort № 1

Für DBMS_SQL siehe Dynamisches SQL in plpgsql

Für UTL_FILE müssen Sie darüber hinaus schauen plpgsql oder bei Orafce


1 für die Antwort № 2

Orafce kann UTL_FILE, nur die Dokumentation muss aktualisiert werden