标签: plpgsql

postgresql:USING CURSOR用于从一个数据库中提取数据并将它们插入另一个数据库

这是使用光标的另一种算法,但我很难修复它的错误...

CREATE OR REPLACE FUNCTION extractstudent()
RETURNS VOID AS 
$BODY$
DECLARE
    studcur SCROLL cursor FOR SELECT fname, lname, mname, address FROM student;
BEGIN    
    open studcur; 

    Loop
    --fetching 1 row at a time
    FETCH First FROM studcur;
    --every row fetched is being inserted to another database on the local site
    --myconT is the name of the connection to the other database in the local site
    execute 'SELECT * from dblink_exec(''myconT'', ''insert into temp_student values(studcur)'')';
    --move to the next row and execute …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

从函数返回查询?

我正在使用PostgreSQL 8.4,我想创建一个返回多行查询的函数.
下面的函数不能正常工作:

create function get_names(varchar) returns setof record AS $$
declare
    tname alias for $1;
    res setof record;
begin
    select * into res from mytable where name = tname;
    return res;
end;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

该类型record仅允许单行.

如何返回整个查询?我想使用函数作为查询模板.

sql postgresql function plpgsql

2
推荐指数
1
解决办法
381
查看次数

填充多维数组

我正在尝试在PostgreSQL上填充多维数组,但它不起作用.在我的代码下面:

CREATE OR REPLACE FUNCTION teste()
  RETURNS void AS
$BODY$
DECLARE
    tarifas NUMERIC[7][24];
    a INTEGER;
    b INTEGER;

    BEGIN
        FOR a IN 0..6 LOOP
            RAISE NOTICE 'TESTE TESTE %', a;
            FOR b IN 0..23 LOOP
                RAISE NOTICE 'tarifas[%][%] = 0;', a, b;
                tarifas[a][b] = 0;
            END LOOP;
        END LOOP;
    END
$BODY$
  LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)

arrays postgresql plpgsql multidimensional-array

2
推荐指数
1
解决办法
1410
查看次数

错误:具有默认值的输入参数也必须具有默认值

我试图将默认值设置为参数列表中的函数内的变量,但收到错误:

 Create or replace function test(name varchar default null
                               , city varchar default null
                               , phonenumber varchar(20) default null
                               , out sno bigint, address varchar)
   returns void as
 $$
 Declare 
        phonenumber AS VarChar(20);
 Begin
        phonenumber : =phonenumber; 

    SELECT sno = MAX(ssno)+1 FROM emp;

    IF(sno IS NULL)  then
           sno=IDENT_CURRENT('emp')+1;
    end;

    raise info '%',name;
    raise info '%',city;
    raise info '%',phonenumber;
    raise info '%',address;

    insert into emp(ename,ecity,ephonenumber,eaddress)
    values(name,city,phonenumber,address);

 end;
 $$
 langauge plpgsql;
Run Code Online (Sandbox Code Playgroud)

