青岛营销型网站怎样做触屏版手机网站

张小明 2026/1/10 13:54:15
青岛营销型网站,怎样做触屏版手机网站,wordpress presscore lite,php网站有点一、背景 从oracle迁移到openGauss或MogDB#xff0c;需要进行数据核对#xff0c;虽然MogDB有官方的数据核对工具mvd#xff0c;但有些客户还是想自己再核对一次。不过表太多#xff0c;肯定需要进行很多条sql的批量核对#xff0c;而且核对还不能仅仅只是统计行数#…一、背景从oracle迁移到openGauss或MogDB需要进行数据核对虽然MogDB有官方的数据核对工具mvd但有些客户还是想自己再核对一次。不过表太多肯定需要进行很多条sql的批量核对而且核对还不能仅仅只是统计行数至少还要对数值列求和有些表可能还要基于业务规则进行分组统计。其实写段Java或者python就可以输出格式完全相同的查询结果了但这些开发语言都有环境依赖且对于运维DBA这一特定角色可能不是太愿意用这些语言来编写代码。所以希望能从gsql和sqlplus获得完全一致的文本输出这样就能用文本差异对比工具对输出的文本文件进行快速比对。二、输出文件的几种方式就算是同一个程序也会有多种输出文件的方式不同的输出方式得到的结果也会不一样所以需要先知道有哪些输出方式否则很可能所选择的那种方式并无法达到预期。sqlplushttps://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12040.htmspool file_name /spool off工具本身自带的命令可以通过set来设置各种格式常用的就是用echo on/off来控制是否通过把屏幕上的内容都打印来实现将执行的sql也写入文件控制台回显file_name一种通用的方式无论啥程序都能用就是把本来该在控制台上显示的内容写入到一个文本文件中gsqlhttps://docs.mogdb.io/zh/mogdb/v3.0/1-gsqlhttp://postgres.cn/docs/13/app-psql.html使用 -L file_name参数gsql命令的参数定位是个日志文件,只会显示执行的sql命令、查询结果、raise信息不会显示提示符和控制台显示的内容不一样,也不能在代码中局部开启使用 \o 元命令仅能输出sql的查询结果不能包含sql本身raise信息也无法显示不过可以使用\qecho 输出指定文本使用\copy 元命令 (to file)仅能输出一个sql的查询结果且无法设定列宽列名和数据之间没有分隔行无法对同一文件追加内容指定同名文件的效果是直接覆盖文件控制台回显file_name略所以我们先分别用这几种不同的方式都生成一次文件然后看看哪些方式可以对参数进行微调来让输出格式一致。三、需要考虑的点格式完全一致至少要考虑以下几个点需要输出的查询sql有多个列数行数不统一数据类型不统一方案需要通用提示符如何处理 比如 “sql”是否显示列名列宽如何保持统一拖尾空格、自动空行怎么处理oracle默认字段名大写、mogdb默认字段名小写怎么匹配同时也要显示查询的sql末尾的行数显示分隔符如何保持一致有兴趣的先别往下看自己去尝试一下如何用gsql和sqlplus对多个select语句生成完全一致的文本文件也是增进一下对两个工具格式化参数的了解。四、分析两个工具提示符不一样出现的位置也不一样虽然gsql可以通过prompt1-3来自定义提示符但还是无法调整成完全一致所以直接舍弃了控制台回显且sqlplus必须用echo off由于echo off了那么需要个方案再补充输出sql文本例如 select 字符串或者 sqlplus 中的prompt 以及gsql中的\qecho但这样就存在很多冗余代码了每次改都需要改两条两个文件就是四条。如果做成变量来处理结构又复杂了。gsql可以对查询结果设置边框sqlplus不行所以统一不要边框如有必要分割内容再用特定的符号输出单独的行比如*******末尾的行数都有对应的参数可以去掉大小写的问题最好都转换成大写或者小写显示sqlplus里指定列宽只能针对所有数字类型列或明确的列名不能直接统一所有列的列宽动态解析列名然后再轮一下列名来设置代码又有点复杂了下面是多次测试中较为接近的两种效果了但文本差异对比估计还是完全对应不上gsql自带的美化效果此时反而成了自定义的累赘其实做了很多种尝试发现最麻烦的是两个问题列宽无法做成一致两个工具都没提供全局列宽的设定方式两种工具对应的同时显示sql及查询结果的方式最后无论如何输出格式都不一致而且dbms_output和raise notice输出效果也不一样raise notice前面会多一个notice:,且无法去除。也就是说直接执行sql或者通过存储过程打印两种方式都堵死了。可是真的就没有办法了么五、另辟蹊径在oracle19c中对json_object函数新增了一个用法就是select json_object(*) from table_name;这个查询会对每行记录生成一个json串且KEY为列名VALUE为此行此列的数据所有字段都会有对应的KEY生成。在MogDB中也有类似的函数可以实现这个效果select row_to_json(table_name) from table_name;也就是说通过这种方式让sqlplus和gsql不显示sql,不显示字段名只显示数据适当使用prompt或\qecho来产生空行即可。那么接下来的问题就是如何同时也把执行的sql弄上去当然用prompt或\qecho也行但是如果有几十个select要执行代码量直接就翻倍了而且sqlplus和gsql的命令还不一样手动编写两个脚本太麻烦。而且存储过程打印也不行也就是说只能通过select一次的方式同时输出该sql和数据内容。这个时候能想到的就是表函数了表函数可以实现一行变多行还可以自行控制每行的输出内容而且在oracle和MogDB中都有表函数。虽然两者的表函数本身代码语法有一点点区别但是在函数的调用方式上却是完全一致的如果可行的话我们可以实现两个脚本中关于select部分的命令完全一致且单个脚本文件中同一个select只出现一次。六、成品测试数据create table t_check(col1 varchar2(10),col2 number); insert into t_check values (aa,10); insert into t_check values (bb,50);sqlplus脚本 sqlplus_check.sqlset echo off set feedback off set heading off set pagesize 5000 set linesize 1000 set trimout on set trimspool on set serveroutput on set verify off set termout on CREATE OR REPLACE FUNCTION f_check_sql_query(i_sql varchar2) RETURN ora_mining_varchar2_nt PIPELINED IS l_row varchar2(32767); l_sql varchar2(32767); type cur is ref cursor; curs cur; BEGIN l_sql : SELECT JSON_OBJECT(*) from ( || i_sql || ) t; PIPE ROW(******************************); PIPE ROW(i_sql); PIPE ROW(******************************); open curs for l_sql; loop fetch curs into l_row; exit when curs%notfound; PIPE ROW(upper(l_row)); END LOOP; PIPE ROW(******************************); CLOSE curs; RETURN; END; / spool oracle_run_log.log select * from f_check_sql_query(select col1 ,count(*) cnt, sum(col2) sum_col2 from t_check group by col1); select * from f_check_sql_query(select count(*) cnt, sum(col2) sum_col2 from t_check); prompt ; spool off quit调用命令sqlplus user/passwordhost/sid sqlplus_check.sqlgsql脚本\pset border 0 \set ECHO off \pset feedback false \set columns 12 \t CREATE or replace FUNCTION f_check_sql_query(i_sql text) RETURNs setof text language plpgsql as $$ declare l_row text; l_sql text; type cur is ref cursor; curs cur; begin l_sql : SELECT row_to_json(t) from ( || i_sql || ) t; return next(******************************); return next(i_sql); return next(******************************); open curs for l_sql; loop fetch curs into l_row; exit when curs%notfound; return next upper(l_row); END LOOP; return next(******************************); CLOSE curs; return ; end; $$; \o mogdb_run_log.log \qecho select * from f_check_sql_query(select col1 ,count(*) cnt, sum(col2) sum_col2 from t_check group by col1); select * from f_check_sql_query(select count(*) cnt, sum(col2) sum_col2 from t_check); \q调用命令gsql -r -Uuser -Wpassword -f gsql_check.sql输出效果对比可以发现两个工具跑出来的文本文件完全一致且要素齐全文本对比工具没有找到任何一处文本差异注上面两个脚本文件有些参数设置是无效的有兴趣的自己去精简一下吧json_object(*)仅在oracle19c及以上可用如果是12c-18c得用dbms_sql或者xml相关函数来获取列名动态拼接才能使用json_object,因为必须显示指定字段名如果是更老的11g就没这个函数了连json串本身都得手动拼接或者用第三方的pljson组件继续往前如果是8idbms_sql也没了只能用xml相关函数来获取列名了部分函数的返回格式两个数据库会存在区别建议避开不一样的格式或者针对不一样格式的函数再嵌套个格式化的函数处理
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

