Sql 有没有办法重新启动游标?神谕
我正在尝试做一些事情,例如:Sql 有没有办法重新启动游标?神谕,sql,oracle,Sql,Oracle,我正在尝试做一些事情,例如: for(int i = 0; i<10; i++) { for(int j = 0; j<10; j++) { Blah; } } //As you can see each time that there is a different i, j starts at 0 again. 我确实进行了联机检查,但找不到任何相关信息。您可以使用表变量存储sql语句的结果,然后在表上循环任意次数,而不是重新启动游标 下
for(int i = 0; i<10; i++)
{
for(int j = 0; j<10; j++)
{
Blah;
}
}
//As you can see each time that there is a different i, j starts at 0 again.
我确实进行了联机检查,但找不到任何相关信息。您可以使用表变量存储sql语句的结果,然后在表上循环任意次数,而不是重新启动游标 下面是一个使用SQLFIDLE示例数据的示例
DECLARE
CURSOR c1 IS
SELECT id,
TYPE,
details
FROM supportcontacts;
TYPE contactrec
IS TABLE OF c1%ROWTYPE INDEX BY BINARY_INTEGER;
acontact c1%ROWTYPE;
contactlist CONTACTREC;
counter INTEGER;
BEGIN
counter := 0;
OPEN c1;
LOOP
FETCH c1 INTO acontact;
IF c1%FOUND THEN
counter := counter + 1;
END IF;
Contactlist(counter) := acontact;
IF c1%NOTFOUND THEN
EXIT;
END IF;
END LOOP;
CLOSE c1;
FOR i IN 1..5 LOOP
FOR j IN 1..counter LOOP
dbms_output.Put_line(Contactlist(j).type || ' ' || Contactlist(j).details);
END LOOP;
END LOOP;
END;
/
哪个输出
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
下面是示例,但我不知道如何查看dbms_输出的输出,而不是重新启动游标。您可以使用表变量存储sql语句的结果,然后在表上循环任意次数 下面是一个使用SQLFIDLE示例数据的示例
DECLARE
CURSOR c1 IS
SELECT id,
TYPE,
details
FROM supportcontacts;
TYPE contactrec
IS TABLE OF c1%ROWTYPE INDEX BY BINARY_INTEGER;
acontact c1%ROWTYPE;
contactlist CONTACTREC;
counter INTEGER;
BEGIN
counter := 0;
OPEN c1;
LOOP
FETCH c1 INTO acontact;
IF c1%FOUND THEN
counter := counter + 1;
END IF;
Contactlist(counter) := acontact;
IF c1%NOTFOUND THEN
EXIT;
END IF;
END LOOP;
CLOSE c1;
FOR i IN 1..5 LOOP
FOR j IN 1..counter LOOP
dbms_output.Put_line(Contactlist(j).type || ' ' || Contactlist(j).details);
END LOOP;
END LOOP;
END;
/
哪个输出
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
Email admin@sqlfiddle.com
Twitter @sqlfiddle
下面是示例,但我不知道如何查看dbms_输出的输出您根本不需要第二个光标,只需使用Oracle中的set操作来更新适当的记录,而无需自己手动搜索:
DECLARE
v_teleCase TeleApp.teleCase%TYPE;
v_cashwithappyn TeleApp.cashwithappyn%TYPE
CURSOR TeleAppCursor
is
Select
distinct casenbr, cashwithappyn
from TeleApp;
BEGIN
open TeleAppCursor;
LOOP
fetch TeleAppCursor into v_teleCase, v_cashwithappyn;
EXIT when TeleAppCursor%NOTFOUND;
UPDATE ClientInfo
SET cashwithappyn = v_cashwithappyn
WHERE casenbr = v_teleCase
AND trim(cashwithappyn) is null;
END LOOP;
END;
最好不要使用与列同名的变量。您根本不需要第二个游标,只需使用Oracle中的set操作更新相应的记录,而无需自己手动搜索:
DECLARE
v_teleCase TeleApp.teleCase%TYPE;
v_cashwithappyn TeleApp.cashwithappyn%TYPE
CURSOR TeleAppCursor
is
Select
distinct casenbr, cashwithappyn
from TeleApp;
BEGIN
open TeleAppCursor;
LOOP
fetch TeleAppCursor into v_teleCase, v_cashwithappyn;
EXIT when TeleAppCursor%NOTFOUND;
UPDATE ClientInfo
SET cashwithappyn = v_cashwithappyn
WHERE casenbr = v_teleCase
AND trim(cashwithappyn) is null;
END LOOP;
END;
最好不要使用与列同名的变量。首先,为什么“重新启动”对您意味着什么,为什么需要“重新启动”?您发布的关于您试图完成的任务的伪代码似乎不需要重新启动。其次,为什么要在PL/SQL中编写嵌套循环?SQL是一种基于集合的语言——它将更加高效(更不用说更少的代码了)编写一条更新每一行的
UPDATE
语句,而不是编写两个循环并发出大量只更新一行的UPDATE
语句。我需要将第一个表的数据(cashwithappyn)输入到第二个表中,前提是caseNumber相同,并且第二个表cashwithappyn为空。我想,关闭光标,然后再次打开它会重新启动光标。但是,我仍然同意Justin的观点,为什么你要在代码中做所有的事情?这可以用一种更简单的方式完成。在这个项目之前,我从未真正与Oracle合作过。关闭并重新打开光标将再次返回结果。但是,第二次的结果可能不同(假设这是一个多用户系统,并且您没有将事务隔离级别设置为serializable)。您将承担第二次执行查询的成本。如果您的数据量很小,您可能会将数据从游标中提取到一个本地集合中,然后在该集合中进行多次迭代(尽管我仍然不明白为什么需要重新处理一行)。但是最有效的方法是使用一条SQL语句。首先,为什么“重启”对您意味着什么,为什么您需要“重启”?您发布的关于您试图完成的任务的伪代码似乎不需要重新启动。其次,为什么要在PL/SQL中编写嵌套循环?SQL是一种基于集合的语言——它将更加高效(更不用说更少的代码了)编写一条更新每一行的UPDATE
语句,而不是编写两个循环并发出大量只更新一行的UPDATE
语句。我需要将第一个表的数据(cashwithappyn)输入到第二个表中,前提是caseNumber相同,并且第二个表cashwithappyn为空。我想,关闭光标,然后再次打开它会重新启动光标。但是,我仍然同意Justin的观点,为什么你要在代码中做所有的事情?这可以用一种更简单的方式完成。在这个项目之前,我从未真正与Oracle合作过。关闭并重新打开光标将再次返回结果。但是,第二次的结果可能不同(假设这是一个多用户系统,并且您没有将事务隔离级别设置为serializable)。您将承担第二次执行查询的成本。如果您的数据量很小,您可能会将数据从游标中提取到一个本地集合中,然后在该集合中进行多次迭代(尽管我仍然不明白为什么需要重新处理一行)。但是最有效的方法是使用一条SQL语句。要查看输出,首先需要:SET SERVEROUTPUTON@kurosch在SQL中?你能和它共享一个链接吗?因为当我得到ORA-00922:缺少或无效选项:将SERVEROUTPUT设置为ON
时,我从来没有使用过SQL Fiddle,我不知道它们支持什么选项。啊。这就是我所指的,当我说我看不到输出时要看到你首先需要的输出:设置SERVEROUTPUTON@kurosch在SQL中?你能和它共享一个链接吗?因为当我得到ORA-00922:缺少或无效选项:将SERVEROUTPUT设置为ON
时,我从来没有使用过SQL Fiddle,我不知道它们支持什么选项。啊。当我说我看不到输出时,我指的就是这个