CREATE OR REPLACE FUNCTION _chkLogin(userid varchar, pwd varchar)
RETURNS BOOLEAN AS
$BODY$
DECLARE
passed BOOLEAN;
BEGIN
SELECT (_password = $2) FROM _vRegistration WHERE _userid = $1;
RETURN passed;
END;
$BODY$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
当我执行上面的代码时,我收到以下错误,
SELECT _chkLogin('username','abcd') as passed;
Run Code Online (Sandbox Code Playgroud)
错误:查询没有结果数据的目的地
我用过表演然后我得到了一个不同的问题,
PERFORM _chkLogin('username','abcd');
Run Code Online (Sandbox Code Playgroud)
错误:"执行"或附近的语法错误
建议我应该怎么做才能克服这个错误.
来自MS SQL世界,我倾向于大量使用存储过程.我目前正在编写一个应用程序使用了很多PostgreSQL plpgsql函数.我想做的是回滚特定函数中包含的所有INSERTS/UPDATES如果我在其中的任何一点得到异常.
我最初的印象是每个函数都包含在它自己的事务中,并且异常会自动回滚所有内容.但是,情况似乎并非如此.我想知道我是否应该将保存点与异常处理结合使用?但我并不真正了解事务和保存点之间的区别,以了解这是否是最好的方法.有什么建议吗?
CREATE OR REPLACE FUNCTION do_something(
_an_input_var int
) RETURNS bool AS $$
DECLARE
_a_variable int;
BEGIN
INSERT INTO tableA (col1, col2, col3)
VALUES (0, 1, 2);
INSERT INTO tableB (col1, col2, col3)
VALUES (0, 1, 'whoops! not an integer');
-- The exception will cause the function to bomb, but the values
-- inserted into "tableA" are not rolled back.
RETURN True;
END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud) 我习惯于开发Java应用程序,但对于一个项目,我做了posgresql函数.我想为这些功能编写小型单元测试.
我目前正在寻找标准方法.我找到了pgTap和pgUnitTest,以及2007年的一篇文章:http://www.bigsmoke.us/postgresql-unit-testing/
你有什么方法对postgresql函数进行单元测试?你如何模拟数据/单独的testdata?如何隔离单元测试?哪个框架或方法受到青睐(我使用jUnit和testNG for java)?
为什么我总是从Postgres得到以下错误?
syntax error at or near "IF"
我读了PostgreSQL:文档:8.3:控制结构.首先,我尝试执行一个困难的查询(使用子查询),但后来我尝试执行一个这样的简单查询:
IF 2 <> 0 THEN select * from users; END IF;
Run Code Online (Sandbox Code Playgroud)
错误仍然是一样的.我究竟做错了什么?
无论如何,在plpgsql函数中你可以获得函数的名称吗?甚至是功能的OID?
我知道plpgsql中有一些"特殊"变量(如FOUND),但似乎没有办法解决这个问题.(虽然,如果您的函数是用C语言编写的,我已经读过了.)这并不重要,但它会使我做得更好/更不脆弱.
我正在使用PostgreSQL v.9.1.5
我有一张桌子:
+----+----------+----------+
| id | trail_id | position |
+----+----------+----------+
| 11 | 16 | NULL |
| 12 | 121 | NULL |
| 15 | 121 | NULL |
| 19 | 42 | NULL |
| 20 | 42 | NULL |
| 21 | 42 | NULL |
+----+----------+----------+
Run Code Online (Sandbox Code Playgroud)
而且我正在寻找一种简单的方法来position使用递增整数进行更新(每个父级).所以在我完成后,表格应如下所示:
+----+-----------+----------+
| id | trail_id | position |
+----+-----------+----------+
| 11 | 16 | 1 |
| 12 | 121 | 1 …Run Code Online (Sandbox Code Playgroud) 使用时不会复制外键约束
create table table_name ( like source_table INCLUDING ALL)'
Run Code Online (Sandbox Code Playgroud)
在Postgres.如何创建包含所有外键的现有表的副本.
我是Postgres的新手,拥有一个具有相同结构的多个表的数据库.我需要从每个表中选择符合特定条件的数据.
我可以通过一堆UNION查询来做到这一点,但是我需要搜索的表的数量会随着时间的推移而改变,所以我不想像那样硬编码.我一直在尝试开发一个循环遍历特定表的函数(它们有一个共同的命名约定)并返回一个记录表,但是当我查询函数时,我没有得到任何结果.功能代码如下:
CREATE OR REPLACE FUNCTION public.internalid_formaltable_name_lookup()
RETURNS TABLE(natural_id text, name text, natural_id_numeric text) AS
$BODY$
DECLARE
formal_table text;
begin
FOR formal_table IN
select table_name from information_schema.tables
where table_schema = 'public' and table_name like 'formaltable%'
LOOP
EXECUTE 'SELECT natural_id, name, natural_id_numeric
FROM ' || formal_table ||
' WHERE natural_id_numeric IN (
select natural_id_numeric from internal_idlookup
where internal_id = ''7166571'')';
RETURN NEXT;
END LOOP;
Return;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我尝试使用该函数时没有收到任何错误,但它没有返回任何行:
SELECT * From internalid_formaltable_name_lookup();
Run Code Online (Sandbox Code Playgroud)
知道我哪里错了吗?
postgresql for-loop dynamic-sql plpgsql set-returning-functions
我有这个过程,必须使用pl/pgsql进行一系列查询:
--process:
SELECT function1();
SELECT function2();
SELECT function3();
SELECT function4();
Run Code Online (Sandbox Code Playgroud)
为了能够在一次调用中执行所有操作,我创建了一个过程函数:
CREATE OR REPLACE FUNCTION process()
RETURNS text AS
$BODY$
BEGIN
PERFORM function1();
PERFORM function2();
PERFORM function3();
PERFORM function4();
RETURN 'process ended';
END;
$BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
问题是,当我总结每个函数自身所用的时间时,总计为200秒,而函数所process()用的时间超过一个小时!
也许这是一个内存问题,但我不知道postgresql.conf应该改变哪种配置.
DB在Debian 8中的PostgreSQL 9.4上运行.
postgresql plpgsql database-performance query-performance postgresql-performance
以下声明的用途是什么,我们在哪里使用这些类型的声明?
myrow tablename%ROWTYPE;
myfield tablename.columnname%TYPE;
arow RECORD;
Run Code Online (Sandbox Code Playgroud) plpgsql ×10
postgresql ×10
sql ×2
create-table ×1
dynamic-sql ×1
for-loop ×1
foreign-keys ×1
frameworks ×1
mocking ×1
rdbms ×1
sqldatatypes ×1
transactions ×1
unit-testing ×1