首页 > 其他分享 >KingbaseES V8R6 Deallocate 语句使用说明

KingbaseES V8R6 Deallocate 语句使用说明

时间:2023-05-09 19:48:05浏览次数:35  
标签:语句 V8R6 prepare test TEST Deallocate KingbaseES select name

用途

DEALLOCATE被用来释放一个之前PREPARE好的SQL语句。如果不显式地释放一个PREPARE语句,那么会话结束时会释放它。
prepare语句类似oracle的绑定变量

绑定过程:
1)PREPARE,准备绑定变量SQL
2)EXECUTE,绑定并执行
3)DEALLOCATE,释放绑定变量

测试

1.只有本地会话可以看的prepare语句

创建测试表:
test=# create table test_c (id int4, name character varying(12));
CREATE TABLE


test=# insert into test_c values (1,'a'),(2,'b'),(3,'c');
INSERT 0 3


TEST=#  select * from test_c ;
 id | name
----+------
  1 | a
  2 | b
  3 | c
(3 rows)
备注:创建完表后,接着开启新会话,顺序按以下操作进行:
test=# PREPARE select_1 (character varying) AS
select * From test_c where name=$1; 
PREPARE


TEST=# EXECUTE select_1('a');
 id | name
----+------
  1 | a
(1 row)


在本地会话中可以查询到prepare语句:
TEST=# select * from sys_prepared_statements;
   name   |                statement                |         prepare_time          | parameter_types | from_sql
----------+-----------------------------------------+-------------------------------+-----------------+----------
 select_1 | PREPARE select_1 (character varying) AS+| 2023-04-20 10:22:16.063035+08 | {varchar}       | t
          | select * From test_c where name=$1;     |                               |                 |
(1 row)


这时,切换到之前创建表的会话查看此视图没有任何信息:
TEST=#  select * from sys_prepared_statements;
 name | statement | prepare_time | parameter_types | from_sql
------+-----------+--------------+-----------------+----------
(0 rows)


同样,执行的时候也会报错:
TEST=# EXECUTE select_1('a');
ERROR:  prepared statement "select_1" does not exist
TEST=#

说明prepare语句只对当前会话可见并生效,采用了会话隔离机制。

2.DDL更改表结构后,prepare语句无法继续使用

依然在创建prepare语句的会话中执行:
TEST=#  alter table test_c alter column name type character varying;
ALTER TABLE

由于发生了DDL语句后,原来创建的prepare语句失效:
TEST=# EXECUTE select_1('a');
ERROR:  cached plan must not change result type
TEST=#

但是仍然可以查看prepare语句:
TEST=#  select * from sys_prepared_statements;
   name   |                statement                |         prepare_time          | parameter_types | from_sql
----------+-----------------------------------------+-------------------------------+-----------------+----------
 select_1 | PREPARE select_1 (character varying) AS+| 2023-04-20 10:22:16.063035+08 | {varchar}       | t
          | select * From test_c where name=$1;     |                               |                 |
(1 row)

解决方法

1.释放prepare语句
deallocate select_1;


这时,视图中已经查看不到,如需再次使用prepare语句需要重新创建:
TEST=# select * from sys_prepared_statements;
 name | statement | prepare_time | parameter_types | from_sql
------+-----------+--------------+-----------------+----------
(0 rows)

执行语句已经提示不存在:
TEST=# EXECUTE select_1('a');
ERROR:  prepared statement "select_1" does not exist

2.断开连接会话,重建连接后,已经查不到prepare语句,因为它是会话级别的,如需使用需要重建prepare语句:
TEST=# PREPARE select_1 (character varying) AS
TEST-# select * From test_c where name=$1;
PREPARE

TEST=# EXECUTE select_1('a');
 id | name
----+------
  1 | a
(1 row)

TEST=#
TEST=# select * from sys_prepared_statements;
   name   |                statement                |         prepare_time          | parameter_types | from_sql
----------+-----------------------------------------+-------------------------------+-----------------+----------
 select_1 | PREPARE select_1 (character varying) AS+| 2023-04-20 11:30:56.040584+08 | {varchar}       | t
          | select * From test_c where name=$1;     |                               |                 |
(1 row)


TEST=# alter table test_c alter column name type varchar2(5);
ALTER TABLE
TEST=# EXECUTE select_1('a');
ERROR:  cached plan must not change result type
TEST=#
TEST=# \q

[kingbase7@localhost ~]$ ksql -USYSTEM TEST
ksql (V8.0)
Type "help" for help.
断开重建连接后,之前prepare语句已无法从视图中查到:
TEST=# select * from sys_prepared_statements;
 name | statement | prepare_time | parameter_types | from_sql
------+-----------+--------------+-----------------+----------
(0 rows)

总结

