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

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

环境

系统平台: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,确定对象是否存在,是新创建还是更改对象的属性。

相关推荐
qq_172805594 分钟前
Oracle 数据库部署与实施
oracle
hogenlaw11 分钟前
Oracle从入门到放弃
数据库·oracle
卡兰芙的微笑25 分钟前
get_property --Cmakelist之中
前端·数据库·编辑器
Z_W_H_36 分钟前
【PostgreSQL】安装及使用(Navicat/Arcgis),连接(C#)
数据库·postgresql
豆姐姐43 分钟前
金九银十,分享一波用例设计、数据库、编程笔试题!
自动化测试·数据库·测试用例·软件测试面试
计算机程序设计开发1 小时前
计算机毕业设计公交站点线路查询网站登录注册搜索站点线路车次/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
数据库·vue.js·spring boot·课程设计·计算机毕业设计
evanYang_1 小时前
Spring Boot配置文件敏感信息加密
spring boot·后端·oracle
waterHBO1 小时前
ER 图 Entity-Relationship (ER) diagram 101 电子商城 数据库设计
数据库
青云交2 小时前
大数据新视界 --大数据大厂之Kubernetes与大数据:容器化部署的最佳实践
数据库·kubernetes·容器编排·资源管理·大数据处理·扩展性、故障恢复·存储持久化·监控、日志管理、性能提升
liangbm32 小时前
MATLAB系列07:输入/输入函数
开发语言·数据库·笔记·matlab·函数·自定义函数·matlab函数