Postgres:在特定数据库中创建函数

时间:2017-12-28 11:52:56

标签: sql postgresql plpgsql

代码:

string param0 = "1";
string param1 = "2";
string param2 = null;
NameOfFirstEmptyParam(new {param0, param1, param2}); //"param2" will be returned

上面的代码在数据库CREATE FUNCTION square_num(num integer) RETURNS INTEGER AS $$ BEGIN IF (num<0) THEN RETURN 0; END IF; RETURN num*num; END; $$ LANGUAGE PLPGSQL; 和架构postgres中创建了一个函数。如何在特定数据库及其架构中创建函数?感谢。

1 个答案:

答案 0 :(得分:5)

  

上面的代码在数据库postgres和schema中创建了一个函数   公共

没有。它在search_path的第一个现有模式中在您连接的数据库中创建函数。

示例:

-bash-4.2$ psql t
psql (10.1)
Type "help" for help.

t=# create table tt();
CREATE TABLE
t=# select table_catalog,table_schema from information_schema.tables where table_name = 'tt';
 table_catalog | table_schema
---------------+--------------
 t             | public
(1 row)

我在连接上定义了数据库名称 t ,因此在数据库t中创建了关系。我没有架构 postgres ,因此跳过$user,下一个“默认”架构为public

t=# show search_path;
   search_path
-----------------
 "$user", public
(1 row)

所以现在:

t=# create schema postgres;
CREATE SCHEMA
t=# create table tt();
CREATE TABLE

请参阅 - 没有关系已存在的错误,因为:

t=# select table_catalog,table_schema from information_schema.tables where table_name = 'tt';
 table_catalog | table_schema
---------------+--------------
 t             | public
 t             | postgres
(2 rows)

函数创建遵循相同的规则,我使用表作为较短的语法...

阅读:https://www.postgresql.org/docs/current/static/ddl-schemas.html#DDL-SCHEMAS-PATH

  

搜索路径中存在的第一个架构是默认架构   用于创建新对象的位置。

终于回答了

  

如何在特定数据库及其架构中创建函数?

连接到所需的数据库,并明确指定模式名称:

CREATE FUNCTION my_schema.square_num(...and so on

或调整search_path以满足您的需求

更新为了清楚起见,我使用架构名称​​ postgres 来遵守原始帖子。使用postgres数据库和创建postgres架构都会让新用户感到困惑。没有关于默认 postgres 数据库的特殊(或系统)(可以随时从模板重新创建),名称​​ postgres 都不会为模式提供任何特殊属性。我只是将它用于OP以便更容易地重现示例(从他连接到postgres数据库的事实来看,用户可能没有指定数据库名称,连接为OS用户 postgres )。因此,为了演示如何选择search_path第一个值$user,我使用相同的名称作为用户名...