例:

 Create or replace function test(name varchar default null
                               , city …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql default-value

2
推荐指数
1
解决办法
2815
查看次数

授予用户ALTER功能的权限

我尝试ALTER使用新用户的函数,我得到错误:

ERROR:  must be owner of function ACases
********** Error **********

ERROR: must be owner of function ACases
SQL state: 42501
Run Code Online (Sandbox Code Playgroud)

我必须给予用户什么权限才能实现ALTER这一功能?我发现的唯一方法是让用户成为OWNER该功能的用户.

但如果是这种情况,只有一个用户(所有者)可以使用ALTER该功能.那么如何更改OWNER所有功能呢?

CREATE OR REPLACE FUNCTION public."ACases"(caseid integer)
  RETURNS boolean AS
$BODY$
DECLARE
BEGIN
        RETURN FALSE;
END;
$BODY$
  LANGUAGE plpgsql;
ALTER FUNCTION public."ACases"(integer) OWNER TO postgres;

GRANT ALL PRIVILEGES ON FUNCTION public."ACases"(integer) TO user_name;
Run Code Online (Sandbox Code Playgroud)

postgresql privileges plpgsql

2
推荐指数
1
解决办法
6978
查看次数

执行自定义函数时的Postgresql错误42883

我没有太多运气就寻找了这个...希望您能帮助我...

这是我的PL / pgSQL函数:

CREATE OR REPLACE FUNCTION crearempresa(
    _id_empresa integer DEFAULT NULL::integer,
    _ci_rif character varying DEFAULT NULL::character varying,
    _nombre character varying DEFAULT NULL::character varying,
    _persona_contacto character varying DEFAULT NULL::character varying,
    _telefono_movil character varying DEFAULT NULL::character varying,
    _telefono_oficina character varying DEFAULT NULL::character varying,
    _fax character varying DEFAULT NULL::character varying,
    _email character varying DEFAULT NULL::character varying,
    _email_alterno character varying DEFAULT NULL::character varying,
    _direccion character varying DEFAULT NULL::character varying,
    _tipoempresa character varying DEFAULT NULL::character varying,
    _cod_usuario integer DEFAULT NULL::integer,
    _estado_registro integer DEFAULT …
Run Code Online (Sandbox Code Playgroud)

database postgresql plpgsql

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

PostgreSQL / JDBC-如何准备使用参数CITEXT(TEXT)调用函数?

我创建了一个带有CITEXT列的表格CITEXT(的大小写不敏感TEXT),这是我之前使用加载的扩展CREATE EXTENSION citext;

CREATE TABLE artists (
    artist_id   SERIAL   PRIMARY KEY,
    artist      CITEXT   UNIQUE NOT NULL
);

CREATE OR REPLACE FUNCTION add_artist(_artist CITEXT) RETURNS INTEGER AS $$
    DECLARE
        _artist_id INT;
    BEGIN
        SELECT artist_id INTO _artist_id FROM artists WHERE artist = _artist;

        IF (_artist_id IS NULL) THEN
            INSERT INTO artists (artist) VALUES (
                _artist
            ) RETURNING artist_id INTO _artist_id;
        END IF;

        RETURN _artist_id;
    END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试使用以下方法在Java中调用该函数

public int addArtist(String name) throws SQLException …
Run Code Online (Sandbox Code Playgroud)

java postgresql jdbc plpgsql postgresql-9.4

2
推荐指数
1
解决办法
1213
查看次数

ALTER FUNCTION的参数默认值?

我正在尝试将我的一个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 …
Run Code Online (Sandbox Code Playgroud)

postgresql function plpgsql

2
推荐指数
1
解决办法
403
查看次数

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

代码:

CREATE FUNCTION square_num(num integer)
 RETURNS INTEGER AS $$

BEGIN

 IF (num<0) THEN
 RETURN 0;
 END IF;

 RETURN num*num;

END; $$
LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)

上面的代码在数据库postgres和模式中创建了一个函数public.如何在特定数据库及其架构中创建函数?谢谢.

sql postgresql plpgsql

2
推荐指数
1
解决办法
1462
查看次数

PostgreSQL:检查触发器函数中的NEW和OLD

我想创建一个对行进行计数并更新另一个表中的字段的触发器。我当前的解决方案适用于INSERT语句,但是当我删除一行时失败。

我当前的功能:

 CREATE OR REPLACE FUNCTION update_table_count()
RETURNS trigger AS
$$
DECLARE updatecount INT;
  BEGIN
      Select count(*) into updatecount 
        From source_table 
       Where id = new.id;
      Update dest_table set count=updatecount 
       Where id = new.id;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

触发器是一个非常基本的触发器,看起来像。

CREATE TRIGGER count_trigger
AFTER INSERT OR DELETE
ON source_table
FOR EACH ROW
EXECUTE PROCEDURE update_table_count();
Run Code Online (Sandbox Code Playgroud)

当我执行DELETE语句时,会发生以下错误:

错误:记录“新”尚未分配

详细信息:尚未分配的记录的元组结构是不确定的。

我知道一个解决方案可能是只为DELETE创建一组触发器和函数,为INSERT语句创建一组触发器和函数。但是我想做得更优雅一些,并且想知道,是否有一种解决方案可以检查当前上下文中是否存在NEW或OLD并仅实现IF ELSE块。但我不知道如何检查此上下文相关项。

谢谢你的帮助

postgresql plpgsql database-trigger postgresql-9.5

2
推荐指数
1
解决办法
1499
查看次数