2011-11-2 游标和管道函数
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,http://www.itpub.net/thread-1499223-11-1.html105楼我创建了这张表并填入数据:CREATE TABLE plch_parts( partnum
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
互联网科技公司经营范围
中国互联网科技股
互联网属科技
互联网科技与金融科技
互联网科技集团
互联网未来科技
互联网与新科技
杭州互联网科技公司
长亮科技 互联网金融
互联网金融和金融科技
居家互联网科技有限公司
上海电发互联网科技有限公司
深圳前海聚择互联网科技有限公司
天速互联网络科技有限公司
互联网科技有哪些公司
互联网科技如何创业
沐思想互联网科技有限公司
长沙易易互联网科技有限公司
互联网企业和网络科技有限公司
武汉亿视互联网科技有限公司
互联网科技公司起名
互联网电商科技
礼当家互联网科技
互联网科技作文
唐信互联网科技
高科技互联网发展前景如何
科技赋能视角下互联网保险发展
抖集互联网科技技术咨询
容联科技互联网电商
保山互联网科技靠谱吗