【问题标题】:Porting Oracle Procedure (With Specific Function Calls) To Postgres PL/PGSQL将 Oracle 过程(带有特定函数调用)移植到 Postgres PL/PGSQL
【发布时间】:2011-01-17 16:52:16
【问题描述】:

(这类似于我之前提出的一个问题:Porting Oracle Procedure to PostgreSQL

我需要移植:

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

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

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

从 Oracle 到 PG/PLSQL...

我已经走到这一步了:

  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;

令人窒息:

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

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;

让人窒息:

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

  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;

非常感谢您提供任何这些帮助(我是函数/存储过程领域的新手)

【问题讨论】:

    标签: database oracle postgresql plpgsql


    【解决方案1】:

    对于 DBMS_SQL,请查看Dynamic SQL in plpgsql

    对于 UTL_FILE,您必须超越 plpgsqlOrafce

    【讨论】:

    • 如果 Orafce 在 plpgsql 之外无法满足您的 UTL_FILE 需求,请查看 plperl(untrusted) 或其他存储过程语言之一。
    【解决方案2】:

    Orafce可以UTL_FILE,只需要更新文档

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2011-12-15
      • 2012-03-11
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多