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

Plsql 将外部光标替换为内部光标,plsql,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 =

早上好/下午好,我希望我能得到一个快速的答案: 我已收到更新以下区块的问题:

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

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

我的家庭作业:) 通过剖析一段Oracle PL/SQL代码来学习一些编程

闲逛一下,通读一下这本指南,它可能是一个有用的学习练习。你只需要运用一点精神能量来跟上

任务一:识别内部和外部PL/SQL块 什么是PL/SQL代码块?OP是
匿名PL/SQL块的一个示例。这意味着一旦它被执行,它就不存在于数据库中

将代码样本拆分,考虑组件的组成部分。链接是一个图表,灵感来自史蒂文·费尔斯坦(Steven Feuerstein)和比尔·普里比尔(Bill Pribyl)最喜欢的参考资料(你们中的一些人可能现在身边还有一个印刷版…)

如果你能读一下封面,上面写着:“封面是甲骨文8”。。。本书中的许多原则与当今较新版本的Oracle数据库100%相关

任务二:什么是光标,它看起来像什么? A有一个术语
游标
,后跟一些以
SELECT开头的SQL查询块。。。从…起等等。

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

你能在代码中找到光标吗

内部和外部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;
这就是我们在谈论
内部
外部
程序组件时所得到的。通过一些研究或简单的实验,你会发现这一点

任务三:试着忽略与练习无关的内容 要完成这项任务,你可能还需要知道其他一些事情。我注意到一些令人分心的事情,如更为奇特的变量声明符号:

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%类型;
使用首选格式:
.%类型;
这实际上是一个很好的实践,所以也许你可以在将来记住这一点。创建名为
v\u region\u id
的变量是为了处理数据,以便与表中包含的值进行比较:
wf\u world\u regions
,列名为
region\u id
。您需要接受哪种数据类型?这没关系,你也不需要知道。该变量被设计为采用为该表的属性设置的任何类型

一些刚开始的开发人员(我们中的一些人是老前辈)还记得显式地声明数据类型,过度猜测和填充变量大小以适应“未知”

任务四:确定请求。。。及其意图

现在您已经了解了PL/SQL代码块的基础知识,考虑已经被问到的内容。 修改代码,将所有光标参照移动到嵌套块中。v_region_id和SELECT的声明仍然必须由外部块处理

例如,如果您的代码示例要大得多,那么请思考如果这些代码的功能单元(例如游标和游标处理循环)中的任何一个由于任何原因而失败会发生什么。这就是产生
异常
块的目的

将较小的程序单元和命令嵌套在它们自己定义的PL/SQL程序块中也是一种有效的策略。下图用于异常处理,但也描述了通过嵌套代码块执行的流程

。。。好了,这节课到此为止。知道您现在在做什么,您将如何处理重构此代码的请求

一些提示和提示可以尝试
  • 错误是你特别的朋友:尝试介绍一些你自己的错误。让代码做它不想做的事情。如果您引入一个
    异常
    块,再加上一点技巧,就可以让代码为您提供有关数据库如何解释和执行代码不同部分的线索

  • < > >强> DBMS出了什么?< /强>之前,如果您还没有遇到过这个命令,那么当您第一次学习如何使用示例时,请考虑在代码中使用大量的命令。这与其他语言中的
    PRINT
    命令类似,这意味着数据库在执行命令时会将命令输出到屏幕上。它有助于设置标记,也是通过代码跟踪执行进度的一种方式

    PL/SQL中的语句是:

    DBMS_OUTPUT.PUT_行(“此处的文本输出”)

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

希望这能让你在寻找什么的问题上领先一步。对于任何关于本帖性质或原因的错误假设,我深表歉意。。。这里有很多人喜欢提供帮助,但也不喜欢在没有任何初步努力证据的情况下提供“简单的答案”

这篇文章开启了一个关于PL/SQL编程基础知识的有用讨论,因此我相信它将对其他可能阅读本文的人有所帮助。祝你好运

欢迎光临