PL/SQL Challenge 每日一题:2017-11-2 12.2新特性: 带约束的声明

[复制链接]
查看11 | 回复4 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
每两周的优胜者可获得itpub奖励的技术图书一本。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
注:本题的执行环境为12.2或更高
我执行了这些语句:
CREATE TABLE qz_data
(
col1 VARCHAR2 (10),
col2 VARCHAR2 (10)
)
/
BEGIN
INSERT INTO qz_data (col1, col2)
VALUES ('0123456789', '9876543210');
COMMIT;
END;
/
哪些选项在执行之后会显示 "98765432100123456789" ?
(A)
DECLARE
l_combined VARCHAR2 (qz_data.col1%LENGTH + qz_data.col2%LENGTH + 1);
BEGIN
SELECT col2 || col1 INTO l_combined FROM qz_data;
DBMS_OUTPUT.put_line (l_combined);
END;
/
(B)
CREATE OR REPLACE PACKAGE qz_lengths
AUTHID DEFINER
IS
col1_length CONSTANT INTEGER := 10;
col2_length CONSTANT INTEGER := 10;
END;
/
DECLARE
l_combined VARCHAR2 (qz_lengths.col1_length + qz_lengths.col2_length + 1);
BEGIN
SELECT col2 || col1 INTO l_combined FROM qz_data;
DBMS_OUTPUT.put_line (l_combined);
END;
/
(C)
CREATE OR REPLACE PACKAGE qz_lengths
AUTHID DEFINER
IS
col1_lengthINTEGER := 10;
col2_lengthINTEGER := 10;
END;
/
DECLARE
l_combined
VARCHAR2 (qz_lengths.col1_length + qz_lengths.col2_length + 1);
BEGIN
SELECT col2 || col1 INTO l_combined FROM qz_data;
DBMS_OUTPUT.put_line (l_combined);
END;
/

(D)
CREATE OR REPLACE PACKAGE qz_lengths
AUTHID DEFINER
IS
col1_length CONSTANT INTEGER := qz_data.col1%LENGTH;
col2_length CONSTANT INTEGER := qz_data.col2%LENGTH;
END;
/
DECLARE
l_combined VARCHAR2 (qz_lengths.col1_length + qz_lengths.col2_length + 1);
BEGIN
SELECT col2 || col1 INTO l_combined FROM qz_data;
DBMS_OUTPUT.put_line (l_combined);
END;
/
(E)
DECLARE
l_combined VARCHAR2 (21);
BEGIN
SELECT col2 || col1 INTO l_combined FROM qz_data;
DBMS_OUTPUT.put_line (l_combined);
END;
/

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案e
a 没有%length的语法
b 不允许这样定义lie
c 同b
d 同a
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
楼上没有考虑到12.2的新特性。可以装一个玩玩。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
我选BE
A、%length语法错。
B、正确,12c可以这样定义。
C、错误,变量必须是常量。
D、%length语法错。
E、正确。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案BE, 4楼得奖。
AD: 不存在%LENGTH这样的属性,不管我们多么希望有。这个代码块无法编译。
B: 这个方法利用了12.2的新特性,它允许你用静态的表达式(在编译时求值)来指定声明时的约束。注意你必须将其定义为常量,不是变量。
C: 这个选项会报错:
PLS-00491: numeric literal required
如果你想要利用这个特性,你必须声明常量,而不是变量。否则它们就不是静态的(静态的能够保证在编译时仅仅求值一次)
E:(不推荐)
嗯,是的,你当然可以这么做。但是这种“低层次”的硬编码会导致各种问题。最好把你的硬编码放到一个包里,并且在任何需要的地方引用这些常量。这样的话这些值就仅仅定义一次。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行