inceptor游标使用及优化

  • inceptor简介
    • 模块-oracle PLSQL方言
    • 常用游标种类
    • 参数游标

inceptor简介

Transwarp Inceptor是星环科技推出的用于数据仓库和交互式分析的大数据平台软件,它基于Hadoop和Spark技术平台打造,加上自主开发的创新功能组件,有效的解决了企业级大数据数据处理和分析的各种技术难题,帮助企业快速的构建和推广数据业务。

模块-oracle PLSQL方言

基础知识

常量,变量,%type属性类型,%rowtype属性类型等的声明,以及赋值方式及规范

数据类型

数据类型可分为标量类型和复合类型。其中标量类型主要有string,int,double等Inceptor所支持的所有数据类型。复合类型主要有Records,Collections,Cursors

创建PL/SQL语句块

包括匿名块,过程和函数

流程控制语句

IF,LOOP,WHILE,FOR,EXIT WHEN,CONTINUE,GOTO

PL/SQL存储过程

可分为带参数和不带参数的过程

PL/SQL函数

PL/SQL函数可以单独调用,也可以在过程和SQL语句中调用

Records

Records中分量的名字和类型可以自定义,也可以基于表中字段的名字和类型来定义,此外还可以利用%rowtype属性快速定义一个Records变量

Collections

collections,即集合元素,主要可分为VARRAY,NESTED TABLE,Associative arrays三种形式。

Cursors

Inceptor中游标主要分为静态游标和动态游标,其中静态游标可分为显式游标和隐式游标;动态游标可分为强类型动态游标和弱类型动态游标

与SQL的交互

本节中,我们分别介绍PL/SQL中的过程,函数,游标,以及BULK COLLECT方法与SQL的交互

Packages

本节中主要介绍包头(Packages specification)和包体(Packages body)的创建方法,以及Packages的使用案例

异常

支持的系统预定义异常

NO_DATA_FOUND, TOO_MANY_ROWS, CURSOR_ALREADY_OPEN, ROWTYPE_MISMATCH, SUBSCRIPT_BEYOND_COUNT, SUBSCRIPT_OUTSIDE_LIMIT, COLLECTION_IS_NULL, INVALID_CURSOR, 此外Inceptor也支持用户自定义异常

不支持的系统预定义异常

INVALID_NUMBER, VALUE_ERROR, ZERO_DIVIDE, DUP_VAL_ON_INDEX, CASE_NOT_FOUND, ACCESS_INTO_NULL, SELF_IS_NULL, SYS_INVALID_ROWID, NOT_LOGGED_ON, LOGIN_DENIED, TIMEOUT_ON_RESOURCE, STORAGE_ERROR, PROGRAM_ERROR

预定义函数/过程/包

sqlcode(void)

sqlerrm(void)

get_columns(string,nestedtable)

raise_application_error(int,string,bool)

set_env(string,string)

get_env(string)

put_line(string)

sqlerrm(int)

dbms_output

owa_util

注意事项

Inceptor对PL/SQL中分号的支持

PL/SQL中结果的打印

常用游标种类

在PL/SQL中,游标是指针,指向一段DML语句(INSERT/UPDATE/DELETE/MERGE)或者查询语句(SELECT)的上下文区域(context area)。PL/SQL中,游标分为 显式游标(explicit cursor) 和 隐式游标(implicit cursor)。在声明游标时可以带有或不带有参数。

  1. 显式游标
    显示游标可以在SELECT语句上创建,它使用的步骤为:

在声明部分声明游标:

语法:

DECLARE CURSOR cursor_name IS select_statement;
在执行部分或异常处理部分打开游标:

语法:

OPEN cursor_name;
取数据:

语法:

FETCH cursor_name;
关闭游标:

语法:

CLOSE cursor_name;

下面我们用一些例子来具体介绍显式游标的使用方法。

