瀚高数据库中,对象不存在问题的处理思路及解决方案

**瀚高数据库
目录
环境
文档用途
详细信息

环境

系统平台:N/A

版本:6.0,4.5
文档用途

使用瀚高数据库可能会遇到应用系统中报对象等不存在的问题,可参照本文处理。

详细信息
1、常见报错信息展示:

msgid "table "%s" does not exist"

msgstr "表 "%s" 不存在"

msgid "function "%s" does not exist"

msgstr "函数 "%s" 不存在"

msgid "No function matches the given name and argument types. You might need to add explicit type casts."

msgstr "没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换."

msgid "operator does not exist: %s"

msgstr "操作符不存在: %s"

以上报错信息可以分为两类:

第一类:表、索引、序列、视图、函数等对象

1)表、索引、序列、视图等在系统表pg_class中可以查到的;

2)函数(存储过程)在瀚高数据库中,重载现象很多,也就是不同的参数类型或个数可以使用同名函数;在进行DDL、DQL等操作时一定要根据参数类型匹配到对应的同名函数,否则出错;

第二类:类型转换和操作符,基本归结为类型不匹配问题;有时可以使用这两种方式解决同一个问题。

2、当遇到第二类问题时,不建议直接去创建隐式转换或操作符去解决问题;

2.1 建议先从自己的代码与数据库类型进行排查,兼顾整个项目;确定代码实际要用的字段类型、数据库的字段类型,尽可能的修改成一致的数据库类型去解决问题;如果是SQL中的,建议在SQL中添加转换或使用双冒号转换;

2.2 以上方案解决不了的再创建隐式转换或操作符处理;这个问题可参照如下文章解决,本文不再详述,如下:

016958304 类型转换处理思路(APP)

018104201 瀚高数据库中java代码类型与bit对应(APP)

012800904 类型转换处理常用示例(APP)

3、当遇到第一种问题时,如下解决:

3.1 表、索引、序列、视图等在系统表pg_class中可以查到的,如下查询:

cpp 复制代码
select pc."oid", pc.relname, pn.nspname as "schema", pa.rolname "owner"

from pg_class pc 

join pg_namespace pn on pn."oid" =pc.relnamespace 

join pg_authid pa on pa.oid = pc.relowner 

where relname = '';

函数(存储过程)如下查询:

cpp 复制代码
select pp."oid", pp.proname, pn.nspname "schema", pa.rolname "owner", pg_get_functiondef(pp."oid") def 

from pg_proc pp

join pg_namespace pn on pp.pronamespace = pn."oid" 

join pg_authid pa on pp.proowner = pa."oid" 

where pp.proname = '';

查出对象的所属用户,模式等;查找对象是否存在;若不存在,那就是确实未创建该对象或连接的数据库不对;注意函数还要匹配参数个数和类型。

以上sql需要在对应的database执行。

改正后,再次测试。

3.2 jdbc等类似url未加currentSchema参数,conf(data目录下的postgresql.conf或postgresql.auto.conf)配置文件中的search_path参数未添加对象所属的schema,search_path默认如下:

cpp 复制代码
  search_path = '"$user", public'

如果对象不在上述schema中,则需要添加上,否则报错,如下添加模式sch1:

cpp 复制代码
  search_path = '"$user", public, sch1'

3.3 jdbc等类似url添加了currentSchema参数,但是值不包含对象所属的schema,也会报错,添加上即可解决,如下:

cpp 复制代码
  jdbc:postgresql://ip:port/database?currentSchema=sch1

如果查询的对象在sch2中,这里只添加了sch1,就会报错,改正如下:

cpp 复制代码
  jdbc:postgresql://ip:port/database?currentSchema =sch1,sch2

需要注意,添加了currentSchema参数,相当于把当前的会话的search_path参数值覆盖为currentSchema的值,因此如果创建的对象在public下,也需要把public添加上。

4、当遇到第二种问题时,也可以查询系统表pg_operator和pg_cast,确定对象是否存在,是新创建还是更改对象的属性。

相关推荐
寒月霜华7 小时前
JavaWeb后端-MySQL
数据库·mysql
Fuly10247 小时前
大模型的记忆与管理及长期记忆实现方式
数据库·人工智能·rag
weixin_307779137 小时前
C#程序实现将Teradata的存储过程转换为Azure Synapse Dedicated SQL pool的存储过程
数据库·数据分析·c#·云计算·azure
vortex58 小时前
在 Windows 系统中安装 Oracle、SQL Server(MSSQL)和 MySQL
windows·oracle·sqlserver
折翼的恶魔8 小时前
SQL 189 统计有未完成状态的试卷的未完成数和未完成率
数据库·sql
yangmf20408 小时前
如何使用 INFINI Gateway 增量迁移 ES 数据
大数据·数据库·elasticsearch·搜索引擎·gateway
运维李哥不背锅9 小时前
Ansible 的条件语句与循环详解
数据库·ansible
曾凡宇先生10 小时前
OpenEuler中mysql这是在执行 MySQL 密码重置操作时出现的 “找不到mysqld_safe命令” 的错误场景。
数据库·mysql
方二华10 小时前
6 mysql源码中的查询逻辑
数据库·mysql
意疏11 小时前
LibreTV无广告观影实测:聚合全网资源,远程访问家庭影院新方案!
数据库