用途

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语句只对本地单个会话生效,如果是应用程序批量报错,这个方法显然不合适。

KingbaseES V8R6 Deallocate 语句使用说明的更多相关文章

  1. KingbaseES V8R6备份恢复案例之--删除test数据库后sys_backup.sh备份

    案例说明: KingbaseES V8R6通过sys_backup.sh执行物理备份,默认sys_backup.sh执行备份初始化时,需要连接test数据库进行身份的认证:在一些生产环境为了安全需求, ...

  2. KingbaseES V8R6集群维护案例之---停用集群node_export进程

    案例说明: 在KingbaseES V8R6集群启动时,会启动node_exporter进程,此进程主要用于向kmonitor监控服务输出节点状态信息.在系统安全漏洞扫描中,提示出现以下安全漏洞: 对 ...

  3. KingbaseES V8R6集群维护案例之---将securecmdd通讯改为ssh案例

    案例说明: 在KingbaseES V8R6的后期版本中,为了解决有的主机之间不允许root用户ssh登录的问题,使用了securecmdd作为集群部署分发和通讯的服务,有生产环境通过漏洞扫描,在88 ...

  4. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(异机复制)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

  5. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(同一主机)

    案例说明: 目前KingbaseES V8R6的Windows版本不支持数据库sys_rman的物理备份,可以考虑通过建立主备流复制实现数据库的异机物理备份.本案例详细介绍了,在Windows环境下建 ...

  6. KingbaseES V8R6兼容Oracle的exp-imp导出导入工具使用

    说明: KingbaseES V8R6版本中的兼容Oracle的exp-imp导入导出工具,支持完全模式.用户模式和表模式的导出功能. 本次案例数据库版本: test=# select version ...

  7. KingbaseES V8R6集群管理运维案例之---repmgr standby switchover故障

    案例说明: 在KingbaseES V8R6集群备库执行"repmgr standby switchover"时,切换失败,并且在执行过程中,伴随着"repmr stan ...

  8. KingbaseES V8R6备份恢复案例之---同一数据库创建不同stanza备份

    案例说明: 在生产环境,有的应用需要调用数据库的sys_rman做备份,为了区分数据库自身的sys_rman备份和应用的备份,可以使用不同的stanza name创建备份.本案例介绍了,如何在King ...

  9. kingbaseES V8R6集群备份恢复案例之---备库作为repo主机执行物理备份

    ​ 案例说明: 此案例是在KingbaseES V8R6集群环境下,当主库磁盘空间不足时,执行sys_rman备份,将集群的备库节点作为repo主机,执行备份,并将备份存储在备库的磁盘空间. 集群架构 ...

  10. KingbaseES V8R6备份恢复案例之---手工清理冗余历史备份

    案例说明: 对于KingbaseES V8R6的通过sys_rman执行的物理历史备份,可以在执行备份时,备份的保留(retention)策略自动清理.不能通过手工删除备份,可以通过expire参数手 ...

随机推荐

  1. journalctl命令

    journalctl命令 journalctl命令是Systemd日志系统的一个命令,主要用途是用来查看通过Systemd日志系统记录的日志,在Systemd出现之前,Linux系统及各应用的日志都是 ...

  2. 如何编写一个 PowerShell 脚本

    PowerShell 脚本的后缀是 .ps1 前提: ps1 脚本可以帮忙我们快速修改文件内容,还不需要调用文件的底层 api,方便快捷 在编写 CMakeLists 时发现,项目不能够很好的使用 v ...

  3. 初级算法 - C++反转链表

    顾名思义, 就是将链表的所有结点反转. 解释见:[剑指offer]反转链表,C++实现(链表) 代码: #include <iostream> struct NodeList { int ...

  4. LayUI框架应用常见问题

    https://layui.itze.cn/index.html LayUI框架文档主页 获取URL参数 诸如表格中的"编辑","详情"工具按钮,需要在弹出层页 ...

  5. Vulnhub内网渗透DC-6靶场通关

    个人博客 xzajyjs.cn IP DC-6: 192.168.168.4 Kali: 192.168.168.5 信息搜集 arp-scan -l # nmap -sn 192.168.168.0 ...

  6. yum源配置脚本

    # yum源配置脚本 #!/bin/bash mkdir /etc/yum.repos.d/backup mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bac ...

  7. linux基本命令--day02

    目录树架构示意图 以下是对这些目录的解释: /bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令. /boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以 ...

  8. 制作docker方式执行Gitlab Runner所需要的镜像

    背景知识 启动Gitlab Runner时,使用Gitlab提供的官方镜像gitlab/gitlab-runner:latest即可. Runner以容器的方式启动以后,根据前文我们注册到Gitlab ...

  9. 【Azure Redis 缓存】Redis Geo-replication(异地复制)的问题 

    问题描述 在Azure官网中,已列出了一系列的常规问题:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-how-to-geo-repli ...

  10. element_ui 知识点整理

    第一章复习,树型组件数据填充:数据组件需要的数据绑定到:data   但是具体那些字绑生成标签需要在定义一人:props ="这儿绑定对象" 对象中label  children ...