1.1. 不带参数的显式游标使用示例
例 . 在LOOP中声明一个显式游标,查询表transactions中的价格
!set plsqlUseSlash true
DECLARE
– 定义一个字段名和类型与表transactions均相同的记录变量transactions_type。
transactions_type transactions%ROWTYPE
– 定义一个显式游标cur,用来查询表transactions中的全部信息。
CURSOR cur IS SELECT * FROM transactions;
BEGIN
– 打开游标cur。
OPEN cur
LOOP
– 把游标cur查询到的信息放进变量transactions_type中。
FETCH cur INTO transactions_type
– 如果游标cur没有查询到信息,就退出。
EXIT WHEN cur%NOTFOUND
– 输出变量transactions_type中的字段price的值。
DBMS_OUTPUT.PUT_LINE(transactions_type.price)
END LOOP;
CLOSE cur
EXCEPTION
– 声明一个异常情况名OTHERS。
WHEN OTHERS THEN
– 如果异常OTHERS发生,则返回的值。
DBMS_OUTPUT.PUT_LINE(‘Something unexpected happened!!’)
CLOSE cur
END;
输出结果为:
/

1.2. 带参数的显式游标使用示例
例 168. 在LOOP中定义一个带有参数的游标,查询表transactions中账号为6513065的交易时间。
!set plsqlUseSlash true
DECLARE
– 定义一个带有参数的游标cur去查询表transactions中账号和参数的值相等的全部信息,其中参数名为tacc_num,类型为string。
CURSOR cur(tacc_num string) IS SELECT * FROM transactions WHERE acc_num=tacc_num;
– 定义一个字段名和类型与表transactions均相同的记录变量transactions_type。
transactions_type transactions%rowtype
BEGIN
– 打开游标cur,并赋参数值为6513065。
OPEN cur(‘6513065’)
LOOP
– 把游标cur查询到的信息放进变量transactions_type中。
FETCH cur INTO transactions_type
EXIT WHEN cur%NOTFOUND
– 输出变量transactions_type中的交易时间。
DBMS_OUTPUT.PUT_LINE(transactions_type.trans_time)
END LOOP;
CLOSE cur
– 如果有情况名为OTHERS的异常发生,则返回Something unexpected happened!!的信息。
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(‘Something unexpected happened!!’)
CLOSE cur
END;
/
输出结果为:

output
20140105100520

20140506133109

20140916105811

20141225133500

20140628133001

20140508094805

整型

代表DML语句成功执行的数据行数

SQL%FOUND

布尔型

值为TRUE代表插入、删除、更新或单行查询操作成功

SQL%NOTFOUND

布尔型

与SQL%FOUND属性返回值相反

SQL%ISOPEN

布尔型

永远为FALSE

说明

对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1,如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常NO_DATA_FOUND。

在执行DML语句后,SQL%FOUND的属性值将为TRUE。

1.2. 隐式游标使用示例
例 指向DML语句的隐式游标,使用update语句对表zara进行更新
!set plsqlUseSlash true
BEGIN
UPDATE zara SET name=‘grace’ WHERE age=20
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘name is updated’)
ELSE
DBMS_OUTPUT.PUT_LINE(‘name is not updated’)
END IF
END;
/
输出结果为:

output
name is not updated

1.3. 游标变量
像游标一样,游标变量指向指定查询结果集当前行,但是相对游标,游标变量更加灵活因为其声明并不绑定指定查询。要定义一个游标变量,您需要先声明一个游标类型 REF CURSOR。然后定义这个类型的游标变量。

游标变量的使用步骤如下:

声明游标类型:

语法:

DECLARE TYPE type_name IS REF CURSOR;
声明该类型的游标变量:

语法

cursor_name type_name;
在执行部分或异常处理部分打开:

语法:

OPEN cursor_name FOR sql_statement;
取数据:

语法:

FETCH cursor_name;
关闭游标:

语法:

CLOSE cursor_name;
游标变量可分为两类,强类型和弱类型的:

如果在声明游标类型REF CURSOR的时候指定了返回类型,那么REF CURSOR及其类型的游标变量被称为 强类型。

如果在声明游标类型REF CURSOR的时候不指定返回类型,那么REF CURSOR及其类型的游标变量被称为 弱类型。