1.PREPARE语句在会话结束后,在视图sys_prepared_statements中会自动消失。
2.同一个prepared语句不能在多个并发会话中共有。
3.对表结构ddl修改后,创建好的对应prepare语句无法再次使用,需要使用deallocate命令取消 prepare语句,然后重新生成prepare语句;或者重建连接会话后,重新创建prepare语句。
备注:DEALLOCATE语句只对本地单个会话生效,如果是应用程序批量报错,这个方法显然不合适。

标签:语句,V8R6,prepare,test,TEST,Deallocate,KingbaseES,select,name
From: https://www.cnblogs.com/kingbase/p/17370137.html

相关文章

  • KingbaseES V8R6 最老事务阻止vacuum freeze
    前言最近生产环境发生几次由于长事务导致表、库年龄没法回收的情况。我们要规避这种情况的发生,不要等发生了再去强制中断会话连接。当数据库中存在最老事务版本xmin,那么早于他的快照可以被标记为frozen,如果在最老事务之后产生的快照版本,不被标记为frozen。这个最老事务通常被认......
  • KingbaseES V8R6 sys_squeeze 使用
    sys_squeeze介绍sys_squeeze是KingbaseES的一个扩展插件,该组件将提供人工调用命令实现对表deadtuple的清理工作。该组件在清理表空间的过程中,不会全程加排他锁,能保证业务运行期间尽可能不影响对目标表的访问。而vacuumfull也可实现死亡元组占用空间释放,但是缺点是会锁表,阻止业......
  • KingbaseES V8R6备份恢复系列之 -- system-Id不匹配备份故障
    ​KingbaseESV8R6备份恢复案例之---system-Id不匹配备份故障案例说明:在KingbaseESV8R6执行备份时,在sys_log日志中出现system-id不一致的故障并伴随有归档失败,故障如下图所示:适用版本:KingbaseESV8R6一、问题分析1、查看当前数据库system-id可以通过sys_controldata-D......
  • KingbaseES数据库运维案例之---permission denied to create "sys_catalog.xxx"
    ​KingbaseES数据库运维案例之---permissiondeniedtocreate"sys_catalog.bdsj_bdgl_test"案例说明:在KingbaseES数据库kingbase.conf修改了search_path='"$user",sys_catalog'后,在数据库下执行创建对象操作,出现以下故障。适用版本:KingbaseESV8R6一、问题现象如下所示......
  • KingbaseES V8R6运维案例之---MySQL和KingbaseES字符串排序规则对比
    案例说明:相同数据排序后查询,在MySQL和KingbaseES下得到的排序顺序不一致,本案例从MySQL和KingbaseES的排序规则分析,两种数据库排序的异同点。适用版本:KingbaseESV8R6、MySQL8.0一、MySQL的排序规则1、排序规则(collation)排序规则是依赖于字符集,字符集是用来定义MySQL存储不......
  • KingbaseES 实现 MySQL 函数 last_insert_id
    用户从mysql迁移到金仓数据库过程中,应用中使用了mysql函数last_insert_id()来获取最近insert的那行记录的自增字段值。mysql文档中关于函数的说明和例子:LAST_INSERT_ID()如果没有参数,则LAST_INSERT_ID()返回一个BIGINTUNSIGNED(64位)值,表示AUTO_INCREMENT由于最近执行的INSERT语......
  • KingbaseES 语句like前匹配如何使用索引
    前言有现场同事反馈sql语句like使用后缀通配符%不走索引。至于执行计划没走索引的原因与KingbaseES数据库中的排序规则相关。测试测试环境:KingbaseESV8R6C7test=#\dtestTable"public.test"Column|Type|Collation|Nullable|Default--......
  • KingbaseES V8R3 集群运维系列 -- sync_flag参数配置
    ​案例说明:在KingbaseESV8R3集群一主二备的架构中,配置了流复制为同步(sync)模式,但是集群启动后,流复制状态中显示备库是async模式(备库和主库数据已经同步),从备库的recovery.log日志也可以看到,备库启动后被复制模式设置为async模式。如下图备库recovery.log:适用版本:KingbaseES......
  • KingbaseES 分区表修改字段类型
    KingbaseES普通表修改表结构请参考:KingbaseES变更表结构表重写问题数据类型转换重写与不重写:varchar(x)转换到varchar(y)当y>=x,不需要重写。numeric(x,z)转换到numeric(y,z)当y>=x,或者不指定精度类型,不需要重写。numeric(x,c)转换到numeric(y,z)当y=xc>z,当numer......
  • KingbaseES 使用sys_bulkload远程导入
    前言sys_bulkload常见场景是本地导入数据,也可以在远程运行sys_bulkload,对数据库上的CSV文件进行导入。远程导入数据时候需要注意,csv文件和ctl文件所在服务器。以下举例展示整个远程导入的过程。测试环境V8R6C7演示目的将数据从IP2所在服务器导入到IP3远程服务器上。IP3......