早上好/下午好,我希望我能快速回答这个问题: 我收到了更新以下块的问题:
DECLARE
v_region_id wf_world_regions.region_id%TYPE;
CURSOR country_curs
(p_region_id wf_world_regions.region_id%TYPE) IS
SELECT country_name, area
FROM wf_countries
WHERE region_id = p_region_id
ORDER BY country_name;
country_rec country_curs%ROWTYPE;
BEGIN
SELECT region_id INTO v_region_id
FROM wf_world_regions
WHERE region_name = 'Central America';
OPEN country_curs(v_region_id);
LOOP
FETCH country_curs INTO country_rec;
EXIT WHEN country_curs%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (country_rec.country_name ||
' ' || country_rec.area);
END LOOP;
CLOSE country_curs;
END;
以下内容: 修改代码,将所有游标引用移动到嵌套块中。 v_region_id和SELECT的声明仍然必须由外部块处理。
我在这里陷入僵局,因为我不知道该怎么做。
答案 0 :(得分:1)
通过剖析一大块Oracle PL / SQL代码来学习一些编程。
闲聊并阅读本指南,这可能是一项有用的学习练习。你只需要施加一点精神能量来跟上......
什么是PL / SQL代码块? OP是Anonymous PL/SQL Block
的示例。这意味着一旦执行它就不会存在于数据库中。
要拆分代码示例,请考虑a typical Oracle PL/SQL Block的组件。链接是一张图表,灵感来自Steven Feuerstein和Bill Pribyl最喜欢的参考文献(你们当中有些人现在可能还有一个印刷版本......)
如果您可以阅读封面,它会说:"涵盖Oracle 8" ......即使使用当今最新版本的Oracle数据库,本书中的许多原则也是100%相关的...
PL/SQL Cursor的术语为CURSOR
,后跟一些以SELECT ... FROM... etc.
开头的SQL查询块
尝试重新排列代码,直到您可以识别可以组合在一起的离散的,功能性的部分和指令...再次查看上面原始的压缩代码块:
你能在代码中找到光标吗?
INNER和OUTER PL / SQL块的示例
在围绕您最初呈现的实际作业进行盘旋之后,这里有一个很好的视觉搭配,以显示我的努力所预期的概念(最终是与OP相关的作业)
如果PL / SQL块由具有DECLARE
,BEGIN
,EXCEPTION
和END
等关键字的离散部分定义,则下一步是显示如何你可以把块放在块中。:
DECLARE
CURSOR some_cur IS ...;
BEGIN
DECLARE
my_results VARCHAR2(10);
BEGIN
DECLARE
v_output number;
BEGIN
...
END;
END;
END;
这是我们在讨论INNER
和OUTER
计划组件时所遇到的问题。通过一些研究或只是简单的实验,你会看到
您可能认为完成此任务时还需要了解其他一些事项。我注意到的一些干扰是像更高级的变量声明符号:
v_region_id wf_world_regions.region_id%TYPE;
uses the preferred format:
<variable name> <table name>.<column name>%TYPE;
这实际上是一种非常好的做法,所以也许你可以记住这个未来。创建了名为v_region_id
的变量来处理数据,以便与表中包含的值进行比较:wf_world_regions
以及名为region_id
的列。您需要接受哪种数据类型?这并不重要,你不需要知道。该变量旨在采用为该表的属性设置的任何类型。
一些初级开发人员(以及我们中的一些老人)记得明确地声明数据类型,并且过度猜测和填充我们的变量大小以适应&#34; unknown&#34;。
现在你已经了解了PL / SQL代码块的基础知识,请考虑已经提出的问题。
修改代码,将所有游标引用移动到嵌套块中。 v_region_id和SELECT的声明仍然必须由外部块处理。
例如,如果你的代码示例很多,那么如果任何这些功能代码单元(例如游标和游标处理循环)由于任何原因而失败,那么会想到会发生什么。这是EXCEPTION
块的目的。
它也是NEST
您自己定义的PL / SQL程序块中较小的程序单元和命令的有效策略。下图用于EXCEPTION处理,但它也描述了通过嵌套代码块执行的流程。
......嗯,这就是关于它的教训。知道你现在做了什么,你将如何处理重构此代码的请求?
错误是您的特殊朋友:尝试介绍一些您自己的错误。让代码做你知道它不想要的事情。如果你引入一个EXCEPTION
块,只需要一点点聪明才智,你就可以获得代码,为你提供有关数据库如何解释和执行代码不同部分的线索。
DBMS OUT-what?如果您之前没有遇到过此命令,请在首次了解样本的工作原理时,在代码中考虑使用它。它类似于其他语言中的PRINT
命令,这意味着数据库在执行时将命令输出到屏幕。它有助于设置标记,也可以通过代码跟踪执行进度。
PL / SQL中的那个语句是:
DBMS_OUTPUT.PUT_LINE('Your Text Output Here');
文本输出可以是任何字符串值或字符串类型的变量。
希望这能让您在寻求什么方面领先一步。对于这篇文章的性质或原因所做出的任何错误的假设都表示道歉...这里有很多人喜欢帮助,但也有厌恶提供&#34;简单的答案&#34;没有任何初步努力的证据。
这篇文章对PL / SQL编程的基础知识开辟了一个有用的讨论,所以我确信这对于那些也可以阅读这篇文章的人来说是一个帮助。祝好运!