-
Create Index 索引名 On 表名(猎命);
-
rowId居然是关键字.根据rowid排序的时候一直报错.最后发现是关键字不能使用
-
Oracle数据库的初步学习数据库的安装及其配置,使用默认选项进行安装即可oracle的几种常见客户端 Web端:https://localhost:5500/em(浏览器需要flash插件) Oracle控制台:SQLplus Oracle自带的GUI:Sql Developer 三方客户端:比如 Pl/sql Developer使用sqlpuls连接数据库的方式:sqlplus / as sysdba ------只限于本地登录(对数据库服务器没有要求) sqlplus username/password --------本地登录(需要数据库服务器可用) sqlplus username/password @orcl(需要服务器的listener处于监听状态) sqlplus username/password @ hostname:port/sid ------远程登陆 sid(全局数据库名)Oracle的管理工具i. Net Configuration Assistant : 网络配置助手,用于配置监听,TNS(分布式组件)等服务i. Net Manager:网络管理者,在此处可以修改连接权限,以用于远程登陆i. Database Configuration Assistant:可以配置现有数据库,或者新建其他数据库Oracle两大类级别角色:sysdba ----- 拥有最高的系统权限(sys) sysoper-----系统管理员(system),权限次之Oracle处处需要授权,当访问不同对象的资源时,需要提前授权(grant 权限 on 数据表 to 用户)Oracle撤销权限,revoke 权限 on 数据表 from 用户 oracle12C创建普通用户时需要以 c##开头,原因是Oracle12C开启了分布式应用,采用了热插拔技术。 SQL developer创建用户时注意创建的用户名被双引号包裹,而Oracle可能识别不了Oracle的主要数据类型字符型 char[(n)]定长 varchar2(n) 可变 clob 大字符串,不推荐使用 数字型 number 整形或者浮点型 number(n):整数,n代表最大位数 number(p,s):存储浮点数, p代表最大精度,s代表小数位数 number(6,2):可表示2345.33 日期型:date:储存年月日时分秒,精确到秒 timestamp (时间戳) Oracle中数值和日期不能直接转化 需要借助函数to_char(sysdate,"YYYY-MM-DD hh:mm:ss") from dual --dual:不存在的数据库,使用它只是为了使格式正确 todate('2018-12-31 10:40:33','YY-MM-DD HH24:MI:SS') from dual;SQL语句书写规范(oracle不区分大小写)所有表名,列名全部小写 关键字,内置函数名全部大写SQL语句注释--单行注释 /**/多行注释 别名:select students_info as si from student; 使用 as 关键字字符串连接操作符 ||把列与列,列与字符连接在一起 可以用来 ‘合成'列 例: select student_name || student_age as ss from student'比较运算符 = ,> , >= , <, <=, <>不等于 BETWEEN.....AND IN LIKE IS NULL 模糊查询 like %表示任意长度的字符 _表示单个任意字符排序ORDER BY : ASC:升序 DESC 降序 使用规则:ORDER BY 在 select 语句的结尾 SELECT * FROM student ORDER BY student_age desc';
-
怎么利用MyBatis传List类型参数到数据库存储过程中实现批量插入数据?MyBatis中参数是List类型时怎么处理?大家都知道MyBatis批处理大量数据是很难做到事务回滚的(事务由Spring管理),都将逻辑写在存储中又是及其头疼的一件事(参数长度也有限制),那么我想的是将参数在后台封装为单个或多个list集合,直接通过MyBatis将此参数传到数据库存储过程中,一来摆脱了MyBatis批量插入数据的诸多限制(例如:不能实时返回主键、foreach标签循环集合长度有限制),二来就是在存储中灵活的控制事务,但是这又会涉及两个问题,MyBatis的xml文件中该怎么封装,利用BaseTypeHandler吗?对于这个问题,经过一天的研究终于算是跑通了,说一下解决办法:1.建立数据库表,大家应该都有自己的库表了,所以这一步基本上就可以跳过了。我之所以在这里把库表贴出来是为了让大家对应里面的参数。数据库表:create table ZD_UNIT_MENU ( unit_id VARCHAR2(32), menu_id VARCHAR2(32) ) 2.在数据库中建立相应的java对象(Oracle中的类型)和数组:CREATE OR REPLACE TYPE unit_menu_obj AS OBJECT( unitId VARCHAR2(32), menuId VARCHAR2(32) ); CREATE OR REPLACE TYPE unit_menu_table AS table OF unit_menu_obj; 3.存储过程:create or replace procedure save_unit_power(list0 in unit_menu_table,result0 out int) as sql_bind varchar(200); begin FOR i IN 1 .. list0.count LOOP sql_bind := 'insert into ZD_UNIT_MENU(UNIT_ID,MENU_ID) values('''||list0(i).unitId||''', '''||list0(i).menuId||''' )'; execute immediate sql_bind; end loop; commit; --返回结果,执行成功的话返回1 result0 := 1; --捕捉异常,回滚操作 EXCEPTION WHEN OTHERS THEN result0 := -1;--执行失败的话返回-1 ROLLBACK; end save_unit_power; 4.再看看mybatis的配置吧:<parameterMap type="java.util.Map" id="_map"> <parameter property="list0" jdbcType="ARRAY" javaType="java.util.List" mode="IN" typeHandler="com.zd.util.ListHandler"/> <parameter property="result0" jdbcType="DECIMAL" javaType="java.lang.Integer" mode="OUT" /> </parameterMap> <select id="addUnitPower" statementType="CALLABLE" parameterMap="_map"> <![CDATA[ CALL save_unit_power(?,?) ]]> </select> 5.看看我是如何调用的?我直接贴我的server代码了,dao层的就没必要了: List<UnitMenu> list = new ArrayList<UnitMenu>(); Map<String, Object> _map = new HashMap<String, Object>(); String[] menuIds = menuTreeIds.split(","); JSONObject job = new JSONObject(); int result = -1; for(int i = 0; i < menuIds.length; i++){ UnitMenu um = new UnitMenu(); um.setMenuId(menuIds[i]); um.setUnitId(unitId); list.add(um); } _map.put("list0", list); _map.put("result0", ""); unitMenuMapper.addUnitPower(_map); System.out.println("================================================_map = "+_map.toString()); result = (Integer)_map.get("result0"); System.out.println("================================================result = "+result);
-
我是一名计算机专业的大学生,(之前没接触过数据库相关知识,所以在这个方面我还是小白),听说数据库对于程序员来说挺重要的,学校虽然开了oracle课程,但是老师根本不上课(考试会给我们过),而我想学一下数据库,不知道哪门数据库课程比较适合我这种新手学习,所以我想问一下大家,现在这个时代有必要学习oracle吗?大家可以给我推荐一下好的数据库课吗?感谢!!
-
撰稿|吴俊宇审阅|梁欣婷「摘要:2020年,新冠疫情大流行引发企业快速数字化诉求。低代码开发顺势成为潮流。这股潮流在2021年进一步被推高。但低代码开发不是新鲜事物。2010年开始欧美信息化领域就在酝酿这一趋势。这是欧美信息化发展到成熟阶段的产物。」数字化转型常被视为“CEO工程”。2017年居然之家董事长汪林朋参与完湖畔大学课程后,对“数字化转型”这五个字燃起兴趣。钉钉、盒马等产品被引入居然之家接下来的建设中。“组织线上化”是其数字化第一步,钉钉起到了重要作用。2017年以前,居然之家内部协同以传真、电话、OA为主,甚至一度给员工发放过纸质黄页。使用钉钉后,内部普遍反映,“通讯录很好用”。居然之家钉钉项目负责人介绍,“这个看起来不起眼的功能让大家颇为惊喜”。随着对钉钉使用深入,越来越多日常个性化需求需要基于钉钉开发。钉钉提供的低代码应用开发平台“宜搭”顺理成章被IT部门使用。2020年,新冠疫情大流行引发企业快速数字化诉求。低代码开发顺势成为潮流。这股潮流在2021年进一步被推高。一批软件或低代码赛道的明星企业,如Salesforce、Oracle、Mendix、Outsystems正在低代码潮流中乘风破浪。在钉钉宣布定位为企业级协同办公与应用开发平台同一天,Oracle宣布将其低代码开发平台APEX作为托管云服务对外开放,腾讯云宣布低代码LowCode平台开启公测。过去几年,钉钉与蒙牛、居然之家及部分中小企业在信息化建设中就在逐渐尝试低代码开发。海外低代码平台则是跑出了成熟的商业模式和目标客户。低代码似乎已经箭在弦上。01新贵的挑战何为低代码开发?低代码开发,是指无需编码或很少代码(No Code or Low Code)快速生成应用程序。通常提供可视化设计工具快速搭建界面、设计数据模型、创建业务逻辑和工作流。可以在在几周,甚至几天内,搭建出应用程序的框架并交付客户试用。BCG董事总经理陈果在一篇界定“低代码”使用范畴的文章中提到了两个观点。1、目前低代码主要应用场景是面向企业用户的快速补充开发,其中包含两块内容,第一是简单的工作流和表单流转的应用,第二是大型应用软件的功能延伸的开发;2、低代码是PaaS平台的一个组件,有助于利用PaaS平台的业务、数据、集成等云服务,或者适用于大型应用软件(SaaS)的延伸开发;我们可以看到,低代码依旧跑在PaaS或其他通用软件之上。对企业而言,即使采用低代码,大型通用软件建设依旧不可回避。以Salesforce为例, Platform(平台)收入是其七大收入来源之一。Platform被定义为高生产率aPaaS、高控制aPaaS、应用平台软件、业务流程管理套件、数字体验平台等。所谓的aPaaS,实际上就是采用低代码,基于云,且具备可拓展性的平台。用阿里云总裁张建锋的话来说,低代码更多是帮助企业解决个性化问题,通用软件满足了企业60%-70%的需求,另外30%由企业内技术人员通过新工具快速建立。Gartner从2017年开始便对主流低代码开发平台进行排名。在Gartner 2020年发布的企业低代码应用程序平台魔力象限中,领先的低代码开发平台大致分为两类:一类是新贵创业企业,如Mendix、Outsystems。另一类是传统软件厂商,如Salesforce,Oracle则是被列入挑战者象限。低代码开发不是新鲜事物。2010年开始欧美信息化领域就在酝酿这一趋势。这是欧美信息化发展到成熟阶段的产物。Mendix、Outsystems的历史起源于2000年代。Mendix 2001年在荷兰鹿特丹成立,Outsystems 2005年诞生于葡萄牙。成立之初,Mendix是一家PaaS服务商。Outsystems是应用方案商,主要业务来源于德勤、埃森哲等大型咨询公司的外包合同。2010年左右,Mendix、Outsystems开始酝酿第一轮低代码潮流。但当时行业内依旧是大型软件的市场,并未有巨头在意两家公司的举动。2015年之后,Mendix、Outsystems迎来了第二轮爆发。因低代码在客户群体中得到认可,Outsystems在此后三年迎来了最快的增长。2018年,两家低代码开发平台发展进入拐点。当年6月,私募股权投资机构KKR和高盛共筹3.6亿美元注资Outsystems后,这家公司估值推高至10亿美元。2个月后,德国西门子以6亿欧元收购了低代码应用开发平台Mendix,并让其成为西门子数字工业软件组件。发展至今,两大低代码开发平台已形成成熟的客户群体和商业模式。以Outsystems为例,其客户包括丰田、雪佛龙、罗技、德勤、理光、施耐德电气等。与SAP、IBM等传统软件服务商合作,共同为客户提供低代码开发工具。Outsystems甚至还发展出了自己的PaaS平台。和Outsystems一样,Mendix同样是SAP、IBM的战略合作伙伴,收费模式包含三块:订制化组件、模板,应用部署。Mendix还为客户提供了ROI计算模型,精确分析人力规模、薪资水平、开发时间、应用规模等场景下使用低代码开发可节省的成本。02巨头的防守在低代码创业新贵受到追捧时,Salesforce、Oracle这类传统软件厂商也在积极布局低代码开发平台建设,对未来的技术挑战进行防守。Salesforce、Oracle低代码开发真正被媒体集中关注的时间在2017-2018年。2017年,Salesforce在年度会议Dreamforce中公布了云集成战略(Gartner将其定义为集成平台即服务,即iPaaS),“低代码”被视为云集成的基本功能。在当时,低代码被视为可应对客户重大关切的问题。Saleforce作为一个直接面向客户的SaaS服务商,经历多年发展后已形成成熟的软件生态。在提供低代码开发工具后,服务企业可以在此其基础上开发自身应用。Salesforce低代码工具在Lightning Platform平台运行,它的构建可以避免开发人员缺口(developer gap)和IT系统烟囱化。这带来的直接益处是,可以做大做深生态,增加营收规模。对一部分客户而言,IT团队通常既没有预算也没有带宽快速完成集成项目,低代码开发平台可以加快业务应用程序的开发和部署。Salesforce之所以在Gartner魔力象限中领先,很大一部分原因是App Cloud与其Salesforce CRM套件集成良好。IDC在2018年一份研究中表明,建立在Salesforce Lightning平台上的组织在五年内的投资回报率为545%。每个受调查组织的业务用户获得的生产力和收入收益总计为882万美元,其中应用程序开发生命周期缩短了63%。Oracle通用应用软件开发周期长、开发成本高,客户对低代码早已存在需求。2020年新冠疫情逼迫企业加速采用高效数字化解决方案,低代码开发得以流行。福布斯去年6月报道,2020年Oracle APEX正在成为最常用的企业低代码开发平台之一。Oracle数据库服务器技术副总裁Andrew Mendelsohn解释称,过去企业认为基于Oracle编写应用程序既复杂又昂贵,低代码开发可以帮助大众开发人员、业务分析师和专业开发人员创建部署美观、快速、数据驱动的应用程序。与之对应的是,Oracle APEX低代码系统运行在Oracle公共云平台上。这套系统在Oracle数据库用户中非常受欢迎,吸引了50多万用户。为抢占市场,Oracle甚至采用了低价竞争策略。每月起步价仅为360美元,远低于Mendix的1917美元以及OutSystems的4000美元。低价策略使用很大程度上表明,2021年低代码市场的竞争可能会被进一步推高。这也是为什么阿里云总裁张建锋认为,低代码开发会在2021年成为潮流。03国内的需求在过去,企业数字化建设经历过几个阶段。第一阶段,大型软件开发,其特点是成本高、代价大、实施难。第二阶段,软件SaaS化大幅降低了软件的使用门槛,但由不同服务商提供的SaaS实际上成为一个个的数据孤岛,无法实现数据互联互通。第三阶段,基于云的SaaS化有效解决了这一问题,但通用软件仍然无法解决千行百业的个性化需求,企业用云和数字化的门槛仍然存在。2018年后逐渐被重视的低代码开启了第四个阶段,被视为是对现有软件生态的重要补充。在Mendix、Outsystems被资本市场备受追捧,Salesforce强化低代码服务的2018年,国内一批创业企业开始以“低代码”概念扩张市场。在同一年,钉钉则是帮助一批国内企业尝鲜低代码技术,试水数字化转型。这批愿意采用低代码技术的企业有着共同特点。1、对数字化转型有强烈愿望,但自身信息化建设处于早期,IT部门规模有限;2、传统ERP系统或SaaS化软件成本高,后期运营、运维难度大。采用较“轻”的模式实现组织线上化是现阶段目标;3、企业内部有大量基于业务产生的个性化诉求,这些诉求通用软件无法迅速解决;海外信息化市场相对成熟,低代码技术历经多次浪潮逐渐被催熟,最终被巨头广泛接受。这一过程与欧美市场信息化长期演进有密切联系。国内信息化市场相对薄弱,企业在数字化转型浪潮来临时,传统信息化建设可能尚未完善。钉钉在其中起到的是打开数字化转型大门的作用。一位钉钉内部人士向「深几度」介绍,钉钉高管在一次内部会议中将钉钉的角色视为「叩门」数字化转型。钉钉低代码开发平台宜搭则是在叩门后帮助企业进一步提升数字化能力。曾有媒体在阿里云海外博客测算,一个10人团队用传统全代码开发模式部署中型软件管理系统,通常需要三个月,后续还需要长期维护投资。宜搭平台5人团队只需1个月就可部署类似系统。数据模型、业务流程在一个平台上聚合可视化,以此降低项目移交成本和整体维护成本。目前,东方希望、立白、卡宾、蒙牛、居然之家、云南建投均是钉钉低代码平台重要客户。这部分客户被拓展的逻辑是,它们最先采用钉钉做组织线上化改造,实现组织线上化后,再利用钉钉低代码开发平台“宜搭”展开应用开发,实现更多个性化功能。居然之家在其中较为具有代表性。居然之家IT部门人数为30人,在居然之家内部以规划、顾问角色存在。目前开发任务主要交由合作伙伴完成。居然之家董事长汪林朋对企业数字化建设有较高意愿,2017年意识到数字化转型的必要性,2018年决定与阿里共同转型“新零售”。在此之后,阿里系一系列产品和服务,如盒马、钉钉都与居然之家展开深度合作。正如前文所言,钉钉“叩门”居然之家后,第一步是“组织线上化”,完成组织线上化之后,更多业务则是在进一步展开。第二个作用是协同流程和业务系统的在线化。居然之家有集团总部、分公司、分店、分店执行部门的多层企业架构,每天线上新发起流程为2000-3000条。把企业管理规则固化到系统之后,财务凭证、合同审批、盖章申请、费用报销几乎都要通过钉钉解决。2018年5月居然之家启用“宜搭”后,使用低代码开发各部门所需的个性化应用,在两年半的时间里,累计开发流程应用400多个,并陆续在钉钉工作台上线,目前活跃使用的有200多个,解决了公司近百项事务的审批难题。第三个作用沉淀业务数据。基于宜搭开发档案、财务、物资应用跑通后可不断沉淀业务数据。居然之家日常经营管理可参考其中的数据。居然之家钉钉项目负责人提到,随着未来钉钉持续迭代优化,通过宜搭开发的应用会不断增加,在居然之家业务系统中起到的作用会越来越重要。这位负责人在与宜搭产品团队交流时提出了更多意愿——希望阿里云对系统稳定性、安全性提供支撑。不过,这位负责人也预测了未来可能存在的挑战:随着宜搭开发承载的应用、功能愈加丰富,宜搭上运行的应用可能会有SaaS化的倾向,这会对企业后期运营、运维提出考验。因此居然之家目前有扩编IT部门的意向,强化自主开发的力度,以适应未来趋势。对国内其他厂商而言,低代码开发能否真正接受的核心问题在于几点。企业使用低代码开发能否真正实现增效降本。从Mendix案例就能发现,客户使用低代码开发的目的,依旧是节省成本、提高开发速度。企业自身信息化建设能否跟上。对企业而言,使用低代码开发并不是逃过信息化建设的捷径,低代码开发与传统软件的建设是同步的;低代码开发必须跑在大型软件上。对阿里云来说,钉钉强化低代码开发领域的布局,未来可能会强化其云资源的销售,提升客户粘度,为后续提供更多增值服务创造空间。04可见的未来低代码未来会如何走?海外市场目前的增长状况在很大程度上可以说明问题。海外研究机构Infolob研究显示,低代码应用程序保持着40%的年复合增长率,预计到2022年,低代码应用程序市场总规模将达212亿美元。研究机构Gartner则预测,2024年应用软件开发活动当中的65%将通过低代码方式完成,同时75%的大型企业将使用至少四种低代码开发工具进行应用开发。低代码也不是一个“概念”化技术。它正在带来实际收入,并获得更多客户认可。无论是Salesforce还是Mendix都在继续加大低代码平台建设的力度。Salesforce 2020年投资者日上,Salesforce就2021年财年收入状况做出了报告。Platform收入从2017年至今,年复合增长率达到了25%。Salesforce 2020年三季度财报则显示,总收入为54.2亿美元,Salesforce Platform收入为15.94亿美元,占总营收比重为29.4%。这一业务的增长速度远超其他服务。Platform(平台)收入是唯一标明了TAM(技术接受模型)的板块。根据Salesforce的预测,未来4年市场总规模的复合增长还将高达7%。Mendix 2020财年报告显示,其总营收超过1亿美元,预订量同比增长75%,续订率超过96%,下一步战略重点是亚太。Mendix目标客户包括中国、日本、印度、东南亚、澳大利亚和新西兰。目前每周有近1000万用户在Mendix低代码平台上创建应用。仅在2020年前8个月,就有超过12万个应用使用Mendix平台构建。Mendix甚至被西门子软件云战略的核心。在低代码开发的趋势下,钉钉自身战略定位也在调整:上连企业业务应用,下连阿里云IT基础设施,是一个企业级协同办公平台和企业级应用开发平台。钉钉开放平台入驻开发者已超过27万,开发者服务的企业组织数超过640万家. 全平台应用数已经超过70万个。对钉钉来说,低代码已是无法避免的方向。参考资料:1、IDC White Paper, sponsored by Salesforce, “Business Value of Building Apps on the Salesforce Lightning Platform,” Sept 2018.2、Gartner, Inc., “Magic Quadrant for Enterprise Low-Code Application Platforms, September 30, 2020,3、《OUTSYSTEMS THE NEXT UNICORN Forbes》 20184、《低代码,不要以比“中台”还快的速度臭大街》 陈果5、《低代码跑出了独角兽,通用平台靠什么?》中国软件网6、《低代码,能让程序员脱离996吗?》 甲子光年7、Mendix Maintains Growth Momentum, Increasing Bookings by 75% in FY 2020 CISION Dec 17, 20208、Oracle offers APEX low-code dev platform as managed service by Darryl K. Taft 2020.1.139、Yida Plus, Alibaba's Solution for Low-Code Development10、Mendix Fires On All Cylinders; Surpassed $100 Million Annual Recurring Revenue and Now on Trajectory to Double in 18 Months文章来源:澎湃原文链接:https://www.thepaper.cn/newsDetail_forward_10838811
-
测试表及数据:drop table if exists tb_test;create table tb_test(a int,b int);insert into tb_test values(1,1),(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,2),(2,4),(2,5),(2,6);Oracle:select * from (select a,b,count(*) cnt from tb_test group by a,b) t pivot (sum(cnt) for a in (1 c,2 d,3 e,4 f));Gauss:select b,sum(case a when 1 then cnt end) C,sum(case a when 2 then cnt end) D,sum(case a when 3 then cnt end) E,sum(case a when 4 then cnt end) Ffrom (select a,b,count(*) cnt from tb_test group by a,b)group by b;
-
1.单表max,dense_rank lastOracle:select max(id) keep (dense_rank last order by parent_id) from tb_recursive;Gauss:select id from tb_recursive order by parent_id desc,id desc limit 1;2.单表max,dense_rank firstOracle:select max(id) keep (dense_rank first order by parent_id) from tb_recursive;Gauss:select id from tb_recursive order by parent_id asc,id desc limit 1;3.单表min,dense_rank lastOracle:select min(id) keep (dense_rank last order by parent_id) from tb_recursive;Gauss:select id from tb_recursive order by parent_id desc,id asc limit 1;4.单表min,dense_rank firstOracle:select min(id) keep (dense_rank first order by parent_id) from tb_recursive;Gauss:select id from tb_recursive order by parent_id asc,id asc limit 1;
-
【问题来源】【必填】 【可选问题来源:武汉农村商业银行】 【问题简要】【必填】 ideploy执行 SUM ORACLE脚本加载任务, 执行数据库脚本到如下地方报错INSERT INTO sys_menu (MENU_ID, SYSTEM_ID, MODULE_ID, PARENT_ID, MENU_NAME, MENU_DESC, MENU_URL, DISPLAY_NO, OPEN_MODULE, AUTH_ID, IS_HIDDEN, IS_DISPLAY, BE_INST_FLAG, STATUS) VALUES ('80071003007', '80071', '80071', '80071003', '介ц芥ュョ缁璁℃ヨ〃', '介ц芥ュョ缁璁℃ヨ〃', 'resource.root/cms/page/report/skillqueueaccesscodereport.html', 1036, '0', '80071003007', '0', '1', 'Y', 'A')*ERROR at line 1:ORA-12899: value too large for column "AICC_SUM"."SYS_MENU"."MENU_NAME"(actual: 126, maximum: 100)【问题类别】【必填】 CMS/SUM/SIA/Baseweb安装【AICC解决方案版本】【必填】 AICC可选择版本:AICC 8.13.0 SUM可选择版本:SysUserMgmtService-2.6.0.tar.gz【期望解决时间】4月23日下班前【问题现象描述】【必填】 ideploy执行 SUM ORACLE脚本加载任务, 执行数据库脚本到如下地方报错INSERT INTO sys_menu (MENU_ID, SYSTEM_ID, MODULE_ID, PARENT_ID, MENU_NAME, MENU_DESC, MENU_URL, DISPLAY_NO, OPEN_MODULE, AUTH_ID, IS_HIDDEN, IS_DISPLAY, BE_INST_FLAG, STATUS) VALUES ('80071003007', '80071', '80071', '80071003', '介ц芥ュョ缁璁℃ヨ〃', '介ц芥ュョ缁璁℃ヨ〃', 'resource.root/cms/page/report/skillqueueaccesscodereport.html', 1036, '0', '80071003007', '0', '1', 'Y', 'A')*ERROR at line 1:ORA-12899: value too large for column "AICC_SUM"."SYS_MENU"."MENU_NAME"(actual: 126, maximum: 100)【日志或错误截图】【可选】附件为完整ideploy任务日志
-
【问题来源】【必填】 【可选问题来源:武汉农村商业银行】 【问题简要】【必填】 ideploy执行 SUM ORACLE脚本加载任务,执行失败,SID错误,无法连接到数据库【问题类别】【必填】 CMS/SUM/SIA/Baseweb安装【AICC解决方案版本】【必填】 AICC可选择版本:AICC 8.13.0 SUM可选择版本:SysUserMgmtService-2.6.0.tar.gz【期望解决时间】4月23日下班前【问题现象描述】【必填】 ideploy执行 SUM ORACLE脚本加载任务,执行失败,提示ORA-12505, TNS:listener does not currently know of SID given in connect descriptor无法连接到数据库,数据库url 中SID与实际值不一致,请问SID值需要在哪里配置,文档没有体现。【日志或错误截图】【可选】如下,日志显示SID为ora19c,真是值为xkf,请问怎么更改此处的值。 【附件】【可选】 // 如果文件中存在保密信息,请发邮件到libin@huawei.com 或 heping13@huawei.com 邮箱
-
keepkeep是Oracle下的一个分析函数,他的用法不同于通过over关键字指定的分析函数,可以用于这样一种场合下:取同一个分组下以某个字段排序后,对指定字段取最小或最大的那个值。从这个前提出发,我们可以看到其实这个目标通过一般的dense_rank分析函数也可以实现,即指定rank=1。可结合下面例子修改keep函数。如果是取last,可以倒排序,如果取first,则可以正排序。原语句select max(id) keep(dense_rank last order by name) from test1 group by dept;新语句select max(v.id) from (select id,name,dense_rank()over(partition by dept order by name desc) as rank from test1) v where v.rank=1 group by v.dept;
-
with recursivewith recursive用来替代Oracle中的的语法connect by prior xxx start with yyy。后有with recursive原理介绍。当前不支持下推,现在采用临时办法规避此问题,提前在后台生成一张展开表,如:gcms.gcm_mag_area_big_h,在跑批时生成此表供前台调用。建表语句及跑批调用函数如下:create table gcms.gcm_mag_area_big_h (like gcms.gcm_mag_area_h);Oracle原语句select area_codefrom gcms.gcm_mag_area_hconnect by prior area_code=belong_area_codestart with area_code=’#分支行代码#’修改后的MPP语句with recursive cte as(select area_codefrom gcms.gcm_mag_area_hwhere area_code=’ #分支行代码#’union allselect h.area_codefrom ctejoin gcms.gcm_mag_area_h hon h.belong_area_code=cte.area_code)select area_code from cte;跑批后调用语句select area_code from gcms.gcm_mag_area_big_h where belong_area_code=’#分支行代码#’带路径、层级的oracle原句select area_code,sys_connect_by_path(h.area_code,’>’) as chain,levelfrom gcms.gcm_mag_area_h hstart with area_code=’#分支行代码#’connect by nocycle prior h.area_code=h.belong_area_code and level <=6带路径、层级的修改方法with recursive cte as(select area_code, area_code as chain, 1 as level /*chain为路径,例如>101>201>203;level为层级,从1开始*/from gcms.gcm_mag_area_hwhere area_code=’#分支行代码#’union allselect h.area_code,cte.chain||’>’||h.area_code,cte.level+1from ctejoin gcms.gcm_mag_area_h hon h.belong_area_code=cte.area_code and cte.level <6 and h.area_code not in (select regexp_split_to_table(cte.chain,'>') )/*如果是循环的结构,可以用chain来退出循环;此处cte.level<6表示到第6层停止*/)select * from cte; With recursive原理如下:有一个启动QUERY,得到的结果进入输出表然后会进入第一次JOIN,用到输出表进行JOIN,输出的结果分别进入WORK TABLE和APPEND到输出表然后进如第二次JOIN,用到WORK TABLE进行JOIN,清空WORK TABLE输出的结果分别进入WORK TABLE和APPEND到输出表持续循环。用法举例创建示例表:CREATE TABLE TBL_TEST ( ID numeric, NAME text, PID numeric DEFAULT 0 ) distribute by replication;插入测试数据:INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0'); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1'); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0'); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1'); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2'); --创建结果表create table result as select * from tbl_test;从Root往树末梢递归with recursive t_result as ( select * from tbl_test where id=1 union all select t2.* from t_result t1 join tbl_test t2 on t1.id=t2.pid ) select * from t_result; id | name | pid ----+------+----- 1 | 10 | 0 2 | 11 | 1 4 | 12 | 1 5 | 121 | 2 (4 rows) 从末梢往树ROOT递归with recursive t_result as ( select * from tbl_test where id=5 union all select t2.* from t_result t1 join tbl_test t2 on t1.pid=t2.id ) select * from t_result; id | name | pid ----+------+----- 5 | 121 | 2 2 | 11 | 1 3 | 10 | 0 (3 rows) 树形结构的注意事项一定要能跳出循环,即循环子句查不到结果为止。树形结构如果有多个值,则会出现查到的结果比实际的多的情况,这个业务上是需要保证不出现重复的。改写方法:其中result表最终结果表,tmp和immidiate为中间表;CREATE OR REPLACE FUNCTION public.test_recur() RETURNS void LANGUAGE plpgsql immutableAS $function$DECLARE nest_level int :=0; cont int :=0;BEGIN create temp table immidiate(ID numeric, NAME text, PID numeric DEFAULT 0); create temp table tmp(ID numeric, NAME text, PID numeric DEFAULT 0); insert into immidiate select * from tbl_test where id=1; insert into result select * from immidiate; select count(*) from immidiate into cont; while cont > 0 loop insert into tmp select t2.* from immidiate t1 join tbl_test t2 on t1.id=t2.pid; insert into result select * from tmp; truncate immidiate; insert into immidiate select * from tmp; truncate tmp; select count(*) from immidiate into cont; end loop; drop table immidiate; drop table tmp;end$function$;
-
packageOracle支持。GaussDB A不支持。处理方案替换为schema。变量放在函数里。示例Oracle:--存储过程和函数。function/procedure secu_f_global_setparm()--自定义游标。CREATE OR REPLACE PROCEDURE pkg_fasp_gl. checkdatas( .... o_result_cur out refcursor);--存储过程中引用包的全局变量。FUNCTION secu_f_global_setparm(v_userida varchar2,v_pmdivida varchar2,v_pmyeara varchar2,v_pmyaa varchar2 default null) return varchar2 is begin v_userid:=v_userida;--调用存储过程。deleteglvouchersnolock;GaussDB A:--在数据库中创建和包名同名的schema。CREATE SCHEMA global_multyear_cz;--创建存储过程和函数。CREATE OR REPLACE FUNCTION/PROCEDURE global_multyear_cz.secu_f_global_setparm();--自定义游标。CREATE OR REPLACE PROCEDURE pkg_fasp_gl. checkdatas( .... o_result_cur out refcursor);--存储过程中引用包的全局变量。CREATE OR REPLACE FUNCTION global_multyear_cz.secu_f_global_setparm(v_userida varchar2,v_pmdividavarchar2,v_pmyeara varchar2,v_pmyaa varchar2 default null) return varchar2 is v_userid varchar2(32); begin--调用存储过程。deleteglvouchersnolock();
-
存储过程语法OracleGaussDB A处理方案示例GOTO跳转到标签。不支持。l 如果在单循环语句中向循环结束处GOTO,可以替换为EXIT语句。l 如果在单循环语句中向循环开始处GOTO,可以替换为CONTINUE语句。l 对于复杂的GOTO语句,需要调整语句逻辑。-EXCEPTION异常处理。不支持。删除。-PRAGMA EXCEPTION_INIT自定义异常处理。不支持。删除。-COMMIT阶段事务提交。不支持,默认整体提交。l 删除l 如果一个存储过程中通过多个commit控制业务阶段提交则需要拆分为多个存储过程实现。Oracle:PROCEDURE PROC_SPMS_ADD_OPENUSED_BATCH(...) IS ... BEGIN ...COMMIT; EXCEPTION ...WHEN OTHERS THEN ROLLBACK; RETURN; END PROC_SPMS_ADD_OPENUSED_BATCH;GaussDB A:CREATE OR REPLACE PROCEDURE PKCG_SPMS_OPENSOFT_MANAGE.PROC_SPMS_ADD_OPENUSED_BATCH(...) IS... BEGIN ... --COMMIT; EXCEPTIONWHEN OTHERS THEN -- ROLLBACK; RETURN; END;ROLLBACK事务回滚。不支持,默认报错回滚。删除见COMMIT示例。create package创建包。不支持。删除,单独创建存储过程,不通过package方式批量管理。-End PROCEDURE_NAME;End PROCEDURE_NAME;End;/存储过程统一通过end结束,不加存储过程名。-type tab1 is table of创建表存储类型。不支持。l 通过创建临时表改写l 将后续BULK COLLECT INTO tab1。改写为insert into select。-SQLERRM错误消息。不支持。通过日志信息获得报错内容。-RAISE显示信息RAISE a;RAISE info '%', a;语法格式调整。-record定义一个record类型。支持。语法有区别。按照GaussDB A的语法重新定义。Oracle:create function fn_getgroupbyuser(account_code in varchar2) return varchar2 is type type_group is record ( orgrole varchar2(64), role varchar2(64));……begin……..end ;/GaussDB A:create function fn_getgroupbyuser(account_code in varchar2) return varchar2 is type_group record ; orgrole varchar2(64); role varchar2(64);……BeginSelect orgrole, role into type_group;……..end ;/自治事务支持。不支持。结合业务逻辑,删除自治事务的定义。Oracle:CREATE PROCEDURE updatelog2column (column_name VARCHAR2,column_values VARCHAR2,txid VARCHAR2,gltype VARCHAR2) authid current_user is pragma autonomous_transaction; i_column_values varchar2(17);begin………end ;/GaussDB A:CREATE PROCEDURE updatelog2column (column_name VARCHAR2,column_values VARCHAR2,txid VARCHAR2,gltype VARCHAR2) authidcurrent_user is --pragma autonomous_transaction; i_column_values varchar2(17);begin………end ;/数组无约束。l 不支持全局自定义数组,需要在存储过程中进行数组的定义。在哪个存储过程中用到了此数据定义,就需要在哪个存储过程中定义一遍。l 访问数组元素时,不支持小括号写法,需要使用中括号按照GaussDB A约束进行修改。Oracle:CREATE OR REPLACE EDITIONABLE TYPE “SPMSADMIN”.”ARRYTYPE” is table of Varchar2(1000); PROCEDURE PROC_SPMS_UPD_OPENUSED_BATCH(...) IS ... V_USER_TYPE_ARR ARRYTYPE; GaussDB A:CREATE OR REPLACE PROCEDURE PKCG_SPMS_OPENSOFT_MANAGE.PROC_SPMS_UPD_OPENUSED_BATCH(...) IS TYPE arrytype IS VARRAY(1024) OF VARCHAR2(1000); V_USER_TYPE_ARR ARRYTYPE; %type支持直接引用表的字段类型。不支持直接引用表的字段类型。找到引用的表的字段类型,替换为该类型。Oracle:PROCEDURE PROC_SPMS_UPDATE_OPENSOFT_INFO() IS V_SOFTASSETS_ID SPMS_OPENSOFT_VERSION.SOFTASSETS_ID%TYPE; V_VER_KEY SPMS_OPENSOFT_VERSION.VER_KEY%TYPE; GaussDB A:CREATE OR REPLACE PROCEDURE PKCG_SPMS_OPENSOFT_MANAGE.PROC_SPMS_UPDATE_OPENSOFT_INFO() IS V_SOFTASSETS_ID VARCHAR2(20); V_VER_KEY VARCHAR2(20);存储过程间相互调用支持直接调用。不支持直接调用。存储过程内部使用call命令调用另一个存储过程。Oracle:create procedure dsr_partition_p#pup_elseuser is v_count integer := 0;begin select count(*)into v_countfrom user_tables where table_name = ‘p#fasp_t_pupelseuser’; if v_count = 0 thendsr_partition_p#pup_elu_create; elsif v_count = 1 thendsr_partition_p#pup_elu_alter; end if;end dsr_partition_p#pup_elseuser;GaussDB A:create or replace procedure dsr_partition_p#pup_elseuser is v_count integer := 0;begin select count(*)into v_countfrom user_tables where table_name = ‘p#fasp_t_pupelseuser’; if v_count = 0 thencall dsr_partition_p#pup_elu_create(); elsif v_count = 1 thencall dsr_partition_p#pup_elu_alter(); end if;end ;/print_output输出指定的文本。不支持。用dbms_output.put_line 替换。-raise_application_error自定义错误信息。不支持。替换。Oracle:raise_application_error(-20001,'脚本执行过程中出现错误,请查看表secu_t_tmp_logsecurec内容!');GaussDB A:RAISE EXCEPTION 'Noexistence ID-->%','-20001' USING HINT ='脚本执行过程中出现错误,请查看表secu_t_tmp_logsecurec内容!';游标同一会话中,游标可以重复调用。同一会话中,游标不支持重复调用。同一会话中,游标需要先close,再open后调用。GaussDB A:create or replace procedure () is tmpsql varchar2(32000); tmpsql2 varchar2(32000); type refcursorasd is ref cursor; col_cursor refcursorasd; --col_cursor SYS_REFCURSOR; tablename varchar2(100); v_rec record; v_rec2 record; exesql varchar2(4000); v_num number;begintmpsql:='select 1 a,2 b union all select 3,4'; open col_cursor for tmpsql; loop fetch col_cursor into v_rec; exit when col_cursor%notfound; dbms_output.put_line('for after fetch : '||v_rec.a ||'---'||v_rec.b); --raise; end loop; -- close col_cursor; tmpsql2:='select 5 a,7 b union all select 6,8'; open col_cursor for tmpsql2; loop fetch col_cursor into v_rec2; exit when col_cursor%notfound; dbms_output.put_line('for after fetch : '||v_rec2.a ||'---'||v_rec2.b); --raise; end loop; close col_cursor;end;
上滑加载中
推荐直播
-
GaussDB管理平台TPOPS,DBA高效运维的一站式解决方案
2024/12/24 周二 16:30-18:00
Leo 华为云数据库DTSE技术布道师
数据库的复杂运维,是否让你感到头疼不已?今天,华为云GaussDB管理平台将彻底来改观!本期直播,我们将深入探索GaussDB管理平台的TPOPS功能,带你感受一键式部署安装的便捷,和智能化运维管理的高效,让复杂的运维、管理变得简单,让简单变得可靠。
回顾中 -
DTT年度收官盛典:华为开发者空间大咖汇,共探云端开发创新
2025/01/08 周三 16:30-18:00
Yawei 华为云开发工具和效率首席专家 Edwin 华为开发者空间产品总监
数字化转型进程持续加速,驱动着技术革新发展,华为开发者空间如何巧妙整合鸿蒙、昇腾、鲲鹏等核心资源,打破平台间的壁垒,实现跨平台协同?在科技迅猛发展的今天,开发者们如何迅速把握机遇,实现高效、创新的技术突破?DTT 年度收官盛典,将与大家共同探索华为开发者空间的创新奥秘。
回顾中
热门标签