相关疑难解决方法(0)

在 PostgreSQL 中创建一个函数

我不确定该CREATE FUNCTION语句在 PostgreSQL 中如何工作。我想定义一个函数(仅用于娱乐),以便给定数字 n,它打印从 1 到 n 的星号所以我写了这个:

CREATE FUNCTION asterisks(n int)
RETURNS CHAR AS
BEGIN
for i in range(1,n+1):
   print("*"*i + "\n")
END
LANGUAGE python
Run Code Online (Sandbox Code Playgroud)

我想要的结果n=3

*
**
***
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这样调用 Python 是否可行。我在这里读到 Postgres 支持 Python 作为过程语言:

https://www.postgresql.org/docs/current/xplang.html

sql database postgresql function plpgsql

4
推荐指数
1
解决办法
4990
查看次数

强制 PostgreSQL 在函数中使用不同的模式

我想为 PG SQL 数据库中的模式创建一个更新函数。下面是一个测试功能。它不起作用,因为它永远不应该发出通知,但在运行时会这样做test_schema_update('second')

CREATE OR REPLACE FUNCTION test_schema_update(my_schema_name VARCHAR(200)) 
RETURNS void AS
$__marker__$
DECLARE
    actualValue varchar(1000);
    testValue varchar(1000);
BEGIN
    EXECUTE 'SET search_path TO ' || quote_ident(my_schema_name);

    testValue := (SELECT max(value) FROM setting WHERE settingkey = 'libraryname');
    EXECUTE ('SELECT max(value) FROM setting WHERE settingkey = ''libraryname''')
        INTO actualValue;

    IF (actualValue != testValue)
    THEN
        RAISE NOTICE '% != %', actualValue, testValue;
        RAISE INFO 'Schema was: %', current_schema();
    END IF;

    RESET search_path;
END;
$__marker__$ LANGUAGE plpgsql;

test_schema_update('first');
test_schema_update('second');
Run Code Online (Sandbox Code Playgroud)

问题是 PG …

postgresql dynamic-sql plpgsql search-path

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

PostgreSQL 函数返回表或 SETOF

快速背景:PostgreSQL 非常新,来自 SQL Server。我正在将存储过程从 SQL Server 转换为 PostgreSQL。我已阅读 Postgres 9.3 文档并查看了大量示例和问题,但仍然找不到解决方案。

我有这个选择语句,我每周执行一次以返回新值

select distinct id, null as charges
     , generaldescription as chargedescription, amount as paidamount
from mytable
where id not in (select id from myothertable)
Run Code Online (Sandbox Code Playgroud)

我能做些什么来把它变成一个我可以右键单击并每周执行的功能。最终,我将使用另一个开发人员构建的程序自动执行此操作。因此,它将在没有用户参与的情况下执行并将结果以电子表格的形式发送给用户。不确定最后一部分是否对函数的编写方式很重要。

这是我多次失败的尝试之一:

CREATE FUNCTION newids
RETURNS TABLE (id VARCHAR, charges NUMERIC
             , chargedescription VARCHAR, paidamount NUMERIC) AS Results
Begin
SELECT DISTINCT id, NULL AS charges
     , generaldescription AS chargedescription, amount AS paidamount
FROM mytable
WHERE id NOT IN (SELECT id FROM myothertable)
END;
$$ LANGUAGE …
Run Code Online (Sandbox Code Playgroud)

sql postgresql stored-procedures plpgsql

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

从PL/pgSQL函数返回行

我在PostgreSQL中有一个过程:

CREATE OR REPLACE FUNCTION get_geom_difference()
RETURNS void AS
$$
BEGIN
SELECT filedata.num,st_area(ST_Difference(ST_TRANSFORM(filedata.the_geom,70066),filedata_temp.the_geom))
FROM filedata, filedata_temp
Where filedata.num=filedata_temp.num

end;
$$
LANGUAGE 'plpgsql'
Run Code Online (Sandbox Code Playgroud)

我在Java中调用它并希望获得此过程的结果.如何更改此过程以使其成为可能?以及如何在JDBC中使用它?

现在我用这个:

Integer fileId;
Class.forName("org.postgresql.Driver");
Connection connect= null;
connect = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgis","postgres","123456");
java.sql.CallableStatement proc =  connect.prepareCall("{?=call get_geom_difference()}");
proc.registerOutParameter(1, java.sql.Types.Integer);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
fileId=r.getInt("num");
}
proc.close();
connect.close();
out.println(fileId);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在JDBC中调用该过程时,我得到了

错误org.apache.jasper.JasperException:在第25行处理JSP页面/commit_changes.jsp时发生异常

第25行是: proc.execute();

java postgresql jdbc plpgsql

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

如何将天数传递给 Postgres 函数?

days函数中的参数getAvgByDay()不起作用,我猜是因为它在引号内:

CREATE OR REPLACE FUNCTION getAvgByDay(days int)
RETURNS TABLE ( average text,
                date timestamp with time zone
               ) AS
$func$
BEGIN
RETURN QUERY
SELECT to_char( AVG(measure), '99999D22') AS average, ( now() - interval '$1 day') AS date
FROM (
        SELECT mes.date, mes.measure
        FROM measures mes
        WHERE mes.date < ( now() - interval '$1 day')
    ) AS mydata;
END
$func$ 
LANGUAGE plpgsql;

Run Code Online (Sandbox Code Playgroud)

sql postgresql function plpgsql

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