有奖活动:PL/SQL Challenge 每日一题:2012-3-6 应用上下文的设置

[复制链接]
查看11 | 回复8 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
本帖最后由 newkid 于 2012-3-8 06:23 编辑
最快答对的puber将获得彩蛋章一枚,其他会员如果提供有价值的分析、讨论也可获得彩蛋章一枚。
以往旧题索引:
http://www.itpub.net/thread-1499223-1-1.html
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
难度:高
我创建了这个包:
CREATE OR REPLACE PACKAGE plch_pkg
IS
PROCEDURE set_value (value_in IN VARCHAR2);
FUNCTION get_value RETURN VARCHAR2;
END;
/
CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
PROCEDURE set_value (value_in IN VARCHAR2)
IS
BEGIN
DBMS_SESSION.set_context ('plch_context', 'value', value_in);
END;
FUNCTION get_value RETURN VARCHAR2
IS
BEGIN
RETURN SYS_CONTEXT ('plch_context', 'value');
END;
END;
/
我的会话具备创建应用上下文(application context)的必要权限,如下所示:
CREATE CONTEXT plch_context USING plch_pkg
/
哪些选项包含了一个或多个语句,在执行之后会导致"xkcd"被显示在屏幕上?
(A)
CREATE OR REPLACE PROCEDURE plch_proc1 (value_in IN VARCHAR2)
IS
BEGIN
DBMS_SESSION.set_context ('plch_context', 'value', value_in);
END;
/
BEGIN
plch_proc1 ('xkcd');
DBMS_OUTPUT.put_line (plch_pkg.get_value);
END;
/

(B)
BEGIN
plch_pkg.set_value ('xkcd');
DBMS_OUTPUT.put_line (plch_pkg.get_value);
END;
/

(C)
CREATE OR REPLACE PROCEDURE plch_proc2 (value_in IN VARCHAR2)
IS
BEGIN
plch_pkg.set_value (value_in);
END;
/
BEGIN
plch_proc2 ('xkcd');
DBMS_OUTPUT.put_line (plch_pkg.get_value);
END;
/

(D)
BEGIN
DBMS_SESSION.set_context ('plch_context', 'value', 'xkcd');
DBMS_OUTPUT.put_line (plch_pkg.get_value);
END;
/

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
如果c的/begin改为
/
begin
那么
bc
否则b
没有直接调用DBMS_SESSION.set_context 的权限
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
改过来了,不知道怎么回事被itpub吃掉了回车,现在又多出来一个回车,不过不影响结果。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
我说你能不能晚点起床?把机会留给别人嘛求你啦。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
OMG~~~6:08
OO是准备包揽所有蛋章,然后开个煎饼果子店


回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
newkid 发表于 2012-3-8 06:25
我说你能不能晚点起床?把机会留给别人嘛求你啦。

明天不起那么早了
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
bs OO
哼~
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
OO毫无悬念地混到了蛋。
这个题目涉及了一些高级话题。
应用上下文(application context)是ORACLE保存在内存的 "名字-值"数据对(name-value pairs)的集合。应用上下文有一个称为“命名空间”的标签(例如,应用上下文empno_ctx用于读取所有员工的ID)。在这个上下文里面就是"名字-值"数据对(一个associative array,关联数组,也即index by table): 名字指向内存中保存着“值”的一个位置。
过程DBMS_SESSION.SET_CONTEXT 用来在当前用户的会话中设置应用上下文的值。
过程语法如下:
DBMS_SESSION.SET_CONTEXT (
namespace VARCHAR2,
attribute VARCHAR2,
value VARCHAR2,
usernameVARCHAR2,
client_id VARCHAR2);
在此声明中:
namespace: 应用上下文的命名空间,限制为30字节。例如,假设你正在使用一个称为custno_ctx的命名空间,你将用如下方法来指定:

namespace => 'custno_ctx',
attribute: 此应用上下文被设定的属性名称(就是前述"名字-值"数据对中的"名字"),限制为30字节。。例如,在custno_ctx命名空间中创建ctx_attrib属性:

attribute => 'ctx_attrib',
value: 此应用上下文被设定的属性值(就是前述"名字-值"数据对中的"值"),限制为4000字节。典型情况下这个值会保存在变量里,可用SYS_CONTEXT函数读出来。例如:

value => ctx_value,
username: 可选参数。应用上下文的数据库用户名属性。缺省值是NULL, 这将允许任何用户访问。对于基于数据库会话的应用上下文,请忽略此参数从而使用缺省的NULL值。
username 和 client_id参数在全局应用上下文中使用。更多信息请参见文档:
http://docs.oracle.com/cd/E11882 ... ontext.htm#CIHDFGAC

client_id: 可选参数。应用上下文中和应用相关的客户ID(最多64字节)。缺省值是NULL, 意味着未指定任何客户ID。对于基于数据库会话的应用上下文,请忽略此参数从而使用缺省的NULL值。
此过程必须从包中调用,在CREATE CONTEXT创建命名空间的时候指定这个包名。
A: 这个匿名块将会抛出ORA-01031: insufficient privileges错误。问题是plch_proc1过程试图调用DBMS_SESSION.set_context,而这个上下文在创建的时候指定了只能够被 plch_pkg 包设置。
B: 正确,调用了 plch_pkg 来设置值。
C: 正确,经过多层调用,最终还是调用了 plch_pkg 来设置值。
D: 错误同A, DBMS_SESSION.set_context是不可以直接调用的。

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
收到,给00发蛋
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行