ALTER FUNCTION的参数默认值?

Jey*_*eyJ 2 postgresql function plpgsql

我正在尝试将我的一个oracle数据库迁移到Postgres 9.5.我目前正在尝试创建下一个功能:

-- Generated by Ora2Pg, the Oracle database Schema converter, version 18.1
-- Copyright 2000-2017 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:oralab

SET client_encoding TO 'UTF8';
SET search_path = repdev,public,oracle,utl_file,extensions;
show search_path;

CREATE OR REPLACE FUNCTION Bl_Create_Flat_File_Pg.set_charset (file_id 
utl_file.file_type, p_title text DEFAULT NULL) RETURNS VOID AS $body$
BEGIN
.....
End;
--
$body$
LANGUAGE PLPGSQL
SECURITY DEFINER
STABLE;
ALTER FUNCTION Bl_Create_Flat_File_Pg.set_charset (file_id 
utl_file.file_type, p_title text DEFAULT NOT NULL ) OWNER TO repdev;
Run Code Online (Sandbox Code Playgroud)

但是当我在psql中运行它时,我发出下一个错误:

ERROR:  syntax error at or near "DEFAULT"
LINE 1: ...charset (file_id utl_file.file_type, p_title text DEFAULT NU...
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 5

对于ALTER FUNCTION您只需要重复参数定义(实际上只需要参数类型),而不是default参数的子句:

ALTER FUNCTION Bl_Create_Flat_File_Pg.set_charset(file_id utl_file.file_type, p_title text) 
OWNER TO repdev;
Run Code Online (Sandbox Code Playgroud)

或更短:

ALTER FUNCTION Bl_Create_Flat_File_Pg.set_charset(utl_file.file_type, text) 
OWNER TO repdev;
Run Code Online (Sandbox Code Playgroud)

如果比较CREATE FUNCTION语句的文档,即:

CREATE [ OR REPLACE ] FUNCTION
name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
Run Code Online (Sandbox Code Playgroud)

ALTER FUNCTION文档:

ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )
Run Code Online (Sandbox Code Playgroud)

你会注意到ALTER FUNCTION不允许该DEFAULT条款.

如果您向我们展示的代码确实是由Ora2Pg生成的,那么您应该将此作为错误报告给Ora2Pg作者.