12
返回列表 发新帖
楼主: newkid

[每日一题] 有奖活动:PL/SQL Challenge 每日一题:2012-3-14 引用未经初始化的集合

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
11#
 楼主| 发表于 2012-3-16 23:13 | 只看该作者
sj198421 发表于 2012-3-16 23:05
学习下,NEWKID估计里面的题都会做了。。。神仙~~

哪里啊?我经常做错。如果偷偷做试验是可以做对

使用道具 举报

回复
论坛徽章:
1
奥运会纪念徽章:蹦床
日期:2012-07-22 13:09:34
12#
发表于 2012-3-17 09:46 | 只看该作者
newkid 发表于 2012-3-16 22:05
3楼正确。

当你使用嵌套表或者可变数组时,大部分情况下必须先调用它们的构造函数来进行初始化(构造函数 ...

分析的非常清楚。
D也正确,是不是说明已经初始化的集合也可以变成未初始话的?
那么初始化都做了哪些工作呢,分配内存吗?
有个问题我一直没弄清楚,v_var number;声明了一个变量v_var,那么此时给他分配内存了吗?我试过一次,把未初始化的变量作为参数传给一个过程(例 procedure pro1(filed1 number default 5,filed2 char)),即使过程的形参有默认值,结果也不是按照默认值去计算的,而是相当于参数为空。请问这个是为什么啊?

使用道具 举报

回复
论坛徽章:
171
ITPUB社区OCM联盟徽章
日期:2013-07-30 11:25:46最佳人气徽章
日期:2013-03-19 17:13:45ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30ITPUB季度 技术新星
日期:2012-05-22 15:10:11BLOG每日发帖之星
日期:2012-02-15 16:43:07生肖徽章2007版:马
日期:2012-03-07 10:13:26蓝锆石
日期:2012-02-24 10:13:15萤石
日期:2012-02-24 10:13:15海蓝宝石
日期:2012-02-24 10:13:15紫水晶
日期:2012-03-01 21:28:36
13#
发表于 2012-3-17 14:48 | 只看该作者
学习了~

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
14#
 楼主| 发表于 2012-3-18 03:33 | 只看该作者
smartzhai 发表于 2012-3-17 09:46
分析的非常清楚。
D也正确,是不是说明已经初始化的集合也可以变成未初始话的?
那么初始化都做 ...

要把一个已经初始化的集合变成未初始化很容易,只要赋值为NULL就可以了:
DECLARE
    TYPE plch_numbers_ntt IS TABLE OF NUMBER;
    lnt_1   plch_numbers_ntt;
BEGIN
   lnt_1 := plch_numbers_ntt(1,2,3);
   dbms_output.put_line(lnt_1.COUNT);  ----- 这里能输出3
   lnt_1 := NULL;
   dbms_output.put_line(lnt_1.COUNT);  ----- 这里报错
END;
/

过程里参数的default值,并不是说发现此参数为NULL时会把这个值赋给它,而是说你调用的时候忽略这个参数才会给这个值。

CREATE OR REPLACE PROCEDURE pro1 (filed1 number default 5,filed2 char)
AS
BEGIN  
   DBMS_OUTPUT.PUT_LINE('filed1='||filed1);
   DBMS_OUTPUT.PUT_LINE('filed2='||filed2);
END;
/


DECLARE
  v_var number;
  v_var2 CHAR(10);
BEGIN
  pro1(v_var,v_var2);
END;
/

输出:两个都是空
filed1=
filed2=

换一种调用方式,忽略第一个参数:

DECLARE
  v_var number;
  v_var2 CHAR(10);
BEGIN
  pro1(filed2=>v_var2);  ---- 只传入第二个参数,用名字记号法
END;
/

输出:第一个参数被赋予缺省值
filed1=5
filed2=

声明变量未赋值之前有没有分配内存?对于集合来说应该没有,就是一个空指针。像NUMBER型这样的应该已经分配了,我也是猜的。

使用道具 举报

回复
论坛徽章:
1
奥运会纪念徽章:蹦床
日期:2012-07-22 13:09:34
15#
发表于 2012-3-20 09:48 | 只看该作者
newkid 发表于 2012-3-18 03:33
要把一个已经初始化的集合变成未初始化很容易,只要赋值为NULL就可以了:
DECLARE
    TYPE plch_numbe ...

明白了,thanks!!

使用道具 举报

回复
论坛徽章:
0
16#
发表于 2012-3-20 10:06 | 只看该作者
B

使用道具 举报

回复
论坛徽章:
0
17#
发表于 2024-1-5 14:40 | 只看该作者
newkid 发表于 2012-3-16 22:05
3楼正确。当你使用嵌套表或者可变数组时,大部分情况下必须先调用它们的构造函数来进行初始化(构造函数和T ...

B是两个都没有初始化,不应该是错的吗?

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
18#
 楼主| 发表于 2024-1-5 22:53 | 只看该作者
Gkka 发表于 2024-1-5 14:40
B是两个都没有初始化,不应该是错的吗?

MULTISET UNION 这个操作符并不要求操作数被初始化。我也说不上为什么,文档里也没说明,就当作冷知识记住吧。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表