我有一个List<Guid>(也用普通数组尝试过),我想在查询中使用它。Dapper 生成 SQL 并正确替换编号参数的参数。但是,PG 抱怨 list 参数的语法。没有提供进一步的细节。复制生成的 SQL 并用实际值替换数字(将括号添加到列表参数),查询有效。
这是生成的 SQL 中的违规子句:
WHERE (
names.tenant = $1
AND scan_results.tenant = $1
AND scan_results.scan IN $2
)
Run Code Online (Sandbox Code Playgroud)
Dapper 的原始语句字符串是这样的:
WHERE (
file_names.tenant = @tenantId
AND scan_results.tenant = @tenantId
AND scan_results.scan IN @validScans
)
Run Code Online (Sandbox Code Playgroud)
查询是这样执行的con.Query:
con.Query(stmt, new
{
tenantId = tenant.Id,
validScans = tenant.LatestScans // .ToArray()
});
Run Code Online (Sandbox Code Playgroud)
确切的 Postgres 错误是:
ERROR: syntax error at or near "$2" at character ...
Run Code Online (Sandbox Code Playgroud) 我是 postgres 的新手,但我试图在 Postgres 11 中调用一个过程(新的“过程”而不是“函数”),从 java 作为 spring SimpleJDBCCall 调用(使用 Postgresql-42.2.5 jdbc 驱动程序)。但是,当我执行该过程时,遇到以下异常:
org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; 错误的 SQL 语法 [{call pa_test_schema.pr_dosomething(?)}]; 嵌套异常是 org.postgresql.util.PSQLException:错误:pa_test_schema.pr_dosomething(bigint) 是一个过程提示:要调用一个过程,请使用 CALL。位置:15 在 org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:101) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 在 org.springframework.jdbc AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:
我的程序代码:
CREATE PROCEDURE pa_test_schema.pr_DoSomething
( P_input_ID IN inputs.input_ID%TYPE
) AS $$
BEGIN
-- do something
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我的Java代码:
SimpleJdbcCallOperations pr_DoSomething = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName("pa_test_schema")
.withProcedureName("pr_DoSomething");
Map<String, Object> inputs = Maps.newHashMap();
inputs.put("p_input_id", 123456);
pr_DoSomething.execute(inputs);
Run Code Online (Sandbox Code Playgroud)
当我逐步执行代码时,我可以看到驱动程序正在将可调用语句的 sql 修改为调用 postgres 函数所需的语法:
select * from pa_test_schema.pr_dosomething(?) 作为结果
这是执行此转换的驱动程序中的方法: …
我需要将PostgreSQL从9.5版升级到11版。之后,当我从“ requirements.txt”文件重新创建virtualEnv时,在安装psycopg2软件包时开始出现以下错误:
Collecting psycopg2 == 2.6.2 (from -r conf/requirements.txt (line 50))
Using cached https://files.pythonhosted.org/packages/7b/a8/dc2d50a6f37c157459cd18bab381c8e6134b9381b50fbe969997b2ae7dbc/psycopg2-2.6.2.tar.gz
Complete output from command python setup.py egg_info:
running egg_info
creating pip-egg-info/psycopg2.egg-info
writing pip-egg-info/psycopg2.egg-info/PKG-INFO
writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt
writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt
writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt'
Error: could not determine PostgreSQL version from '11 .1 '
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-0Q7bhV/psycopg2/
Run Code Online (Sandbox Code Playgroud) 我引用https://www.postgresql.org/docs/11/sql-createindex.html关于INCLUDE条款:
在将非键列添加到索引时保守一点是明智的,尤其是宽列。如果索引元组超过索引类型允许的最大大小,数据插入将失败。在任何情况下,非键列都会从索引的表中复制数据并使索引的大小膨胀,从而可能减慢搜索速度。
我想知道这index tuple max size对于可能插入失败的 btree 索引是什么。
用例:我正在考虑INCLUDE将 json 列(<1000 个字符)添加到唯一索引。
当我尝试使用psql执行时,以下代码中出现“ AS整数或附近的错误”。
CREATE SEQUENCE public.auth_group_id_seq
AS integer
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
Run Code Online (Sandbox Code Playgroud)
上面的sql语句来自本地计算机postgres版本11的备份文件,并在EC2 postgres版本9.3中执行。我是postgres的新手,并且不知道,因为sql仅由postgres生成,因此它应该与psql一起使用。提前致谢。
我在 Postgres 的下表中使用了Java 8 和 Postgres-11以及 Spring Boot 2.1.6.RELEASE。我已经解决了这个问题和这个问题,但我真的想使用 Java 8 Date API 而不是 Java 7。
CREATE TABLE note(
note_id serial PRIMARY KEY,
message varchar(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)
我创建了如下所示的模型类,但与我需要的不匹配。
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Entity
public class Note extends AuditEnabledEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "note_id")
private int noteId;
@Column(name = "message")
private String message;
@Column(name = "created_at")
private LocalDateTime createdAt;
}
Run Code Online (Sandbox Code Playgroud) 我想在事务中运行以下代码块,以便如果任何一个失败,sql statements整个事务都会中止。如果我按原样运行以下块,它是在事务中运行还是需要在内部运行BEGIN; ... COMMIT;
DO $$
DECLARE
readonly_exists int;
BEGIN
SELECT COUNT(*) INTO readonly_exists FROM information_schema.enabled_roles
WHERE role_name = 'readonly';
IF readonly_exists = 0 THEN
<SQL STATEMENT 1>
<SQL STATEMENT 2>
<SQL STATEMENT 3>
ELSE
RAISE EXCEPTION 'readonly role already exists';
END IF;
END$$;
Run Code Online (Sandbox Code Playgroud) 我将 PGsql 函数转换为程序 (v11) 以进行交易。但是在从 Java 代码调用该过程时,Java 代码抛出以下异常:
2021-01-10 21:52:56,604 WARN [ForkJoinPool.commonPool-worker-1] o.h.e.j.spi.SqlExceptionHelper(144) - SQL Error: 0, SQLState: 42809
2021-01-10 21:52:56,605 ERROR [ForkJoinPool.commonPool-worker-1] o.h.e.j.spi.SqlExceptionHelper(146) - ERROR: some_procedure_name(character varying, character varying) is a procedure
Hint: To call a procedure, use CALL.
Position: 15
Run Code Online (Sandbox Code Playgroud)
我正在使用 Spring Data JPA's @Procedure(name = "some_procedure_name"),并且这个过程被声明为@NamedStoredProcedure实体类。问题是,这个注解仍然像 PG 版本 11 之前那样将其作为 Function 方式调用。
任何帮助。
java postgresql stored-procedures spring-data-jpa postgresql-11
我的表格有两列cola和colb.
我想使用存储过程从表中选择列。
注意:由于返回类型,我不想使用函数。
尝试:
CREATE OR REPLACE PROCEDURE public.sptest()
LANGUAGE sql
AS $BODY$
select cola from test;
$BODY$;
Run Code Online (Sandbox Code Playgroud)
调用程序:
call sptest()
Run Code Online (Sandbox Code Playgroud)
输出:
数据输出中没有任何内容。
消息窗口显示:
CALL
Query returned successfully in 147 msec.
Run Code Online (Sandbox Code Playgroud) 我们想要将 postgres 升级到版本 12,想知道我们是否有任何语法更改会影响在 postgres 版本 11 上编写的查询。
我目前正在检查使用 - 但没有发现任何会改变查询的差异。
https://www.postgresql.org/about/featurematrix/
任何帮助表示赞赏。
我正在尝试为 pgsql 编写一个触发器来保留特定表上的插入、更新和删除的日志。
我在创建触发器时在位置 171 上收到错误,但我真的不知道为什么。
日志表
+----------+-----------+---------------------------+
|table_name|column_name|data_type |
+----------+-----------+---------------------------+
|logs |id |bigint |
|logs |action |smallint |
|logs |table |character varying |
|logs |primary |bigint |
|logs |log |json |
|logs |processed |boolean |
|logs |created_at |timestamp without time zone|
|logs |updated_at |timestamp without time zone|
+----------+-----------+---------------------------+
Run Code Online (Sandbox Code Playgroud)
功能和触发
CREATE OR REPLACE FUNCTION insert_log (INT, VARCHAR, INT, VARCHAR) RETURNS INT AS $$
BEGIN
INSERT INTO public.logs ("action", "table", "primary", "log")
VALUES ($1, $2, $3, $4)
RETURNING id;
END
$$ …Run Code Online (Sandbox Code Playgroud) postgresql-11 ×11
postgresql ×9
java ×2
c# ×1
dapper ×1
jdbc ×1
jpa-2.2 ×1
pip ×1
psycopg2 ×1
python-2.7 ×1
spring-boot ×1
spring-jdbc ×1
sql ×1
sql-insert ×1
triggers ×1
virtualenv ×1