将外部光标替换为内部光标

时间:2014-04-23 05:44:44

标签: plsql

早上好/下午好,我希望我能快速回答这个问题: 我收到了更新以下块的问题:

    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的声明仍然必须由外部块处理。

我在这里陷入僵局,因为我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

我的家庭作业:)

通过剖析一大块Oracle PL / SQL代码来学习一些编程。

闲聊并阅读本指南,这可能是一项有用的学习练习。你只需要施加一点精神能量来跟上......

任务一:识别内部和外部PL / SQL块

什么是PL / SQL代码块? OP是Anonymous PL/SQL Block的示例。这意味着一旦执行它就不会存在于数据库中。

要拆分代码示例,请考虑a typical Oracle PL/SQL Block的组件。链接是一张图表,灵感来自Steven Feuerstein和Bill Pribyl最喜欢的参考文献(你们当中有些人现在可能还有一个印刷版本......)

Oracle PL/SQL Programming Book

  

如果您可以阅读封面,它会说:"涵盖Oracle 8" ......即使使用当今最新版本的Oracle数据库,本书中的许多原则也是100%相关的...

任务二:什么是光标,它看起来像什么?

PL/SQL Cursor的术语为CURSOR,后跟一些以SELECT ... FROM... etc.开头的SQL查询块

尝试重新排列代码,直到您可以识别可以组合在一起的离散的,功能性的部分和指令...再次查看上面原始的压缩代码块:

Reformatted PL/SQL Code Block

你能在代码中找到光标吗?

INNER和OUTER PL / SQL块的示例

在围绕您最初呈现的实际作业进行盘旋之后,这里有一个很好的视觉搭配,以显示我的努力所预期的概念(最终是与OP相关的作业)

如果PL / SQL块由具有DECLAREBEGINEXCEPTIONEND等关键字的离散部分定义,则下一步是显示如何你可以把块放在块中。:

DECLARE

    CURSOR some_cur IS ...;

BEGIN

        DECLARE
           my_results VARCHAR2(10);

        BEGIN

              DECLARE
                  v_output  number;
              BEGIN
                  ...
              END;

         END;
 END;

这是我们在讨论INNEROUTER计划组件时所遇到的问题。通过一些研究或只是简单的实验,你会看到

任务三:尝试忽略与练习无关的内容

您可能认为完成此任务时还需要了解其他一些事项。我注意到的一些干扰是像更高级的变量声明符号:

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 Block Handling with Nested PLSQL Code Blocks

......嗯,这就是关于它的教训。知道你现在做了什么,你将如何处理重构此代码的请求?

尝试的一些提示和提示

  • 错误是您的特殊朋友:尝试介绍一些您自己的错误。让代码做你知道它不想要的事情。如果你引入一个EXCEPTION块,只需要一点点聪明才智,你就可以获得代码,为你提供有关数据库如何解释和执行代码不同部分的线索。

  • DBMS OUT-what?如果您之前没有遇到过此命令,请在首次了解样本的工作原理时,在代码中考虑使用它。它类似于其他语言中的PRINT命令,这意味着数据库在执行时将命令输出到屏幕。它有助于设置标记,也可以通过代码跟踪执行进度。

    PL / SQL中的那个语句是:

    DBMS_OUTPUT.PUT_LINE('Your Text Output Here');

    文本输出可以是任何字符串值或字符串类型的变量。

  

希望这能让您在寻求什么方面领先一步。对于这篇文章的性质或原因所做出的任何错误的假设都表示道歉...这里有很多人喜欢帮助,但也有厌恶提供&#34;简单的答案&#34;没有任何初步努力的证据。

这篇文章对PL / SQL编程的基础知识开辟了一个有用的讨论,所以我确信这对于那些也可以阅读这篇文章的人来说是一个帮助。祝好运!