2011-11-2 游标和管道函数
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,http://www.itpub.net/thread-1499223-11-1.html105楼我创建了这张表并填入数据:CREATE TABLE plch_parts( partnum
千家信息网最后更新 2025年02月03日2011-11-2 游标和管道函数
http://www.itpub.net/thread-1499223-11-1.html
105楼
我创建了这张表并填入数据:
CREATE TABLE plch_parts( partnum INTEGER PRIMARY KEY, partname VARCHAR2 (100) UNIQUE)/BEGIN INSERT INTO plch_parts VALUES (1, 'Mouse'); INSERT INTO plch_parts VALUES (100, 'Keyboard'); INSERT INTO plch_parts VALUES (500, 'Monitor'); COMMIT;END;/
我建立了如下的嵌套表类型和包说明:
CREATE OR REPLACE TYPE numbers_t IS TABLE OF NUMBER;/CREATE OR REPLACE PACKAGE plch_pipelineIS CURSOR refcur_c IS SELECT line FROM user_source; TYPE refcur_t IS REF CURSOR RETURN refcur_c%ROWTYPE; FUNCTION double_values (dataset refcur_t) RETURN numbers_t PIPELINED;END plch_pipeline;/
下列的选项中哪些实现了包体,从而使得这个查询执行之后:
SELECT * FROM TABLE (plch_pipeline.double_values ( CURSOR (SELECT line FROM user_source WHERE name = 'PLCH_PIPELINE' AND type = 'PACKAGE' AND line <= 3 ORDER BY line)))/
这三行会显示出来:
246
(A)
CREATE OR REPLACE PACKAGE BODY plch_pipelineIS FUNCTION double_values (dataset refcur_t) RETURN numbers_t PIPELINED IS l_number NUMBER; BEGIN LOOP FETCH dataset INTO l_number; EXIT WHEN dataset%NOTFOUND; UPDATE plch_parts SET partnum = partnum; PIPE ROW (l_number * 2); END LOOP; CLOSE dataset; RETURN; END;END plch_pipeline;/
SQL> SELECT * 2 FROM TABLE (plch_pipeline.double_values ( 3 CURSOR (SELECT line 4 FROM user_source 5 WHERE name = 'PLCH_PIPELINE' 6 AND type = 'PACKAGE' 7 AND line <= 3 8 ORDER BY line))) 9 /SELECT * FROM TABLE (plch_pipeline.double_values ( CURSOR (SELECT line FROM user_source WHERE name = 'PLCH_PIPELINE' AND type = 'PACKAGE' AND line <= 3 ORDER BY line)))ORA-14551: 无法在查询中执行 DML 操作ORA-06512: 在 "YOGA.PLCH_PIPELINE", line 12SQL>
(B)
CREATE OR REPLACE PACKAGE BODY plch_pipelineIS FUNCTION double_values (dataset refcur_t) RETURN numbers_t PIPELINED IS PRAGMA AUTONOMOUS_TRANSACTION; l_number NUMBER; BEGIN LOOP FETCH dataset INTO l_number; EXIT WHEN dataset%NOTFOUND; UPDATE plch_parts SET partnum = partnum; PIPE ROW (l_number * 2); END LOOP; CLOSE dataset; RETURN; END;END plch_pipeline;/
SQL> SELECT * 2 FROM TABLE (plch_pipeline.double_values ( 3 CURSOR (SELECT line 4 FROM user_source 5 WHERE name = 'PLCH_PIPELINE' 6 AND type = 'PACKAGE' 7 AND line <= 3 8 ORDER BY line))) 9 /SELECT * FROM TABLE (plch_pipeline.double_values ( CURSOR (SELECT line FROM user_source WHERE name = 'PLCH_PIPELINE' AND type = 'PACKAGE' AND line <= 3 ORDER BY line)))ORA-06519: 检测到活动的独立的事务处理, 已经回退ORA-06512: 在 "YOGA.PLCH_PIPELINE", line 15SQL>
(C)
CREATE OR REPLACE PACKAGE BODY plch_pipelineIS FUNCTION double_values (dataset refcur_t) RETURN numbers_t PIPELINED IS PRAGMA AUTONOMOUS_TRANSACTION; l_number NUMBER; BEGIN LOOP FETCH dataset INTO l_number; EXIT WHEN dataset%NOTFOUND; UPDATE plch_parts SET partnum = partnum; PIPE ROW (l_number * 2); END LOOP; CLOSE dataset; COMMIT; RETURN; END;END plch_pipeline;/
SQL> SELECT * 2 FROM TABLE (plch_pipeline.double_values ( 3 CURSOR (SELECT line 4 FROM user_source 5 WHERE name = 'PLCH_PIPELINE' 6 AND type = 'PACKAGE' 7 AND line <= 3 8 ORDER BY line))) 9 /SELECT * FROM TABLE (plch_pipeline.double_values ( CURSOR (SELECT line FROM user_source WHERE name = 'PLCH_PIPELINE' AND type = 'PACKAGE' AND line <= 3 ORDER BY line)))ORA-06519: 检测到活动的独立的事务处理, 已经回退ORA-06512: 在 "YOGA.PLCH_PIPELINE", line 15SQL>
(D)
CREATE OR REPLACE PACKAGE BODY plch_pipelineIS FUNCTION double_values (dataset refcur_t) RETURN numbers_t PIPELINED IS PRAGMA AUTONOMOUS_TRANSACTION; l_number NUMBER; BEGIN LOOP FETCH dataset INTO l_number; EXIT WHEN dataset%NOTFOUND; UPDATE plch_parts SET partnum = partnum; COMMIT; PIPE ROW (l_number * 2); END LOOP; CLOSE dataset; RETURN; END;END plch_pipeline;/
SQL> SELECT * 2 FROM TABLE (plch_pipeline.double_values ( 3 CURSOR (SELECT line 4 FROM user_source 5 WHERE name = 'PLCH_PIPELINE' 6 AND type = 'PACKAGE' 7 AND line <= 3 8 ORDER BY line))) 9 /COLUMN_VALUE------------ 2 4 6SQL>
答案说明在109楼
2011-11-2 答案D.A: 在SQL中调用的函数不能有DML, 除非是自治事务;B: 虽然用了自治事务,但是在返回之前(PIPE ROW 就是返回一行数据)必须提交或回滚这个事务;C: 虽然用了自治事务而且有COMMIT, 但是位置不对,COMMIT放在循环外面,这样在返回(PIPE ROW)之前还是没有提交。
事务
自治
数据
答案
函数
不对
一行
位置
就是
是在
类型
还是
D.A
三行
循环
查询
游标
管道
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
天津便宜服务器cpu 虚拟主机
怀旧服能转回原来的服务器吗
放学五分钟网络安全教育教案
镇原县网络安全宣传周启动
云服务器运维与管理 阿里云
泗阳威力网络技术解决方案
奇迹暖暖苏州叠纸网络技术公司
软件开发目前就业
数据库被勒索病毒加密恢复
天津公安警官的网络安全与执法
数据库如何设置md5 加密
idea项目怎么启动服务器
创新赛道互联网科技公司
星星海服务器是自主可控吗
服务器玩游戏用什么显卡
dmz服务器访问互联网
商业网站服务器要多大
软件开发校园经历怎么写
广西网络安全和信息办公室面试
如何关闭服务器租用
软件开发业务包含
怎么装数据库mysql
苹果注册未找到指定服务器
企业服务器管理实训内容
企业管理软件开发方案多少钱
315晚会计算机网络安全
德州网络技术学校
虹口区参考网络技术咨询报价
惠州手机软件开发
服务器流程