相关疑难解决方法(0)

PostgreSQL函数中语言sql和语言plpgsql的区别

我是数据库开发的新手,所以我对以下示例有些怀疑:

函数f1() - 语言sql

 create or replace function f1(istr  varchar) returns text as $$ 
 select 'hello! '::varchar || istr;
 $$ language sql;
Run Code Online (Sandbox Code Playgroud)

函数f2() - 语言plpgsql

 create  or replace function f2(istr  varchar)
 returns text as $$ 
 begin select 'hello! '::varchar || istr; end;
 $$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
  • 这两个函数都可以像select f1('world')或一样调用select f2('world').

  • 如果我打电话select f1('world')输出将是:

    `hello! world`
    
    Run Code Online (Sandbox Code Playgroud)
  • 输出select f2('world'):

    错误:查询没有结果数据的目的地提示:如果要丢弃SELECT的结果,请改用PERFORM.语境:在SQL语句中PL/pgSQL函数f11(字符变化)第2行 ******错误******

  • 我想知道的差异,在哪些情况下我应该使用language sqllanguage plpgsql …

sql postgresql stored-procedures function plpgsql

37
推荐指数
2
解决办法
3万
查看次数

从PostgreSQL函数返回SETOF行

我有一种情况,我想在两个视图之间返回连接.那是很多专栏.在sql server中很容易.但是在PostgreSQL中我加入时.我收到错误"需要列定义列表".

有什么方法可以绕过这个,我不想提供返回列的定义.

CREATE OR REPLACE FUNCTION functionA(username character varying DEFAULT ''::character varying, databaseobject character varying DEFAULT ''::character varying)
  RETURNS SETOF ???? AS
$BODY$
Declare 
SqlString varchar(4000) = '';
BEGIN
IF(UserName = '*') THEN
   Begin
   SqlString  := 'select * from view1 left join ' + databaseobject  + ' as view2 on view1.id = view2.id';
   End;
ELSE
    Begin
    SqlString := 'select * from view3 left join ' + databaseobject  + ' as view2 on view3.id = view2.id';
    End;
END IF; 
execute …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql postgresql-9.2

11
推荐指数
1
解决办法
3万
查看次数