华为云用户手册

  • 调用存储过程 GaussDB(DWS)支持通过JDBC直接调用事先创建的存储过程,步骤如下: 调用Connection的prepareCall方法创建调用语句对象。 1 CallableStatement cstmt = myConn.prepareCall("{? = CALL TESTPROC(?,?,?)}"); 调用CallableStatement的setInt方法设置参数。 1 2 3 cstmt.setInt(2, 50); cstmt.setInt(1, 20); cstmt.setInt(3, 90); 调用CallableStatement的registerOutParameter方法注册输出参数。 1 cstmt.registerOutParameter(4, Types.INTEGER); //注册out类型的参数,类型为整型。 调用CallableStatement的execute执行方法调用。 1 cstmt.execute(); 调用CallableStatement的getInt方法获取输出参数。 1 int out = cstmt.getInt(4); //获取out参数 示例: 1 2 3 4 5 6 7 8 9 10 11 12 //在数据库中已创建了如下存储过程,它带有out参数。 create or replace procedure testproc ( psv_in1 in integer, psv_in2 in integer, psv_inout in out integer ) as begin psv_inout := psv_in1 + psv_in2 + psv_inout; end; / 调用CallableStatement的close方法关闭调用语句。 1 cstmt.close(); 很多的数据库例如Connection、Statement和ResultSet都有close()方法,在使用完对象后应把它们关闭。要注意的是,Connection的关闭将间接关闭所有与它关联的Statement,Statement的关闭间接关闭了ResultSet。 一些JDBC驱动程序还提供命名参数的方法来设置参数。命名参数的方法允许根据名称而不是顺序来设置参数,若参数有默认值,则可以不用指定参数值就可以使用此参数的默认值。即使存储过程中参数的顺序发生了变更,也不必修改应用程序。目前GaussDB(DWS)数据库的JDBC驱动程序不支持此方法。 GaussDB(DWS)数据库不支持带有输出参数的函数,也不支持存储过程和函数参数默认值。 当游标作为存储过程的返回值时,如果使用JDBC调用该存储过程,返回的游标将不可用。 存储过程不能和普通SQL在同一条语句中执行。
  • 执行批处理 用一条预处理语句处理多条相似的数据,数据库只创建一次执行计划,节省了语句的编译和优化时间。可以按如下步骤执行: 调用Connection的prepareStatement方法创建预编译语句对象。 1 PreparedStatement pstmt = con.prepareStatement("INSERT INTO customer_t1 VALUES (?)"); 针对每条数据都要调用setShort设置参数,以及调用addBatch确认该条设置完毕。 1 2 pstmt.setShort(1, (short)2); pstmt.addBatch(); 调用PreparedStatement的executeBatch方法执行批处理。 1 int[] rowcount = pstmt.executeBatch(); 调用PreparedStatement的close方法关闭预编译语句对象。 1 pstmt.close(); 在实际的批处理过程中,通常不终止批处理程序的执行,否则会降低数据库的性能。因此在批处理程序时,应该关闭自动提交功能,每几行提交一次。关闭自动提交功能的语句为:conn.setAutoCommit(false);
  • 执行普通SQL语句 应用程序通过执行SQL语句来操作数据库的数据(不用传递参数的语句),需要按以下步骤执行: 调用Connection的createStatement方法创建语句对象。 1 Statement stmt = con.createStatement(); 调用Statement的executeUpdate方法执行SQL语句。 1 int rc = stmt.executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));"); 数据库中收到的一次执行请求(不在事务块中),如果含有多条语句,将会被打包成一个事务,事务块中不支持vacuum操作。如果其中有一个语句失败,那么整个请求都将会被回滚。 关闭语句对象。 1 stmt.close();
  • 全并行的数据查询处理 GaussDB(DWS)是采用Shared-nothing架构的MPP系统,是由众多拥有独立且互不共享CPU、内存、存储等系统资源的逻辑节点组成。在这样的系统架构中,业务数据被分散存储在多个节点上,数据分析任务被推送到数据所在位置就近执行,并行地完成大规模的数据处理工作,实现对数据处理的快速响应。 GaussDB(DWS)后台还通过算子并行执行、指令在寄存器并行执行、及LLVM动态编译剪枝冗余的条件逻辑判断,助力数据查询性能提升。
  • 注意事项 当分配的句柄并非环境句柄时,如果SQLAllocHandle返回的值为SQL_ERROR,则它会将OutputHandlePtr的值设置为SQL_NULL_HDBC、SQL_NULL_HSTMT或SQL_NULL_HDESC。之后,通过调用带有适当参数的SQLGetDiagRec,其中HandleType和Handle被设置为IntputHandle的值,可得到相关的SQLSTATE值,通过SQLSTATE值可以查出调用此函数的具体信息。
  • 参数 表1 SQLAllocHandle参数 关键字 参数说明 HandleType 由SQLAllocHandle分配的句柄类型。必须为下列值之一: SQL_HANDLE_ENV(环境句柄) SQL_HANDLE_DBC(连接句柄) SQL_HANDLE_STMT(语句句柄) SQL_HANDLE_DESC(描述句柄) 申请句柄顺序为,先申请环境句柄,再申请连接句柄,最后申请语句句柄,后申请的句柄都要依赖它前面申请的句柄。 InputHandle 将要分配的新句柄的类型。 如果HandleType为SQL_HANDLE_ENV,则这个值为SQL_NULL_HANDLE。 如果HandleType为SQL_HANDLE_DBC,则这一定是一个环境句柄。 如果HandleType为SQL_HANDLE_STMT或SQL_HANDLE_DESC,则它一定是一个连接句柄。 OutputHandlePtr 输出参数:一个缓冲区的指针,此缓冲区以新分配的数据结构存放返回的句柄。
  • 异常处理原则 任何在PL/pgSQL函数中发生的错误都会中止该函数的执行,实际上还会中止其周围的事务。可以使用带有EXCEPTION子句的BEGIN块捕获错误并且从中恢复。 在使用PL/pgSQL块中,如果使用了不能返回确定结果的SQL语句,应在EXCEPTION子句中对程序可能出现的异常进行处理,避免出现未处理的异常被传递到外层块,导致程序逻辑错误。 对于系统已经定义的异常,可以直接使用。DWS暂不支持自定义异常。 进入和退出一个包含EXCEPTION子句的块要比不包含EXCEPTION子句的块开销大的多。因此,非必要场景不使用EXCEPTION。
  • 书写规范 变量命名规则: 过程、函数的输入参数格式宜为:IN_参数名,参数名宜使用大写。 过程、函数的输出参数格式宜为:OUT_参数名,参数名宜使用大写。 过程、函数得输入输出参数格式宜为:IO_参数名,参数名宜使用大写。 过程、函数得程序中用到的变量宜由v_变量名组成,变量名宜使用小写。 将查询语句做成字符串拼接时,where语句的拼接变量名宜统一为v_where,select语句的拼接变量名宜为v_select。 记录(RECORD)的类型(TYPE)命名宜由T+变量名组成,名称宜使用大写。 游标命名宜由CUR+变量名组成,名称宜使用大写。 引用游标(REF CURSOR)的命名宜由REF+变量名组成,名称宜使用大写。 变量类型定义: 变量类型声明时,如果其含义和应用表某字段含义相同时,应使用%TYPE声明。 记录类型声明时,如果其含义和某应用表行数据相同时,应使用%ROWTYPE声明。 注释规范: 注释应该是有意义的,而不只是重述代码。 注释应简洁、易懂,以中文为主。为了表达准确,名词或操作上也可以使用英文。 应在每个存储过程、函数的开始加入注释,注释内容应包括:本程序的简要功能描述、编写者、编写日期、程序版本号信息和程序变更信息,同时各存储过程开头注释应保持统一格式。 应在输入输出参数的旁边添加注释,注明次变量的意义。 应在每个块或大分支的开始添加注释,描述块的简要功能,若使用算法,应添加注释简单描述算法的目的和结果。 变量声明格式: 每行应只包含一条语句,如同时需要赋初始值,应在同一行书写。 大小写规范: 除了变量名,应一律使用大写。 缩进规范: 创建存储过程语句中,同一层的CREATE、AS/IS、BEGIN、END这几个关键字应位于同一列,其他部分依次缩进。 语句详述: 变量定义语句。每行应只包含一条语句。 同一层的IF、ELSEIF、ELSE和END关键字应开始于同一列,执行语句缩进。 CASE和END关键字应位于同一列,WHEN和ELSE关键字应缩进。 同一层的LOOP和END LOOP关键字应位于同一列,层内语句或嵌套应依次缩进。
  • 程序编写原则 在PL/pgSQL中的SQL语句宜使用绑定变量。 在PL/pgSQL中的SQL语句宜使用RETURNING子句。 存储过程使用原则: 对于单个存储过程中varchar或者varchar2类型输出参数个数不应超过50个。 不应使用long类型作为输入或输出参数。 对于大小超过10MB的字符串类型输出,应使用CLOB类型。 变量声明原则: 变量声明时,如果含义和应用表某字段含义或某变量相同时,应使用%TYPE声明。 记录声明时,如果含义和某应用表行数据相同时,应使用%ROWTYPE声明。 变量声明每行应只包含一条语句。 不应声明LONG类型的变量。 游标使用类型: 显式游标使用后应关闭。 游标变量使用后应关闭。若游标变量需要传递数据给调用的应用程序,应在应用程序中关闭游标;若游标变量仅在存储过程中使用,应显式关闭游标。 在使用DBMS_SQL.CLOSE_CURSOR关闭游标前,应使用DBMS_SQL.IS_OPEN判断游标是否已打开。 集合使用原则:引用集合中的元素时宜使用FORALL语句,不宜使用FOR循环语句。 动态语句使用原则: 联机系统的交易程序不宜使用动态SQL。 PL/pgSQL中要实现DDL语句和系统控制命令,可使用动态SQL。 尽量使用变量绑定。 拼装SQL的使用原则: 拼装SQL宜使用绑定变量。 拼装SQL语句的条件如果有外部输入源,应对输入条件进行字符检查,防止攻击。 在PL/pgSQL脚本中,单行代码的长度,不宜超过2499字符。 Trigger使用原则: Trigger可用于实现差量数据日志等与业务处理无关的可用性设计场景。 不应使用Trigger实现业务处理相关功能。
  • 总体开发原则 应完全按照设计文档进行开发。 程序模块应做到高内聚低耦合。 应有正确、全面的故障对策。 程序编写应做到结构合理,条理清晰。 程序名称命名应按照统一的命名规则进行命名。 应充分考虑程序的运行效率,包括程序的执行效率和数据库的查询、存储效率,在保证应用的同时应使用效率高的处理方法。 程序注释应详细、正确、规范。 除非应用特别需要控制COMMIT和ROLLBACK的提交时机,否则应在存储过程结束时执行显式的COMMIT或者ROLLBACK操作。 程序处理应支持7*24小时;对于程序中断,应用程序应提供安全、简单的断点再续处理。 应提供标准、简单的应用输出,为应用维护人员提供明确的进度显示、错误描述和运行结果;为业务人员提供明确、直观的报表、凭证输出。
  • 状态码 状态码4xx:由于明显的客户端错误(例如,格式错误的请求语法、参数错误等),华为云会返回4xx错误码,请及时检查请求消息的正确性,重新发起请求。 状态码5xx:由于华为云系统原因,导致无法完成明显有效请求的处理,可及时联系华为云客服处理。 HTTP状态码 错误码 描述 400 CBC.0100 参数错误。 400 CBC.99003608 严选产品不能设置转按需。 400 CBC.99003609 该产品类型不支持转按需。 200 CBC.99003610 宽限期、保留期资源不能转按需。 400 CBC.99003611 按需套餐包不能设置转按需。 400 CBC.99003012 资源ID不存在。 400 CBC.99003622 解决方案产品不能设置转按需。 400 CBC.99003623 存在其他处理中交易不能转按需。 400 CBC.99003624 违规冻结资源不允许设置转按需。 400 CBC.99003625 公安冻结资源不允许设置转按需。 400 CBC.99003626 账号已经被冻结,不允许设置转按需。 403 CBC.0151 访问拒绝。 500 CBC.0999 其他错误。
  • 功能介绍 客户可以设置包年/包月资源到期后转为按需资源计费。包年/包月计费模式到期后,按需的计费模式即生效。 客户在费用中心设置包年包月资源到期转按需请参见这里。 客户需要成功支付包年/包月资源订单后,才能设置资源的到期转按需。 目前解决方案组合产品、按需套餐包不支持到期转按需。 在调用本接口前,您可以调用“查询客户包年/包月资源列表”接口获取资源ID、资源过期时间以及资源过期后的扣费策略等信息。 设置包年/包月资源到期转按需后,包年/包月资源到期后将自动变成按需计费。 取消包年/包月资源到期转按需的前提是已经调用“设置或取消包年/包月资源到期转按需”接口设置包年/包月资源的到期转按需或在调用“续订包年/包月资源”接口时设置到期策略为到期转按需。
  • 状态码 状态码4xx:由于明显的客户端错误(例如,格式错误的请求语法、参数错误等),华为云会返回4xx错误码,请及时检查请求消息的正确性,重新发起请求。 状态码5xx:由于华为云系统原因,导致无法完成明显有效请求的处理,可及时联系华为云客服处理。 HTTP状态码 错误码 描述 400 CBC.0100 参数错误。 400 CBC.99003608 严选产品不能设置转按需。 400 CBC.99003609 该产品类型不支持转按需。 200 CBC.99003610 宽限期、保留期资源不能转按需。 400 CBC.99003611 按需套餐包不能设置转按需。 400 CBC.99003012 资源ID不存在。 400 CBC.99003622 解决方案产品不能设置转按需。 400 CBC.99003623 存在其他处理中交易不能转按需。 400 CBC.99003624 违规冻结资源不允许设置转按需。 400 CBC.99003625 公安冻结资源不允许设置转按需。 400 CBC.99003626 账号已经被冻结,不允许设置转按需。 403 CBC.0151 访问拒绝。 500 CBC.0999 其他错误。
  • 功能介绍 客户可以设置包年/包月资源到期后转为按需资源计费。包年/包月计费模式到期后,按需的计费模式即生效。 客户在费用中心设置包年包月资源到期转按需请参见这里。 客户需要成功支付包年/包月资源订单后,才能设置资源的到期转按需。 目前解决方案组合产品、按需套餐包不支持到期转按需。 在调用本接口前,您可以调用“查询客户包年/包月资源列表”接口获取资源ID、资源过期时间以及资源过期后的扣费策略等信息。 设置包年/包月资源到期转按需后,包年/包月资源到期后将自动变成按需计费。 取消包年/包月资源到期转按需的前提是已经调用“设置或取消包年/包月资源到期转按需”接口设置包年/包月资源的到期转按需或在调用“续订包年/包月资源”接口时设置到期策略为到期转按需。
  • 如何查看用户组是否具有Tenant Administrator或VSS Administrator权限,及如何对用户组进行授权? 登录华为云,在右上角单击“控制台”。 鼠标移动至右上方的账号名,在下拉列表中选择“统一身份认证”。 选择“用户组”,单击用户组名称即可查看角色授权记录。 切换至“用户管理”页签,可以查看该用户组下的所有用户,也可以将其他用户添加至该用户组。 如果该用户组缺少相应角色权限,单击“授权”,进入“选择策略”步骤,模糊搜索“Tenant Administrator”或“VSS Administrator”权限的关键字,勾选相应策略。 单击“下一步”,设置最小授权范围,然后单击“确定”,即可完成用户组角色授权。 父主题: 二进制成分分析类
  • 如何解决Roles with READONLY_USER或其他角色权限报错问题? 用户需要具有Tenant Administrator或VSS Administrator权限才能使用二进制成分分析相关业务,请分别联系具有Tenant Administrator或VSS Administrator权限的用户进行授权,可参考如何查看用户组是否具有Tenant Administrator或VSS Administrator权限,及如何对用户组进行授权?查看具有权限的用户。 使用具有Tenant Administrator或VSS Administrator权限的账号登录华为云,在右上角单击“控制台”。 鼠标移动至右上方的账号名,在下拉列表中选择“统一身份认证”。 选择待授权的用户,单击“授权”。 进入“选择授权方式”步骤,选择“继承所选用户组的策略”,然后勾选具有Tenant Administrator或VSS Administrator权限的用户组。 单击“确定”完成授权。 父主题: 二进制成分分析类
  • mv_ordinal_of函数 返回数组中第一次出现expr的基于1的索引,如果未出现,则返回-1。 语法:mv_ordinal_of(arr, expr) 表30 参数说明 参数名称 描述 类型 是否必选 arr 原始数组 Array(String/Number) 是 expr 指定元素 String/Number 是 返回值类型:Integer类型 示例:SELECT MV_ORDINAL_OF(ARRAY('1','2','3','4','5'), '2') 表31 查询分析结果 类型 场景 查询语句 MV_ORDINAL_OF (ARRAY('1','2','3','4','5'), '2') 返回结果 2
  • mv_offset_of函数 返回数组中第一次出现expr的基于0的索引,如果未出现,则返回-1。 语法:mv_offset_of(arr, expr) 表28 参数说明 参数名称 描述 类型 是否必选 arr 原始数组 Array(String/Number) 是 expr 指定元素 String/Number 是 返回值类型:Integer类型 示例:SELECT MV_OFFSET_OF(ARRAY('1','2','3','4','5'), '2') 表29 查询分析结果 类型 场景 查询语句 MV_OFFSET_OF(ARRAY('1','2','3','4','5'), '2') 返回结果 1
  • string_to_mv函数 使用指定的分隔符str2将str1拆分为数组。 语法:string_to_mv(str1, str2) 表22 参数说明 参数名称 描述 类型 是否必选 str1 原始字符串 String 是 str2 指定字符 String 是 返回值类型:Array类型 示例:SELECT STRING_TO_MV('1-2-3-4-5','-') 表23 查询分析结果 类型 场景 查询语句 STRING_TO_MV ('1-2-3-4-5','-') 返回结果 ["1","2","3","4","5"]
  • mv_ordinal函数 返回所提供的基于1的索引处的数组元素,或对于超出范围的索引返回null。 语法:mv_ordinal(arr, index) 表26 参数说明 参数名称 描述 类型 是否必选 arr 原始数组 Array(String/Number) 是 index 指定索引位置 Integer 是 返回值类型:String/Integer/Long/Boolean/Double类型 示例:SELECT MV_ORDINAL(ARRAY('1','2','3','4','5'), 2) 表27 查询分析结果 类型 场景 查询语句 MV_ORDINAL (ARRAY('1','2','3','4','5'), 2) 返回结果 2
  • mv_slice函数 返回从start到end索引的数组。 语法:mv_slice(arr, start, end) 表18 参数说明 参数名称 描述 类型 是否必选 arr 原始数组 Array(String/Number) 是 start 起始位置 Integer 是 end 结束位置 Integer 是 返回值类型:Array类型 示例:SELECT MV_SLICE(ARRAY('1','2','3','4','5'), 2, 4) 表19 查询分析结果 类型 场景 查询语句 MV_SLICE(ARRAY('1','2','3','4','5'), 2, 4) 返回结果 ["3","4"]
  • mv_to_string函数 通过str指定分隔符连接arr所有元素。 语法:mv_to_string(arr, str) 表20 参数说明 参数名称 描述 类型 是否必选 arr 原始数组 Array(String/Number) 是 str 指定字符 String 是 返回值类型:String类型 示例:SELECT MV_TO_STRING(ARRAY('1','2','3','4','5'),'-') 表21 查询分析结果 类型 场景 查询语句 MV_TO_STRING(ARRAY('1','2','3','4','5'),'-') 返回结果 1-2-3-4-5
  • mv_offset函数 返回所提供的基于0的索引处的数组元素,或对于超出范围的索引返回null。 语法:mv_offset(arr, index) 表24 参数说明 参数名称 描述 类型 是否必选 arr 原始数组 Array(String/Number) 是 index 指定索引位置 Integer 是 返回值类型:String/Integer/Long/Boolean/Double类型 示例:SELECT MV_OFFSET(ARRAY('1','2','3','4','5'), 2) 表25 查询分析结果 类型 场景 查询语句 MV_OFFSET(ARRAY('1','2','3','4','5'), 2) 返回结果 3
  • mv_append函数 将指定的元素添加到数组的末尾。 语法:mv_append(arr, expr) 表16 参数说明 参数名称 描述 类型 是否必选 arr 原始数组 Array(String/Number) 是 expr 指定的元素 String/Number 是 返回值类型:Array类型 示例:SELECT MV_APPEND(ARRAY('1','2'),'1') 表17 查询分析结果 类型 场景 查询语句 MV_APPEND(ARRAY('1','2'), '1') 返回结果 ["1","2","1"]
  • contains函数 判断数组中是否包含指定元素。如果包含,则返回true。 语法:contains(expr, ele) 表10 参数说明 参数名称 描述 类型 是否必选 expr 原始数组 Array(String/Number) 是 ele 指定的元素 String/Number 是 返回值类型:Boolean类型 示例:SELECT CONTAINS(ARRAY('1','2'),'1') 表11 查询分析结果 类型 场景 查询语句 CONTAINS(ARRAY('1','2'),'1') 返回结果 true
  • mv_contains函数 判断数组中是否包含指定元素。如果包含,则返回true,同contains。 语法:mv_contains(expr, ele) 表12 参数说明 参数名称 描述 类型 是否必选 expr 原始数组 Array(String/Number) 是 ele 指定的元素 String/Number 是 返回值类型:Boolean类型 示例:SELECT MV_CONTAINS(ARRAY('1','2'),'1') 表13 查询分析结果 类型 场景 查询语句 MV_CONTAINS(ARRAY('1','2'),'1') 返回结果 true
  • mv_prepend函数 将指定的元素添加到数组的开始位置。 语法:mv_prepend(expr, arr) 表14 参数说明 参数名称 描述 类型 是否必选 expr 指定的元素 String/Number 是 arr 原始数组 Array(String/Number) 是 返回值类型:Array类型 示例:SELECT MV_PREPEND('1', ARRAY ('1','2')) 表15 查询分析结果 类型 场景 查询语句 MV_PREPEND ('1', ARRAY ('1','2')) 返回结果 ["1","1","2"]
  • cardinality函数 计算数组中元素的个数。 语法:cardinality(expr) 表6 参数说明 参数名称 描述 类型 是否必选 expr 原始数组 Array(String/Number) 是 返回值类型:String类型 示例:SELECT CARDINALITY(ARRAY('1','2','3')) 表7 查询分析结果 类型 场景 查询语句 CARDINALITY(ARRAY('1','2','3')) 返回结果 3
  • array_position函数 获取指定元素的下标,下标从1开始。如果指定元素不存在,则返回0。 语法:array_position(expr, ele) 表4 参数说明 参数名称 描述 类型 是否必选 expr 原始数组 Array(String/Number) 是 ele 指定的元素 String/Number 是 返回值类型:Integer类型 示例:SELECT ARRAY_POSITION(ARRAY('1','2','3'),'2') 表5 查询分析结果 类型 场景 查询语句 ARRAY_POSITION(ARRAY('1','2','3'),'2') 返回结果 2
  • mv_length函数 计算数组中元素的个数, 同cardinality。 语法:mv_length(expr) 表8 参数说明 参数名称 描述 类型 是否必选 expr 原始数组 Array(String/Number) 是 返回值类型:Integer 示例:SELECT MV_LENGTH(ARRAY('1','2','3')) 表9 查询分析结果 类型 场景 查询语句 MV_LENGTH (ARRAY('1','2','3')) 返回结果 3
共100000条