郑州企业网站制作公司百度上做广告怎么收费
郑州企业网站制作公司,百度上做广告怎么收费,电脑培训班速成班,红色大气网站模板引言
在双碳战略与信创工程的双重驱动下#xff0c;能源、金融、交通等关键行业的数据库国产化替代已进入深水区。作为国产数据库的代表之一#xff0c;KingbaseES通过内核级兼容Oracle特性#xff0c;实现了从语法到生态的全方位适配。本文基于1200表、60存储过…引言在双碳战略与信创工程的双重驱动下能源、金融、交通等关键行业的数据库国产化替代已进入深水区。作为国产数据库的代表之一KingbaseES通过内核级兼容Oracle特性实现了从语法到生态的全方位适配。本文基于1200表、60存储过程的真实迁移案例解析KingbaseES在Oracle平替过程中的全链路实践揭示从兼容性挑战到成本优化的系统性解决方案。KingbaseES与Oracle兼容性KingbaseES以内核兼容为基础打造出涵盖内核、工具和接口的全方位 Oracle 兼容能力。当前Oracle常用能力兼容性已达100%。KingbaseES除兼容基本能力外还兼容PL/SQL内置包、DBLink等高级能力从而在客户应用移植时实现应用无感、平滑迁移。在基础能力方面KingbaseES兼容SQL 语法及Oracle过程化语言的语法基础完成了对数据类型、伪列、常用表达式和条件、系统视图、内置函数、模式对象定义、DML、DQL语句以及控制语句、存储过程/函数、匿名块、触发器、静态SQL、动态SQL等各方面的兼容。在高级能力方面KingbaseES支持ROWIDBFILE等特殊类型支持DBLink同异构数据库访问物化视图分区操作支持完备的内置包功能提供对客户端通用编程接口ODBCJDBC等和自有接口OCIOCCIPro*C等的全面支持以及兼容Oracle XML/JSON能力实现对半结构化文档型数据的处理等。此外KingbaseES还提供了与Oracle对等的空间数据GIS处理能力。一、数据类型兼容性1.1 SQL 数据类型PL/SQL 数据类型包括 SQL 数据类型。其中有关数据类型和子类型、数据类型比较规则、数据类型转换规则、字符和格式模型的所有信息都适用于 SQL 和 PL/SQL。BINARY_FLOAT 和 BINARY_DOUBLE 的子类型PL/SQL 预定义了这些子类型SIMPLE_FLOATSQL 数据类型 BINARY_FLOAT 的子类型SIMPLE_DOUBLESQL 数据类型 BINARY_DOUBLE 的子类型每个子类型都具有与其基本类型相同的范围并且具有 NOT NULL 约束。如果确定变量不会有 NULL 值请将其声明为 SIMPLE_FLOAT 或 SIMPLE_DOUBLE而不是 BINARY_FLOAT 或 BINARY_DOUBLE。 在没有检查空值的情况下子类型提供了比它们的基类型更好的性能。1.2 CHAR 和 VARCHAR2 变量分配或插入过长的值如果分配给字符变量的值长于变量的最大长度则会发生错误。例如\setSQLTERM/DECLAREc VARCHAR2(4CHAR);BEGINc :hello;END;/结果ERROR:valuetoo longfortypecharactervarying(4)CONTEXT: PL/SQLfunctioninline_code_block line4at assignment同样如果将字符变量插入到列中并且变量的值长于定义的列宽度则会发生错误。例如CREATETABLEt1(cCHAR(4CHAR));\setSQLTERM/DECLAREstr VARCHAR2(5CHAR):hello;BEGININSERTINTOt1(c)VALUES(str);END;/结果ERROR:valuetoo longforcolumnpublic.t1.c(actual:5,maximum:4)CONTEXT:SQLstatementINSERT INTO t1(c) VALUES(str)PL/SQLfunctioninline_code_block line4atSQLstatement在将字符值分配给变量或将其插入列之前从字符值中去除空格请使用 TRIM函数 。例如\setSQLTERM/DECLAREc VARCHAR2(3CHAR);BEGINc :TRIM( qwe );INSERTINTOt1(c)VALUES(TRIM( qwe ));END;/SELECT*FROMt1;/结果c------qwe(1row)1.3 CHAR 和 VARCHAR2 数据类型的区别CHAR和VARCHAR2数据类型的不同之处在于预定义子类型空白填充的工作原理值比较预定义子类型CHAR 数据类型在 PL/SQL 和 SQL 中都有一个预定义的子类型——CHARACTER。VARCHAR2 数据类型在 PL/SQL 和 SQL 中都有一个预定义的子类型 VARCHAR在 PL/SQL 中还有一个预定义的子类型 STRING。每个子类型具有与其基本类型相同的值范围。空白填充的工作原理这解释了在 CHAR 和 VARCHAR2 中使用空白填充的区别和注意事项。考虑以下情况用户分配给变量的值小于变量的最大值。用户插入到列中的值比定义的列宽度短。用户从列检索到变量中的值小于变量的最大值。如果接收者的数据类型是CHARPL/SQL 将值填充到最大长度。有关原始值中尾随空格的信息会丢失。如果接收者的数据类型是VARCHAR2PL/SQL 既不填充值也不去除尾随空格。字符值被原封不动地分配不会丢失任何信息。示例: CHAR 和 VARCHAR2 空白填充差异在此示例中CHAR 变量和 VARCHAR2 变量的最大长度为 10 个字符。 每个变量都接收一个由五个字符组成的值后面有一个空格。分配给 CHAR 变量的值被空白填充到 10 个字符并且用户无法判断结果值中的六个尾随空白之一是在在原始值中。分配给 VARCHAR2 变量的值没有改变可以看到它有一个尾随空格。\setSQLTERM/DECLAREchrCHAR(10CHAR);varchr VARCHAR2(10CHAR);BEGINchr :test ;varchr :test ;raise noticechr (%),chr;raise noticevarchr (%),varchr;END;/结果NOTICE: chr(test)NOTICE: varchr(test)值比较SQL中比较字符值的规则适用于 PL/SQL 字符变量。当比较中的一个或两个值的数据类型为 VARCHAR2 或 NVARCHAR2 时使用非填充比较语义否则使用空格填充语义。1.4 PLS_INTEGER 和 BINARY_INTEGER 数据类型PL/SQL 数据类型中 PLS_INTEGER 和 BINARY_INTEGER 是相同的。为简单起见使用 PLS_INTEGER 来表示 PLS_INTEGER 和 BINARY_INTEGER。PLS_INTEGER 数据类型存储 -2,147,483,648 到 2,147,483,647 范围内的带符号的32整数。防止 PLS_INTEGER 溢出操作两个PLS_INTEGER类型的值如果值的计算超出PLS_INTEGER 类型的范围则会引发溢出异常。对于 PLS_INTEGER 范围之外的计算请使用 NUMBER。示例 3-4 计算PLS_INTEGER类型值引发溢出异常此示例计算两个PLS_INTEGER类型的值并引发了溢出异常。\setSQLTERM/DECLAREa1 PLS_INTEGER :2147483647;a2 PLS_INTEGER :1;num NUMBER;BEGINnum :a1a2;END;/结果ERROR:integeroutofrange CONTEXT: PL/SQLfunctioninline_code_block line6at assignment二、控制语句兼容性PL/SQL有三类控制语句条件选择语句、循环语句和顺序控制语句。PL/SQL 控制语句的类别有条件选择语句针对不同的数据值运行不同的语句条件选择语句包括 IF语句 和 CASE语句循环语句它使用一系列不同的数据值运行相同的语句循环语句包括基本的 LOOP语句、FOR LOOP语句 和 WHILE LOOP语句EXIT 语句将控制转移到循环结束。 CONTINUE 语句退出循环的当前迭代并将控制转移到下一个迭代。 EXIT 和 CONTINUE 都有一个可选的 WHEN 子句可以通过它指定一个条件顺序控制语句这对于 PL/SQL 编程并不重要顺序控制语句包括转到指定语句的 GOTO 语句和不执行任何操作的 NULL语句2.1 条件选择语句IF 和 CASE 语句针对不同的数据值运行不同的语句。IF 语句根据条件运行或跳过一个或多个语句。 IF 语句有以下形式IF THENIF THEN ELSEIF THEN ELSIFCASE 语句从一系列条件中进行选择并运行相应的语句。 CASE 语句有以下形式简单 CASE 语句它计算单个表达式并将其与几个值进行比较。搜索 CASE 语句它计算多个条件并选择第一个为真的条件。当要对每个备选方案采取不同的操作时CASE 语句更适用。2.2 IF THEN 语句IF THEN 语句根据条件运行或跳过一个或多个语句。IF THEN 语句具有以下结构IFconditionTHENstatementsENDIF;如果condition为真则statements运行否则statements不运行。示例 : IF THEN 语句在此示例中当且仅当 a 大于 b 时才打印 a - b 的值。\setSQLTERM/DECLAREPROCEDUREp(aint,bint)ASBEGINIFabTHENRAISE NOTICEa - b %,a-b;ENDIF;END;BEGINp(1,2);p(3,2);END;/结果NOTICE: a-b12.3 简单 CASE 语句简单CASE语句具有以下结构CASEselectorWHENselector_value_1THENstatements_1WHENselector_value_2THENstatements_2...WHENselector_value_nTHENstatements_n[ELSEelse_statements]ENDCASE;selector 是一个表达式通常是单个变量。 每个 selector_value 可以是文本或表达式。 对于完整的语法请参见“ CASE 语句”。简单 CASE语句计算selector值并依次与selector_value值进行比较直到找到一个相等的值。若找到相等的值则执行相应THEN子句的statements若没有 selector_value 等于 selector则 CASE 语句判断是否存在 ELSE 如果存在则运行 else_statements 否则引发预定义的异常CASE_NOT_FOUND。示例 : 简单的 CASE 语句\setSQLTERM/DECLAREgradeCHAR(1);BEGINgrade :B;CASEgradeWHENATHENRAISE NOTICEExcellent;WHENBTHENRAISE NOTICEVery Good;WHENCTHENRAISE NOTICEGood;WHENDTHENRAISE NOTICEFair;WHENFTHENRAISE NOTICEPoor;ELSERAISE NOTICENo such grade;ENDCASE;END;/结果NOTICE: Very Good2.4 循环语句循环语句使用一系列不同的值迭代地运行相同的语句。一个 LOOP 语句包含三个部分迭代变量迭代器循环执行体loop_statement ::[iteration_scheme]LOOPloop_bodyENDLOOP[label];iteration_scheme ::WHILEexpression|FORiterator循环语句有基本的LOOPFOR LOOP游标FOR LOOPWHILE LOOP退出循环的语句有EXITEXIT WHEN退出当前循环迭代的语句有CONTINUECONTINUE WHENEXIT、EXIT WHEN、CONTINUE 和 CONTINUE WHEN 可以出现在循环内的任何位置但不能出现在循环外。建议使用这些语句而不是 GOTO 语句因为GOTO语句可以通过将控制转移到循环外的语句来退出循环或当前循环的迭代。引发异常也会退出循环。LOOP 语句可以被标记也可以嵌套。 对于嵌套的循环推荐使用标记以提高可读性。 用户必须确保 END LOOP 语句中的标签与同一循环语句开头的标签匹配否则程序会报错。2.5 游标迭代控制游标迭代控件生成由显式或隐式游标返回的 RECORD 序列。游标定义是控制表达式。不能将 REVERSE 与游标迭代控件一起使用。cursor_iteration_control ::{ cursor_object|sql_statement|dynamic_sql }cursor_object 是一个显式的 PL/SQL 游标对象。 sql_statement 是由用户直接在迭代控件中指定了 SQL 语句而创建的隐式 PL/SQL 游标对象。dynamic_sql类似于sql_statement只不过dynamic_sql为动态SQL语句。在 PL/SQL 中使用游标迭代控制计算游标以创建迭代向量。在向量中获取一个值来迭代创建下一个值。如果迭代向量为空则无法进行迭代向量创建。 计算循环体同时对获取的每个迭代值重复相同的操作直到无法进行迭代控制。示例: 游标迭代控件创建 id 到表 T1 中数据的映射。\setSQLTERM;createtablet1(idint);insertintot1values(1),(2);\setSQLTERM/declarecursorcisSELECT*FROMT1;beginFORrINcLOOPRAISE NOTICEr %,r;ENDLOOP;end;/结果NOTICE: r(1)NOTICE: r(2)ANONYMOUS BLOCK2.6 顺序控制语句与 IF 和 LOOP 语句不同顺序控制语句 GOTO 和 NULL 对于 PL/SQL 编程并不重要。很少需要转到指定语句的 GOTO 语句。NULL 语句什么都不做但它可以通过明确条件语句的含义和动作来提高可读性。2.7 GOTO 语句GOTO 语句表示无条件地将控制转移到标签。标签在其范围内必须是唯一的并且必须位于可执行语句或 PL/SQL 块之前。运行时GOTO 语句将控制转移到带标签的语句或块。对于 GOTO 语句限制请参见“ GOTO 语句”。谨慎使用 GOTO 语句——过度使用它们会导致代码难以理解和维护。不要使用 GOTO 语句将控制从深度嵌套的结构转移到异常处理程序而是通过引发异常的方式进入异常处理程序。三、游标变量参数的子程序参数别名游标变量参数是指针。因此如果一个子程序将一个游标变量参数分配给另一个它们指向的是相同的内存位置。例如该过程有两个游标变量参数Stu_cv1和Stu_cv2。该过程打开Stu_cv1并将其值它是一个指针分配给Stu_cv2则Stu_cv1、Stu_cv2引用相同的内存位置。当程序关闭Stu_cv1时它也会关闭Stu_cv2。因此当过程试图从 Stu_cv2 fetch 时PL/SQL 会引发异常。DROPTABLEIFEXISTSstu_temp;CREATETABLEstu_tempASSELECT*FROMstudent;insertintostu_tempvalues(1001,xs,61);insertintostu_tempvalues(1002,xd,74);insertintostu_tempvalues(1003,xc,83);insertintostu_tempvalues(1004,xg,79);insertintostu_tempvalues(1005,xl,98);\setSQLTERM/DECLARETYPEStuCurTypISREFCURSOR;c1 StuCurTyp;c2 StuCurTyp;PROCEDUREget_Stu_data(Stu_cv1INOUTStuCurTyp,Stu_cv2INOUTStuCurTyp)ISStu_rec stu_temp%ROWTYPE;BEGINOPENStu_cv1FORSELECT*FROMstu_temp;Stu_cv2 :Stu_cv1;-- now both variables refer to same locationFETCHStu_cv1INTOStu_rec;-- fetches first row of studentFETCHStu_cv1INTOStu_rec;-- fetches second row of studentFETCHStu_cv2INTOStu_rec;-- fetches third row of studentCLOSEStu_cv1;-- closes both variablesFETCHStu_cv2INTOStu_rec;-- causes error when get_Stu_data is invokedEND;BEGINget_Stu_data(c1,c2);END;/结果ERROR:cursorunnamed portal 1doesnotexist CONTEXT: PL/SQLfunctionget_stu_data line18atFETCHSQLstatementCALL get_Stu_data(c1, c2)PL/SQLfunctioninline_code_block line21atCALL四、兼容性工具链与配置4.1 迁移工具链KingbaseES提供KDTS、KFS、K-ETL等完整工具链支持全量迁移、增量同步、异构转换。在某银行账户分级系统迁移中10TB数据通过K-ETL并行读取、断点续传机制12小时内完成全量迁移。配合KFS的实时日志解析能力实现业务零停机切换。关键参数ora_input_emptystr_isnull on处理空字符串与NULL的映射ora_date_style on统一日期格式处理nls_length_semantics BYTE调整字符语义search_path $user, public, SCOTT配置模式搜索路径4.2 高级兼容KingbaseES支持DBLink同异构数据库访问通过pg_cron扩展实现Oracle DBMS_SCHEDULER的等价功能。在某电网调度系统中通过以下配置实现周期性任务调度创建cron任务SELECTcron.schedule(0 0 * * *,SELECT update_salary());配置Data Guard热备SELECT*FROMpg_stat_replication;对于XML/JSON处理KingbaseES兼容Oracle的半结构化文档处理能力支持JSONB类型实现高效查询五、结语KingbaseES通过内核级兼容Oracle特性实现了从语法到生态的全方位适配。当前Oracle常用能力兼容性已达99%支持PL/SQL内置包、DBLink等高级能力。在基础能力方面完成了对数据类型、伪列、常用表达式、系统视图、内置函数、DML/DQL语句、控制语句、存储过程/函数、匿名块、触发器、静态SQL、动态SQL等各方面的兼容。通过系统性解决方案和工具链优化KingbaseES在Oracle平替过程中实现了从兼容性挑战到成本优化的全链路突破为关键行业的数据库自主可控提供了坚实支撑。这种从语法到生态的深度兼容不仅降低了迁移成本更通过性能优化和架构创新为企业数字化转型注入了新的动能。