浦东新区做网站公司o2o网站建设价格

Langchain-Chatchat 数据保留期限设定问答系统 在企业加速推进数字化转型的今天,AI 助手正从“能说会道”的玩具演变为真正嵌入业务流程的智能工具。尤其是在金融、医疗、法律等对数据敏感性极高的行业,如何让大模型既聪明又守规矩,成了落地…

张小明 2026/1/9 16:07:28 网站建设

东莞建站怎么做WordPress开发技巧

一、CTF是什么?为什么你应该学?CTF(Capture The Flag,夺旗赛)是网络安全技术人员之间进行技术竞技的一种比赛形式。如果你对以下任何一项感兴趣,CTF都值得你投入时间:想进入网络安全行业但不知从…

张小明 2025/12/30 12:20:16 网站建设

南开做网站的公司wordpress自动清缓存

想要在测试领域脱颖而出?Python自动化测试正成为行业标配!本教程专为测试人员量身定制,无需深厚编程基础,只需7天就能掌握Selenium的核心技能。Python作为当前最受欢迎的测试编程语言,配合Selenium的强大功能&#xff…

张小明 2025/12/30 17:20:44 网站建设

网站建设网站设计哪家专业洛阳作公司网站

在当今快节奏的Web开发环境中,设计师和开发者经常面临一个共同的挑战:如何快速将视觉设计转化为可运行的代码。Design2Code项目正是为解决这一痛点而生,它利用先进的AI技术,能够将任何网页设计截图直接转换为干净、响应式的HTML、…

张小明 2026/1/8 2:59:17 网站建设

邯郸网站建设的地方wordpress 最好的插件

本次编译环境为VS2022 文章目录前言栈的实现1.什么是栈2.栈的实现一.头文件和源文件的创建以及头文件中的内容二.功能代码的实现1.定义和销毁2.增加和删除3.判断空 找栈顶 获取栈中的个数总结前言 在我们了解完链表:单链表和双链表后 我们将开始 栈和队列的学习 今…

张小明 2025/12/31 0:22:14 网站建设