Oracle存储过程中table%Rowtype语法改写

举报
古月磊 发表于 2021/06/04 18:44:14 2021/06/04
【摘要】 Oracle存储过程中table%Rowtype语法改写,DWS中通过数组进行实现

近期在支撑一个项目做Oracle语法迁移的过程中,遇到了这么一个语法。在存储过程定义中,定义了一个TYPE,其语法如下:

Procedure p_test() Is

Type t_1 Is Table Of table_name%Rowtype Index By Binary_Integer;

Lt_1 t_1;

Begin

     dbms_output.put_line(Lt_1.Count);

     dbms_output.put_line(Lt_1.select);

end p_test;

 

经过尝试以及确认,在DWS中是没有该语法的,所以需要进行改写,那么就要首先了解这个类型的定义到底是什么含义。

Type  声明是类型Type t_1 是类型的名字。

IS TABLE OF  指定是一个集合的表的数组类型, 简单的来说就是一个可以存储一列多行的数据类型 , test指出在哪个表上( 存在的表 ) %ROWTYPE 指在表上的行的数据类型。

INDEX BY BINARY_INTEGER  指索引组织类型。

 

简单点来看,这里就是定义了一个具备表test行属性的一个类型,并可以对其中的数据进行一些查询和统计。

 

那么在DWS应该怎么去改写呢。

用数组进行替换。改写的语句如下:

create or REPLACE  Procedure p_test() as

declare

    Type t_1 Is VARRAY(1024000) Of test%Rowtype;

Lt_test t_1;

Begin

dbms_output.put_line(Lt_test.Count);

dbms_output.put_line(Lt_test.select);

end ;

/

 

数组定义中相关参数的分别表示如下:

t_1:要定义的数组类型名。

VARRAY:表示要定义的数组类型。

size:取值为正整数,表示可以容纳的成员的最大数量。

data_type:要创建的数组中成员的类型。

 

这样就做到了对该语法的改写。

基本可以做到和上述Oracle中的定义一一对应。但数组不具备索引的属性,所以关于索引那部分只能直接舍去。

 

在实际应用中还需要注意一些以下事项:

  1. GaussDB A中,数组会自动增长,访问越界会返回一个NULL,不会报错。
  2. 在存储过程中定义的数组类型,其作用域仅在该存储过程中。
  3. 建议选择上述定义方法的一种来自定义数组类型,当同时使用两种方法定义同名的数组类型时,DWS会优先选择存储过程中定义的数组类型来声明数组变量。
  4. 存储过程中如果有DML语句(SELECTUPDATEINSERTDELETE),DML语句只能使用中括号来访问数组元素,这样可以和函数表达式区分开。
  5. DWS支持使用圆括号来访问数组元素,且还支持一些特有的函数,如extendcountfirstlast来访问数组的内容。

 

如下的示例就是一个较为完整的操作:

CREATE OR REPLACE PROCEDURE array_proc

AS

       TYPE ARRAY_INTEGER IS VARRAY(1024) OF INTEGER;--定义数组类型

       ARRINT ARRAY_INTEGER := ARRAY_INTEGER();  --声明数组类型的变量

BEGIN

       ARRINT.extend(10); 

       FOR I IN 1..10 LOOP 

               ARRINT(I) := I;

       END LOOP;

       DBMS_OUTPUT.PUT_LINE(ARRINT.COUNT); 

       DBMS_OUTPUT.PUT_LINE(ARRINT(1)); 

       DBMS_OUTPUT.PUT_LINE(ARRINT(10));

       DBMS_OUTPUT.PUT_LINE(ARRINT(ARRINT.FIRST));

       DBMS_OUTPUT.PUT_LINE(ARRINT(ARRINT.last));

END; 

/

 

想了解GaussDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可以获取众多学习资料~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。