找回密码
 立即注册

QQ登录

只需一步,快速开始

bytcib
金牌服务用户   /  发表于:2020-5-19 10:15  /   查看:2559  /  回复:3
1金币
现有活字格项目,用户、部门、角色等使用活字格内嵌的sqlite数据库,实现数据使用PostgreSQL数据库,数据库引擎版本为12

在外部的PostgreSQL数据库中,有一个主要的数据表,其中有一个字段的字段类型是 json 类型,其中存储葡萄城 spreadJS 处理的 json 数据。

id,int
info,json
data_type,int
b_year,varchar

通过活字格的 ODBC ,是可以处理PostgreSQL数据库的数据的,但是只能实现整体更新,即将指定行的数据全部更新。现在要实现只更新 json 中某个键值。

在PostgreSQL中,可以通过jsonb_set函数实现,如:

UPDATE testjson set info = jsonb_set((SELECT info from testjson where id = 4)::jsonb, '{version}', '"13.1.0"', TRUE) where id = 4

再如:

UPDATE testjson set info = jsonb_set((SELECT info  from testjson where id = 4)::jsonb, '{sheets,预算模型,data,dataTable,0,5,value}', '"整体收入"'::jsonb, false) where id = 4

这两个语句在 navicat 中执行正确,执行后的数据再由 spreadJS 处理也正确。

现在的问题是,我把 spreadJS 嵌入到了活字格中,我需要用活字格来执行这行SQL语句,那么问题来了,我该怎么做?

我现在能找到的办法是调用活字格的一个内置的命令:执行存储过程。我就还要写一个PostgreSQL的存储过程,来执行这一行语句。

活字格能不能通过命令直接执行一条SQL语句?比如下面这句:

UPDATE testjson set info = jsonb_set((SELECT info  from testjson where id = 4)::jsonb, '{sheets,预算模型,data,dataTable,0,5,value}', '"整体收入"'::jsonb, false) where id = 4

3 个回复

倒序浏览
1818himis悬赏达人认证 活字格认证
高级会员   /  发表于:2020-5-19 14:28:47
沙发
顶一下
我也觉得内置命令:执行存储过程可以进化一下,改为       执行SQL语句:
整条SQL语句定义好  条件输入输出参数,关联到表格取值
这样兼顾了存储过程,也更灵活,完美
回复 使用道具 举报
bytcib
金牌服务用户   /  发表于:2020-5-19 16:14:41
板凳
1818himis 发表于 2020-5-19 14:28
顶一下
我也觉得内置命令:执行存储过程可以进化一下,改为       执行SQL语句:
整条SQL语句定义好  条 ...

同意这个意见,我就执行一条SQL语句我没有必要写一个存储过程,至于安全性,这不是活字格的问题,这是写SQL语句的人的问题,然后,我这个问题问了4个小时15分钟,才有了您来打破零回复。至于官方,我也不知道是看见了啊,还是没看见啊,我就等吧。。。。。。
回复 使用道具 举报
Tracy.Liu讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2020-5-19 18:59:51
地板
bytcib 发表于 2020-5-19 16:14
同意这个意见,我就执行一条SQL语句我没有必要写一个存储过程,至于安全性,这不是活字格的问题,这是写S ...

这个目前应该是不行的。
您发了贴后,可以把帖子发到咱们讨论组中,这样双重保障哈~
下午帮您看了另一个问题,以为您的问题都处理完了呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部