Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有没有办法重新启动游标?神谕_Sql_Oracle - Fatal编程技术网

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,我不知道它们支持什么选项。啊。当我说我看不到输出时,我指的就是这个