标签: plpgsql

PL/pgSQL中的IP递增函数

我需要一个 PL/pgSQL 函数,它将 IP 地址作为文本,并向其中添加给定的整数值,并根据需要传递八位字节。

我已经有一个用 JavaScript 编写的工作版本:

export const incrementIpAddress = (ipAddress: string, amount: number) => {
    const octets = ipAddress.split('.');
    const numbers = octets.map(octet => parseInt(octet));

    let carry = amount;
    for(let i = numbers.length - 1; i >= 0 && carry > 0; i--) {
        const sum = numbers[i] + carry;
        numbers[i] = sum % 256;
        carry = Math.floor(sum / 256);
    }

    return numbers.join('.');
}
Run Code Online (Sandbox Code Playgroud)

我尝试让 ChatGPT 将其转换为 PL/pgSQL(我知道,我很抱歉),这就是它的结果:

CREATE OR REPLACE FUNCTION increment_ip_address(ip_address text, amount integer) RETURNS …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

PostgreSQL函数参数问题(转换MySQL存储过程)

我正在将一些简单的MySQL存储过程转换为PostgreSQL函数,出于某种原因,当我执行以下函数时,它会在执行时抛出错误.

我使用以下代码创建了该函数:

CREATE FUNCTION cc.fs_ivr_updatecalltransfer(_ParentContactID
int[11], _CalledID varchar[32])
RETURNS int AS $$
DECLARE 
pcID int;   
BEGIN
if _ParentContactID<>0 then 
update cc.tblcontacts set cc.tblcontacts.transferdest =
_CalledID where cc.tblcontacts.contactid =
_ParentContactID;
end if;
RETURN _ParentContactID;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我像这样手动执行:

SELECT cc.fs_ivr_updatecalltransfer(3,"test")
Run Code Online (Sandbox Code Playgroud)

它抛出此错误:

SQL error:

ERROR:  column "test" does not exist
LINE 1: SELECT cc.fs_ivr_updatecalltransfer(3,"test")
In statement: SELECT  cc.fs_ivr_updatecalltransfer(3,"test")
Run Code Online (Sandbox Code Playgroud)

有什么建议?

sql postgresql stored-procedures plpgsql

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

postgresql中的游标for循环

我们有一个用pl/sql(oracle)编写的函数,如下所示:

CREATE OR REPLACE PROCEDURE folder_cycle_check (folder_key IN NUMBER, new_parent_folder_key IN NUMBER) IS
    parent_of_parent NUMBER;
    ILLEGAL_CYCLE EXCEPTION;
    CURSOR parent_c IS
    SELECT parent_folder_key FROM folder
        WHERE folder_key = new_parent_folder_key;
BEGIN

IF folder_key = new_parent_folder_key THEN
    RAISE ILLEGAL_CYCLE;
END IF;

FOR parent_rec IN parent_c LOOP
    BEGIN folder_cycle_check(folder_key, parent_rec.parent_folder_key); END;
END LOOP;

END;
Run Code Online (Sandbox Code Playgroud)

现在,我必须在pl/pgsql(PostgreSQL)中重写相同的过程以实现类似的功能.请帮帮我发送pl/pgsql函数.

编辑(来自评论的格式化代码)

CREATE OR REPLACE FUNCTION folder_cycle_check(IN folder_key INTEGER, IN new_parent_folder_key INTEGER) 
  RETURNS VOID 
AS $procedure$ 
   DECLARE parent_of_parent INTEGER; 
   PARENT_C CURSOR FOR 
        SELECT parent_folder_key 
        FROM folder 
        WHERE folder_key = new_parent_folder_key; …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

更新/插入触发器之前的Postgresql似乎不起作用

我有以下触发功能:

CREATE OR REPLACE FUNCTION update_modelname_function()
  RETURNS trigger AS
$BODY$
BEGIN
  IF tg_op = 'INSERT' THEN
     new.model_name := upper(new.model_name);
     RETURN new;
  END IF;
  IF tg_op = 'UPDATE' THEN
     old.model_name := upper(old.model_name);
     RETURN new;
  END IF;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Run Code Online (Sandbox Code Playgroud)

我想要实现的是当列model_name的值在表中持久化时始终是大写的.但似乎没有任何事情发生.有任何想法吗?

postgresql triggers plpgsql

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

PL/PgSQL在循环内调用函数给出错误

下面的代码正在给出错误,w_add_ax_extra(1, 'k', 'v')之前w_add_ax_extra(some_id, kv.k, kv.v)我将其更改k, v为重现相同的错误

