我需要一个 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) 我正在将一些简单的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)
有什么建议?
我们有一个用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) 我有以下触发功能:
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的值在表中持久化时始终是大写的.但似乎没有任何事情发生.有任何想法吗?
下面的代码正在给出错误,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中有一个过程:
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();
我在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) 我正在尝试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) 如何计算32位循环冗余校验(CRC-32)作为PostgreSQL中的函数,与MySQL一样?
我想以这种方式在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函数的任何有用信息。