Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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 Oracle游标未从SELECT语句填充?_Sql_Oracle_Stored Procedures - Fatal编程技术网

Sql Oracle游标未从SELECT语句填充?

Sql Oracle游标未从SELECT语句填充?,sql,oracle,stored-procedures,Sql,Oracle,Stored Procedures,我一直在编写一个存储过程,从表中选择一组ID,将结果集保存到游标中,然后在游标中循环,根据游标中的哪个ID更新表中的行。计划再添加几个条件语句,但到目前为止 CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS AS CURSOR person_cur IS select b.id from blah1 b inner join blah2 b2 on b.id = b2.fkid; person_rec person_

我一直在编写一个存储过程,从表中选择一组ID,将结果集保存到游标中,然后在游标中循环,根据游标中的哪个ID更新表中的行。计划再添加几个条件语句,但到目前为止

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS

CURSOR
person_cur
IS

select b.id
    from blah1 b
        inner join blah2 b2 on b.id = b2.fkid;
person_rec person_cur%ROWTYPE;

BEGIN
FOR person_rec in person_cur

LOOP

dbms_output.put_line
(
person_rec.id
);

UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id = person_rec.id;

END LOOP;
COMMIT;

END;
我这里的代码编译得很好,尽管执行时,更新从未发生。我在输出行中添加了内容,以查看光标中的内容,但没有打印任何内容

我用来填充游标的Select语句本身运行良好,返回了我期望它返回的所有数据,尽管在上面的代码中执行时,什么也没有返回。这就好像开始之后的一切都没有执行,尽管我不明白为什么像前面提到的那样,我的Select会自行返回结果

也许在填充光标的上下文中,某些行为有所不同?任何建议都很好。

我们不能声明游标的行类型 如果在for循环中使用游标,则for循环中使用的变量将用于访问游标中的列

因此,在执行过程以查看resultsprintable语句之前,请删除rowtype声明并尝试like,此外还包括SET SERVEROUT ON命令

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS

CURSOR person_cur IS
     select b.id from blah1 b inner join blah2 b2 on b.id = b2.fkid;
BEGIN
     FOR person_rec in person_cur LOOP
          dbms_output.put_line(person_rec.id);
          UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id = person_rec.id;
     END LOOP;
     COMMIT;
END;

请检查没有光标和循环的过程

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS
BEGIN
UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id IN (select b.id
    from blah1 b inner join blah2 b2 on b.id = b2.fkid);
END;
使用循环检查

CREATE OR REPLACE PROCEDURE CHANGE_PESONAL_DETAILS
AS
CURSOR person_cur IS
  select b.id
    from blah1 b
        inner join blah2 b2 on b.id = b2.fkid;

  person_rec person_cur%ROWTYPE;
BEGIN
    OPEN person_cur;
    LOOP
      FETCH person_cur INTO person_rec;
      EXIT WHEN person_cur%NOTFOUND;

      UPDATE blah1 set Details = DetailsLineOne || ' ' || DetailsLineTwo WHERE id = person_rec.id;
    END LOOP;
    CLOSE person_cur;
END;

如果以独立方式运行游标select,那么它是否在运行过程的同一会话中返回任何数据?此外,在运行该过程时,如果使用gui,是否已将serveroutput设置为on或等效?首先不需要光标。这只会使您的更新效率大大降低。@DazzaL-是,光标选择返回我希望它单独运行时返回的数据,即使在添加set-serveroutput on之后,仍然没有打印输出。即使删除行类型,我仍然没有运气。已将输出替换为基本的“Hello World!”字符串,甚至不是正在输出的字符串。就好像在select语句之后没有执行任何操作来填充光标一样!我认为我们的select语句没有给出任何记录,只是尝试只执行select语句,即select b.id from blah1 b INERNAR join blah2 b2 on b.id=b2.fkid;并告诉我们结果。select语句返回单独运行时所需的所有记录。好的!!尝试删除光标,只需在for循环中包含相同的select语句,即创建或替换过程更改个人详细信息,如从blah1 b内部连接blah2 b2 on b.id=b2.fkid循环dbms_输出.put_lineperson_rec.id中选择b.id作为id中的begin for i;更新blah1 set Details=DetailsLineOne | |“”| | detailslinewo,其中id=i.id;端环;终止这样做很好。虽然我想在以后添加一些条件语句,但将其作为proc保留是我唯一的选择。