1.3.1. 游标变量使用示例
1) 强类型游标变量
例 172. 查询表transactions中价格为12.13的交易号和交易时间
!set plsqlUseSlash true
DECLARE
– 声明一个名为cur_transaction的游标类型,指定返回值的类型为transactions%rowtype。
TYPE cur_transaction IS REF CURSOR RETURN transactions%ROWTYPE
– 定义一个名为sqlcur的游标变量。
sqlcur cur_transaction
– 依次定义两个类型为字符串的变量v_trans_id,v_trans_time。
v_trans_id STRING
v_trans_time STRING
BEGIN
– 打开游标sqlcur,去查询表transactions中价格为12.13的交易号和交易时间。
OPEN sqlcur FOR SELECT trans_id,trans_time FROM transactions WHERE price=12.13;
LOOP
– 将游标查询的结果放进变量v_trans_id,v_trans_time。
FETCH sqlcur INTO v_trans_id,v_trans_time
EXIT WHEN sqlcur%NOTFOUND
– 输出变量v_trans_id,v_trans_time的值。
DBMS_OUTPUT.PUT_LINE(v_trans_id||’ ’ ||v_trans_time)
END LOOP;
CLOSE sqlcur
END;
/
输出结果为:

output
943197522 20140105100520

2) 弱类型游标变量
例 查询表transactions中价格为12.13的交易号和交易时间
!set plsqlUseSlash true
DECLARE
– 声明一个名为cur_transaction的游标类型,没有定义返回值的类型。
TYPE cur_transaction IS REF CURSOR
– 定义一个名为sqlcur的cur_transaction游标变量。
sqlcur cur_transaction
– 依次定义两个类型为字符串的变量v_trans_id,v_trans_time。
v_trans_id STRING
v_trans_time STRING
BEGIN
– 打开游标sqlcur,去查询表transactions中价格为12.13的交易号和交易时间。
OPEN sqlcur FOR SELECT trans_id,trans_time FROM transactions WHERE price=12.13;
LOOP
– 将游标查询的结果放进变量v_trans_id,v_trans_time。
FETCH sqlcur INTO v_trans_id,v_trans_time
EXIT WHEN sqlcur%NOTFOUND
– 输出变量v_trans_id,v_trans_time的值。
DBMS_OUTPUT.PUT_LINE(v_trans_id||’ ’ ||v_trans_time)
END LOOP;
CLOSE sqlcur
END;
/
输出结果为:

output
943197522 20140105100520

参数游标

将游标变量作为参数传递
!set plsqlUseSlash true
CREATE OR REPLACE PACKAGE pkg_a IS
– 在包pkg_a中定义一个游标类型,和表user_info的行类型相同。
TYPE empcurtyp IS REF CURSOR RETURN user_info%ROWTYPE
END pkg_a;
/

