相当于SQL Server和Oracle中FoxPro中的游标



在早期,FoxPro有一个叫做光标的东西,数据帧被添加到其中,然后再进行处理。但是,我想知道SQL Server和Oracle中的等同物是什么?

我的猜测是,我们只能在SQL Server和Oracle中创建一个输出表,但如果有类似的东西,请提及它。

例如。

SELECT * FROM Customers WHERE FName= 'David' INTO CURSOR **First_Name**
SELECT FName, LName, Contact, Email ;
FROM First_Name;
INTO CURSOR **Details**

这里First_Name和Details是游标。在上述程序的工作中,信息首先添加到First_Name,然后添加到Details。

当你的背景是一种特定的语言或系统时,你倾向于通过这些语言的概念来看待其他系统,而不是按照它们的用途来使用它们。

你的问题的答案是:忘记FoxPro光标。它们存在的原因适用于FoxPro,而不存在于SQL Server和Oracle。

这些系统都有一个叫做游标的东西,看起来非常相似,但使用(或大部分不使用)的原因与FoxPro游标非常不同。

FoxPro混合了SQL和过程语言。它不像SQL server或Oracle那样优化查询。因此,分解复杂查询的任务落在了使用游标优化这些步骤的开发人员的责任上。VFP像处理表一样处理游标,而其他RDMS不这样。

首先,停止思考你认为你需要完成的步骤,开始思考结果是什么样子的。然后使用更高级的SQL语言创建一个查询来完成这个任务。在SQL中,您主要描述结果应该是什么样子,然后让RDMS找出如何。你不需要指定每一步。这就是查询优化器的作用。

在FoxPro中,游标的一个非常常见的用途是创建一个中间结果,该结果将在下面的查询中多次使用。在这两个系统中,您都可以使用一个通用的表表达式或视图来完成此操作。

另一种常见用法是在将游标用作进一步处理的源之前,通过更新单个列对游标进行后处理。这将被更复杂的查询(可以分解为视图、普通表函数,或者——如果必要的话——甚至是函数)所取代,这些查询首先产生更新的结果。

对于Oracle(因为我不知道MS SQL Server),这里有两个例子,它们使用显式声明的游标,游标变量(保存数据游标返回)和相对复杂的方式来处理整个事情:

SQL> set serveroutput on
SQL>
SQL> declare
2    cursor c_job is
3      select distinct job from emp;
4    c_row      c_job%rowtype;
5    l_max_sal  emp.sal%type;
6  begin
7    open c_job;
8    loop
9       fetch c_job into c_row;
10       exit when c_job%notfound;
11
12       select max(sal)
13         into l_max_sal
14         from emp
15         where job = c_row.job;
16
17       dbms_output.put_line(c_row.job ||': '|| l_max_sal);
18    end loop;
19    close c_job;
20  end;
21  /
CLERK: 1300
SALESMAN: 1600
PRESIDENT: 5000
MANAGER: 2975
ANALYST: 3000
PL/SQL procedure successfully completed.

一个更简单的选项是游标FOR循环,它有点简单,因为Oracle为你做了大多数脏东西;如您所见,不再需要声明游标变量、打开游标、从游标中获取、担心退出循环或关闭游标:

SQL>
SQL> declare
2    l_max_sal   emp.sal%type;
3  begin
4    for c_job in (select distinct job from emp) loop
5       select max(sal)
6         into l_max_sal
7         from emp
8         where job = c_job.job;
9
10       dbms_output.put_line(c_job.job ||': '|| l_max_sal);
11    end loop;
12  end;
13  /
CLERK: 1300
SALESMAN: 1600
PRESIDENT: 5000
MANAGER: 2975
ANALYST: 3000
PL/SQL procedure successfully completed.
SQL>

最新更新