declare
  kv record;
begin
  -- Lines skipped
  for kv in select * from (select (each(extras)).*) as f(k,v) loop
    raise notice 'key=%,value=%',kv.k,kv.v;
    w_add_ax_extra(1, 'k', 'v');
  end loop;
  -- Lines Skipped
end
Run Code Online (Sandbox Code Playgroud)

我收到语法错误但无法理解我错过了什么

ERROR:  syntax error at or near "w_add_ax_extra"
LINE 1: w_add_ax_extra(1, 'k', 'v')
Run Code Online (Sandbox Code Playgroud)

但是如果我这样做的dummy = w_add_ax_extra(1, 'k', 'v')话.是的,这个函数返回一个整数.但我不需要在这里存储它.是否必须保留返回值?

postgresql plpgsql

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

从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
查看次数

plpgsql中的语法错误

我在PostgreSQL中有一个存储过程

CREATE OR REPLACE FUNCTION show_senti_lang_setting(IN _senti_id bigint)
RETURNS TABLE(lang_code character, native_name character varying, is_active boolean) AS
$BODY$
BEGIN
RETURN QUERY 
    SELECT
        l.lang_code,
        l.native_name,
        (CASE WHEN s.senti_id is NULL THEN FALSE
            ELSE TRUE
        END) is_active
    FROM
        language l
    LEFT JOIN senti_lang s
    ON s.lang_code=l.lang_code
    AND s.senti_id=_senti_id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE STRICT;
Run Code Online (Sandbox Code Playgroud)

错误是:

ERROR:  syntax error at or near "$1"
LINE 1: ...HEN s.senti_id is NULL THEN FALSE ELSE TRUE END)  $1  FROM l...
                                                         ^
QUERY:   SELECT l.lang_code, l.native_name, (CASE …
Run Code Online (Sandbox Code Playgroud)

sql postgresql exists plpgsql postgresql-8.4

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

PL/PgSQL:没有函数匹配给定的名称和参数类型.您可能需要添加显式类型转换

我正在尝试dateadd()使用PL/PgSQL 编写一个函数.我希望能够添加从秒到几年到日期/时间戳的任何内容.拼凑了一个函数(来自网上获得的片段等),并提出了这个"实现":

CREATE OR REPLACE FUNCTION dateadd(diffType VARCHAR(15), incrementValue int, inputDate timestamp) RETURNS timestamp AS $$
DECLARE
   YEAR_CONST Char(15) := 'year';
   MONTH_CONST Char(15) := 'month';
   DAY_CONST Char(15) := 'day';
   HOUR_CONST Char(15) := 'hour';
   MIN_CONST Char(15) := 'min';
   SEC_CONST Char(15) := 'sec';

   dateTemp Date;
   intervals interval;
BEGIN
   IF lower($1) = lower(YEAR_CONST) THEN
       select cast(cast(incrementvalue as character varying) || ' year' as interval) into intervals;
   ELSEIF lower($1) = lower(MONTH_CONST) THEN
       select cast(cast(incrementvalue as character varying) || ' months' as interval) …
Run Code Online (Sandbox Code Playgroud)

postgresql plpgsql

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

CRC32功能与PL/pgSQL

如何计算32位循环冗余校验(CRC-32)作为PostgreSQL中的函数,与MySQL一样

postgresql crc32 crc plpgsql

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

指定事务级别的Postgres dblink存储过程调用

我想以这种方式在PL / pgSQL存储过程中使用dblink:

PERFORM dblink_exec('myconn', 'BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE');
PERFORM dblink_exec('myconn', 'SELECT another_stored_procedure()');
PERFORM dblink_exec('myconn', 'COMMIT');
Run Code Online (Sandbox Code Playgroud)

但是在运行时出现错误:

ERROR:  statement returning results not allowed
CONTEXT:  SQL statement "SELECT dblink_exec('myconn', 'select another_stored_procedure()')"
Run Code Online (Sandbox Code Playgroud)

因此执行失败,尽管我尝试以其他方式获得所需的结果。

更新1:

我知道Postgresql中的存储过程是事务性的。我将dblink用于自治事务功能以在同一服务器上使用它。

问题是服务器上的默认事务级别是“读已提交”,但有时我需要从另一个级别开始事务,例如“可序列化”。

因此,我需要在具有明确事务级别指定的自主事务中执行存储过程。

据我所知dblink允许这样做,但是我找不到适合我情况的有关dblink或dblink_exec函数的任何有用信息。

postgresql dblink plpgsql

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