标签: plpgsql

PostgreSQL函数返回多个结果集

是否可以从Postgres函数返回多个结果集,如在MSSQL中:

CREATE PROCEDURE test

AS

SELECT * FROM first_table

SELECT * FROM second_table
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

在postgresql数据库中重命名列名

我想在PostgreSQL数据库中将所有列名重命名为小写我刚刚编写了一个sql函数.下面是代码.

CREATE OR REPLACE FUNCTION update_column_names() RETURNS boolean AS $$
DECLARE 
aRow RECORD;
aRow2 RECORD;
tbl_name TEXT;
col_name TEXT;
new_col_name TEXT; 
BEGIN
    FOR aRow IN select table_name from information_schema.tables where table_schema='public' and table_type='BASE TABLE' LOOP
        SELECT aRow.table_name INTO tbl_name from current_catalog;
        FOR aRow2 IN select column_name from information_schema.columns where table_schema='public' and table_name = aRow.table_name LOOP
            SELECT aRow2.column_name INTO col_name from current_catalog;
            new_col_name:=lower(col_name);
            RAISE NOTICE 'Table name:%',tbl_name;
            RAISE NOTICE 'Column name:%',aRow2.column_name;
            RAISE NOTICE 'New column name:%',new_col_name;
            ALTER TABLE tbl_name RENAME COLUMN …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

将记录作为函数参数PL/pgSQL传递

首先,我是pl/pgsql的新手.需要它用于项目.

我坚持这个(简化)问题.

我的db模式有一个到m的关系(作者,书籍,author_books)

现在我想要一个pl/psgsql函数insert_book.(我知道所有作者肯定已经在作者表中,所以我只想传递他们的主键).

这个功能大纲是我的想法.

 create or replace function insert_book(book_to_insert book, authors integer[])
  returns void as $$
begin
    -- insert book into table books
    -- for each author add an entry to author_books table
end;
 $$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

作为论据我想通过类型书的记录和编写它的作者.但这究竟是如何工作的呢?我用Google搜索了一下,似乎无法弄清楚这一点......

问题1:功能大纲是否"正确"/是否有意义?

问题2:如何将记录簿插入表格书?我是否必须遍历书籍的所有领域(title,isbn,publisher,...)并将它们添加到INSERT INTO语句中,还是有"更智能"的方式?

