【问题标题】:Parameter defaults for ALTER FUNCTION?ALTER FUNCTION 的参数默认值?
【发布时间】:2017-07-07 22:25:17
【问题描述】:

我正在尝试将我的一个 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;

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

ERROR:  syntax error at or near "DEFAULT"
LINE 1: ...charset (file_id utl_file.file_type, p_title text DEFAULT NU...

【问题讨论】:

  • 如果你没有为最后一个参数指定默认值,它将默认为 null - 只需删除`DEFAULT NULL` - 它已经在你的情况下
  • 提供的语句中没有明显的语法错误:test。它只是单个语句,还是某个更大脚本的一部分?
  • 这不是真的 - 如果没有 DEFAULT NULL提供一个论据,你不必。这个错误令人惊讶(我本来期望schema "utl_file" does not exist)。这是您正在运行的修改或分叉的 PostgreSQL 吗?
  • 修改或分叉是什么意思?刚刚下载了官方的 postgresql 9.5 并从源文件安装它..
  • 嗨,它是我尝试导入数据库的 .sql 转储文件的一部分。我没有包含正文,但正文包含一些 UTL_FILES.PUT_LINE 仅此而已。

标签: postgresql function plpgsql


【解决方案1】:

ALTER FUNCTION只需要重复参数定义即可(实际上只需要参数types),不是参数的default子句:

ALTER FUNCTION Bl_Create_Flat_File_Pg.set_charset(file_id utl_file.file_type, p_title text) 
OWNER TO repdev;

或更短:

ALTER FUNCTION Bl_Create_Flat_File_Pg.set_charset(utl_file.file_type, text) 
OWNER TO repdev;

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

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

ALTER FUNCTION 文档:

ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )

您会注意到ALTER FUNCTION 不允许使用DEFAULT 子句。

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

【讨论】:

  • 谢谢!是的,它是由 Ora2PG 生成的。我会报告这个错误。
  • @Mariel:这里的关键词是“函数签名”,Ora2P 的人应该使用一些实用函数,特别是:pg_get_function_identity_arguments(func_oid) 更多:stackoverflow.com/a/12127714/939860
猜你喜欢
  • 2011-01-21
  • 2016-02-22
  • 2019-02-08
  • 1970-01-01
  • 2012-08-01
  • 2011-03-25
  • 2018-06-20
  • 1970-01-01
  • 2012-05-04
相关资源
最近更新 更多