我花了一段时间才弄清楚,几周前我在外语维基上找到了答案,这非常有帮助,所以我想我会分享.
鉴于此类型:
-- Just for testing purposes:
CREATE TYPE testType as (name text)
Run Code Online (Sandbox Code Playgroud)
我可以使用此函数动态获取字段的值:
CREATE OR REPLACE FUNCTION get_field(object anyelement, field text) RETURNS text as
$BODY$
DECLARE
value text;
BEGIN
EXECUTE 'SELECT $1."' || field || '"'
USING object
INTO value;
return value;
END;
$BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
呼叫get_field('(david)'::testType, 'name')按预期工作返回"大卫".
但是如何在复合类型中设置字段的值?我试过这些功能:
CREATE OR REPLACE FUNCTION set_field_try1(object anyelement, field text, value text)
RETURNS anyelement
as
$BODY$
DECLARE
value text;
BEGIN
EXECUTE '$1."' || field || '" := $2'
USING object, value; …Run Code Online (Sandbox Code Playgroud) 这可能听起来像一个非常愚蠢的问题,但我如何声明一个用于PostgreSQL 9.3查询的变量?
CREATE or replace FUNCTION public.test()
returns int4
AS
$BODY$
DECLARE
cod_process bigint :=30001;
cod_instance bigint ;
utc_log timestamp without time zone := localtimestamp;
cod_log_type varchar(100) :='information ';
txt_log_text varchar(100):= 'start process';
txt_log varchar(100):= txt_log_text||'_'||cod_process;
set cod_instance= select max(cod_instance) as cod_instance from public.instance where public.instance.cod_process=cod_process;
BEGIN
INSERT INTO public.log (cod_process, cod_instance, utc_log,cod_log_type,txt_log)
VALUES (cod_process, cod_instance, utc_log,cod_log_type,txt_log );
RETURN 11;
END;
$BODY$ LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)ERROR: type "cod_instance" does not exist SQL state: 42704 Character: 383
MSSQL有一个很棒的功能叫做Table Valued Parameters.它允许您将自定义数据表传递给存储过程和函数.
我想知道PostgreSQL中的等价物是什么,如果存在,使用JDBC?我知道将数组作为函数参数传递的选项,但这似乎仅限于PostgreSQL数据类型.
考虑以下PL/pgSQL代码:
CREATE TYPE number_with_time AS(
_num float,
_date timestamp
);
Run Code Online (Sandbox Code Playgroud)
和这个函数头:
CREATE OR REPLACE FUNCTION myfunc(arr number_with_time[])
Run Code Online (Sandbox Code Playgroud)
任何人都可以使用JDBC驱动程序发布Java代码,使用用户定义数据类型的数组调用该函数吗?
我想在会话/事务中记录用户的id,使用SET,所以我以后可以在触发器函数中使用它来访问它current_setting.基本上,我正在尝试从之前发布的非常相似的票证中选择n2 ,区别在于我正在使用PG 10.1.
我一直在尝试3种设置变量的方法:
SET local myvars.user_id = 4,从而在交易中在本地设置;SET myvars.user_id = 4从而将其设置在会话中;SELECT set_config('myvars.user_id', '4', false),取决于最后一个参数,将是前两个选项的快捷方式.它们都不能在触发器中使用,触发器NULL在获取变量时接收current_setting.这是我设计的用于对其进行故障排除的脚本(可以很容易地与postgres docker镜像一起使用):
database=$POSTGRES_DB
user=$POSTGRES_USER
[ -z "$user" ] && user="postgres"
psql -v ON_ERROR_STOP=1 --username "$user" $database <<-EOSQL
DROP TRIGGER IF EXISTS add_transition1 ON houses;
CREATE TABLE IF NOT EXISTS houses (
id SERIAL NOT NULL,
name VARCHAR(80),
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT now(),
PRIMARY KEY(id)
);
CREATE …Run Code Online (Sandbox Code Playgroud) 我只是尝试创建我的第一个plpgsql函数.执行脚本时,我明白了
错误:语言"'plpgsql'"不存在
然后我运行命令CREATE LANGUAGE plpgsql; 这显示以下错误:
错误:语言"plpgsql"已经存在
命令正在同一个数据库上运行.
问候
彼得
我们仍然是Postgres的新手,来自Microsoft Sql Server.
我们现在想要编写一些存储过程.好吧,在努力获得比hello world在pl/pgsql中工作更复杂的东西之后,我们认为如果我们要学习一种新语言我们也可以学习Python更好,因为我们在大约15分钟内得到相同的查询(注意,我们都不知道python).
所以与pl/psql相比,我有一些问题.
此外,我们的存储过程使用非常轻.现在我们只有4,但我们仍然试图从Sql Server特定的语法转换一些代码(例如变量,不能在存储过程之外的Postgres中使用)
我们有一个应用程序,它将根据用户请求从表中删除一行.我无法更改应用程序代码.但是,我想根据要删除的行的信息,使用来自其他几个表的信息将一行插入另一个表(有点像日志日志).
我如何在PostgreSQL中实现这一目标?
我有一个Postgres函数返回一个表:
CREATE OR REPLACE FUNCTION testFunction() RETURNS TABLE(a int, b int) AS
$BODY$
DECLARE a int DEFAULT 0;
DECLARE b int DEFAULT 0;
BEGIN
CREATE TABLE tempTable AS SELECT a, b;
RETURN QUERY SELECT * FROM tempTable;
DROP TABLE tempTable;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
此函数不以行和列形式返回数据.相反,它返回数据为:
(0,0)
Run Code Online (Sandbox Code Playgroud)
这导致Coldfusion cfquery块在提取数据时出现问题.从此函数返回表时,如何获取行和列中的数据?换句话说:为什么PL/pgSQL函数不会将数据作为列返回?
我有一个包含JSON和计划文本的文本列.我想将其转换为JSON,然后选择一个特定的属性.例如:
user_data
_________
{"user": {"name": "jim"}}
{"user": {"name": "sally"}}
some random data string
Run Code Online (Sandbox Code Playgroud)
我试过了:
select user_data::json#>'{user,name}' from users
Run Code Online (Sandbox Code Playgroud)
我明白了:
ERROR: invalid input syntax for type json
DETAIL: Token "some" is invalid.
CONTEXT: JSON user_data, line 1: some...
Run Code Online (Sandbox Code Playgroud)
有可能阻止这种情况吗?