2011-11-2 游标和管道函数
发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,http://www.itpub.net/thread-1499223-11-1.html105楼我创建了这张表并填入数据:CREATE TABLE plch_parts( partnum
千家信息网最后更新 2024年11月11日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安全错误
数据库的锁怎样保障安全
jsp将图存储到数据库
数据库设计技术方案
fuseki数据库
第七史诗各服务器签到时间
山西网络技术咨询代理品牌
网络安全引论试卷
杭州拓道网络技术有限公司
全景编辑器软件开发
计算机网络技术英语水平
服务器游玩
电脑服务器是路由器吗
网络安全项目中标公示
聊城电商软件开发解决方案
软件开发需要准备哪些
生成快照服务器服务停止
我的世界叶枫宝可梦服务器
南宁千里传网络技术有限公司
软件开发前的需求怎么写
工作班组网络安全职责分工
长沙学院网络安全应急演练
网络安全与执法类的视力要求
计算机网络技术组网规划的题
北京云途腾网络技术有限公司
usb口网络安全锁
做软件开发需要些什么文档
IWATCH软件开发
厦门大学嘉庚学院数据库考试
系统升级后数据库缓存在哪
崇明区创新数据库直销价
中药材信息资源数据库