– 定义一个过程process_emp_cv,这个过程会一行行读取user_info中的记录的name。
CREATE OR REPLACE PROCEDURE process_emp_cv(emp_cv in pkg_a.empcurtyp)
IS
user user_info%ROWTYPE
BEGIN
LOOP
FETCH emp_cv INTO user
EXIT WHEN emp_cv%NOTFOUND
DBMS_OUTPUT.PUT_LINE('Name = ’ || user.name)
END LOOP;
END;
/
DECLARE
emp pkg_a.empcurtyp
BEGIN
– 声明游标变量emp,类型为在包pkg_a中定义的游标类型。
OPEN emp FOR SELECT * FROM user_info;
– 将游标变量emp座位参数传给过程process_emp_cv。
process_emp_cv(emp)
CLOSE emp
END;
/

inceptor游标使用及优化相关推荐

  1. Transwarp Inceptor介绍

    Transwarp Inceptor是星环科技推出的用于数据仓库和交互式分析的大数据平台软件,它基于Hadoop和Spark技术平台打造,加上自主开发的创新功能组件,有效的解决了企业级大数据数据处理和 ...

  2. Oracle 11g 新特性 -- 自适应游标共享(Adaptive Cursor Sharing: ACS) 说明

    一.自适应游标共享(Adaptive Cursor Sharing) 说明 1.1 ACS概述 绑定变量使Oracle DB 可以为多条SQL 语句共享单个游标,以减少分析SQL 语句所使用的共享内存 ...

  3. SQL SERVER 参考:游标(Cursor)的讲解与实例

    在数据库中,游标是一个十分重要的概念.游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制.游标总是与一条T_SQL ...

  4. SQL SERVER游标浅析

    1. 定义游标定义 游标语句的核心是定义了一个游标标识名,并把游标标识名和一个查询语句关联起来.DECLARE语句用于声明游标,它通过SELECT查询定义游标存储的数据集合.语句格式为: DECLAR ...

  5. SQL2005 游标学习

    1. 定义游标定义 游标语句的核心是定义了一个游标标识名,并把游标标识名和一个查询语句关联起来.DECLARE语句用于声明游标,它通过SELECT查询定义游标存储的数据集合.语句格式为: DECLAR ...

  6. 转://点评Oracle11g新特性之动态变量窥视

    1. 11g之前的绑定变量窥视 我们都知道,为了可以让SQL语句共享运行计划,oracle始终都是强调在进行应用系统的设计时,必须使用绑定变量,也就是用一个变量来取代原来出如今SQL语句里的字面值.比 ...

  7. Oracle11g新特性之动态变量窥视

    1. 11g之前的绑定变量窥视     我们都知道,为了可以让SQL语句共享运行计划,oracle始终都是强调在进行应用系统的设计时,必须使用绑定变量,也就是用一个变量来取代原来出如今SQL语句里的字 ...

  8. T-SQL编程基础-基本语法

    1.局部变量 声明单个局部变量 declare @num int 声明多个局部变量 declare   @FirstName nvarchar(20)                 @LastNam ...

  9. Oracle SQL 高版本相关

    本文翻译自Troubleshooting: High Version Count Issues (文档 ID 296377.1),有删改 主要内容: 什么是高版本问题 什么是共享SQL? 什么是&qu ...

  10. oracle 11g 新特性之动态绑定变量窥视(一)

    以前在it168发过,现在转过来. 1.     11g之前的绑定变量窥视 我们都知道,为了能够让SQL语句共享执行计划,oracle始终都是强调在进行应用系统的设计时,必须使用绑定变量,也就是用一个 ...

最新文章

  1. ASP.NET 2.0应用程序安全强化纵览
  2. position属性及实现图片垂直居中
  3. Hibernate一对多单向关联和双向关联映射方法及其优缺点
  4. JZOJ 4058. 【JSOI2015】子集选取
  5. JSON在JS和JAVA的处理
  6. mysql学习笔记14 多表查询初步
  7. Jarvis Oj Pwn 学习笔记-level4
  8. android轮播图实现方案,Android轮播图实现教程
  9. 贝叶斯分析——从数值积分到MCMC
  10. IS-IS快速收敛调优配置实例
  11. 2019搜狗测试开发第一题满分测试用例
  12. App测试之性能测试流畅度fps测试
  13. 单元一: 全桥驱动电路(驱动MOS/IGBT均适用,附带硬件)
  14. Flex + BlazeDS 学习笔记 (一) --- BlazeDS的功能原理及配置实例
  15. 腾讯6W月薪架构师能力曝光!微信架构为什么是史上最值钱的IM架构?
  16. Java8 通过foreach 遍历List,同时输出下标
  17. 2020-2021年度第二届全国大学生算法设计与编程挑战赛题解(冬季赛)
  18. 怎么取消微信送票服务器,微信抢火车票怎么取消?有什么要注意的吗?
  19. 机器学习(浙大胡浩基)
  20. WEB-easy_upload

热门文章

  1. 字符串的unicode java_Java把字符串转Unicode
  2. windows10 配置深度学习环境
  3. Pyqt之exec()和show()与弹出自定义对话框
  4. 根据key找到JSON字符串中指定的value值(Java实现)
  5. php 工资 2018,2018年PHP程序员的进阶之路
  6. 比较贵的计算机配置,什么电脑配置好 几款配置比较豪华的笔记本电脑推荐【图文】...
  7. 【安装记录】CPU-Z
  8. matlab语言与应用 10 数学问题的非传统解法
  9. 光伏电站运维管理系统
  10. 艾索特DSP电脑调音软件