问题3:如何调用我的函数insert_book?我在这里找到了这个例子(http://dbaspot.com/postgresql/206142-passing-record-function-argument-pl-pgsql.html),但这对我没有帮助.出于测试目的,我使用shell,但稍后我们将使用Java和JDBC.

非常感谢您的帮助.

postgresql types plpgsql common-table-expression sql-insert

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

在Postgres 9.0+中使用PL/pgSQL循环表

我想遍历所有表来计算每个表中的行数.以下查询给我一个错误:

DO $$
DECLARE
    tables CURSOR FOR
        SELECT tablename FROM pg_tables
        WHERE tablename NOT LIKE 'pg_%'
        ORDER BY tablename;
    tablename varchar(100);
    nbRow int;
BEGIN
    FOR tablename IN tables LOOP
        EXECUTE 'SELECT count(*) FROM ' || tablename INTO nbRow;
        -- Do something with nbRow
    END LOOP;
END$$;
Run Code Online (Sandbox Code Playgroud)

错误:

ERROR:  syntax error at or near ")"
LINE 1: SELECT count(*) FROM (sql_features)
                                          ^
QUERY:  SELECT count(*) FROM (sql_features)
CONTEXT:  PL/pgSQL function inline_code_block line 8 at EXECUTE statement
Run Code Online (Sandbox Code Playgroud)

sql_features是我的数据库中的表名.我已经尝试使用quote_ident()但无济于事.

postgresql variables loops plpgsql tablename

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

为PostgreSQL中的记录变量动态传递列名

使用PostgreSQL,第一条记录的表中的列值存储在记录变量中.例如:让变量为:recordvar

recordvar.columnname
Run Code Online (Sandbox Code Playgroud)

给出指定列名的值.我将columname在变量中定义:

var := columnname
Run Code Online (Sandbox Code Playgroud)

在地方columnname,如果我与变量如更换recordvar.var,这是行不通的.

请让我知道如何处理这种情况.以下是示例代码:

CREATE OR REPLACE FUNCTION getrowdata(id numeric, table_name character varying)
RETURNS SETOF void AS
$BODY$ 
DECLARE

srowdata record;
reqfield character varying;
value numeric;


BEGIN

RAISE NOTICE 'id: %',id; 
reqfield:= 'columnname';

EXECUTE 'select * from datas.'||table_name||' WHERE id = '||id into srowdata;

RAISE NOTICE 'srowdata: %',srowdata; 

RAISE NOTICE 'srowdatadata.columnname: %',srowdata.columnname;

value:= srowdata.reqfield;

RAISE NOTICE 'value: %',value;


END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
Run Code Online (Sandbox Code Playgroud)

postgresql types dynamic-sql plpgsql hstore

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

处理PostgreSQL异常的优雅方式?

在PostgreSQL中,我想创建一个安全包装机制,如果发生异常,它将返回空结果.考虑以下:

SELECT * FROM myschema.mytable;
Run Code Online (Sandbox Code Playgroud)

我可以在客户端应用程序中进行安全包装:

try {
    result = execute_query('SELECT value FROM myschema.mytable').fetchall();
}
catch(pg_exception) {
    result = []
}
Run Code Online (Sandbox Code Playgroud)

但我可以直接在SQL中做这样的事情吗?我想使下面的代码工作,但似乎它应该被放入DO $$ ... $$块中,在这里我迷路了.

BEGIN
    SELECT * FROM myschema.mytable;
EXCEPTION WHEN others THEN
    SELECT unnest(ARRAY[]::TEXT[])
END
Run Code Online (Sandbox Code Playgroud)

sql postgresql exception-handling dynamic-sql plpgsql

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

在PL/pgSQL中声明行类型变量

正如我发现的SELECT * FROM t INTO my_data;作品只有:

DO $$
DECLARE
my_data t%ROWTYPE;
BEGIN
SELECT * FROM t INTO my_data WHERE id = ?;
END $$;
Run Code Online (Sandbox Code Playgroud)

我对吗?

如果我想只获得2-3列而不是所有列.我该如何定义my_data?

那是,

DO $$
DECLARE
my_data <WHAT HERE??>;
BEGIN
SELECT id,name,surname FROM t INTO my_data WHERE id = ?;
END $$;
Run Code Online (Sandbox Code Playgroud)

postgresql types plpgsql declare select-into

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

PostgreSQL 中的“非 SETOF 函数”是什么?

进入PL/pgSQL\xe2\x80\xa6

\n\n

我还在学习语法。有时,我会遇到以下错误消息:

\n\n
\n

错误:无法在非 SETOF 函数中使用 RETURN QUERY

\n
\n\n

这听起来有点神秘,我在 Postgres 文档中找不到信息。因此问题是:

\n\n
    \n
  • 什么是非 SETOF 函数?
  • \n
\n\n

同样,假设有这样的东西,那么 SETOF 函数是什么?

\n

sql database postgresql plpgsql return-query

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

如何从postgresql函数或触发器发送一些http请求

我需要通过http协议(GET或POST请求)从函数或触发器发送数据.可能吗?

postgresql plpgsql httprequest

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

没有函数匹配给定的名称和参数类型

我的功能是:

 CREATE OR REPLACE FUNCTION FnUpdateSalegtab09
(
 iacyrid Integer,iRepId Integer,iDrId Integer,ivrid Integer,imode smallint,itrno 
varchar,itrdate timestamp,iacid Integer,ivrno varchar,iSuppId Integer,icustname 
varchar,inetamt money,idisrate real,idisamt money,iRoundOff real,ijrmid integer,iuserid 
integer,iuserdtm timestamp,iVSNo integer,iRecdAmt money,icstrate real,icstsaleamt 
money,icstamt money,itdrate real,itdamt money,icdrate real,icdamt money,iCessRate 
real,iCessAmt money,iodesc1 varchar,ioamt1 money,iCashCredit boolean,iOrderNo 
varchar,iOrderDate timestamp,iCustAdd2 varchar,iRemarks varchar,iWhoRetSl boolean,iPatName 
varchar,iDrName varchar,iFormId integer,iSalesMan varchar,iCFMode smallint,iPatId 
integer,iStkPtId integer,iDisType smallint,iBranchID integer
)
RETURNS void AS
'BEGIN 
INSERT INTO gtab09 
(
acyrid, RepId, DrId, vrid, mode, trno, trdate, acid, vrno, SuppId, custname, netamt,
disrate, disamt, RoundOff, jrmid, userid, …
Run Code Online (Sandbox Code Playgroud)

postgresql types casting function plpgsql

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