是否可以从Postgres函数返回多个结果集,如在MSSQL中:
CREATE PROCEDURE test
AS
SELECT * FROM first_table
SELECT * FROM second_table
Run Code Online (Sandbox Code Playgroud) 我想在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) 首先,我是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.
非常感谢您的帮助.
我想遍历所有表来计算每个表中的行数.以下查询给我一个错误:
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)
错误:
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
sql_features是我的数据库中的表名.我已经尝试使用quote_ident()但无济于事.
使用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中,我想创建一个安全包装机制,如果发生异常,它将返回空结果.考虑以下:
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) 正如我发现的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) 进入PL/pgSQL\xe2\x80\xa6
\n\n我还在学习语法。有时,我会遇到以下错误消息:
\n\n\n\n\n错误:无法在非 SETOF 函数中使用 RETURN QUERY
\n
这听起来有点神秘,我在 Postgres 文档中找不到信息。因此问题是:
\n\n同样,假设有这样的东西,那么 SETOF 函数是什么?
\n我需要通过http协议(GET或POST请求)从函数或触发器发送数据.可能吗?
我的功能是:
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) plpgsql ×10
postgresql ×10
types ×4
dynamic-sql ×2
sql ×2
casting ×1
database ×1
declare ×1
function ×1
hstore ×1
httprequest ×1
loops ×1
return-query ×1
select-into ×1
sql-insert ×1
tablename ×1
variables ×1