如何在oracle存储过程中获取游标数据

如何在oracle存储过程中获取游标数据,oracle,Oracle,我不熟悉oracle和存储过程。我正在尝试使用游标获取来获取行,并出现以下错误: create or replace PROCEDURE get_new AS CUST_ID varchar2(100); ROUTERNAME_N VARCHAR2(100); BEGIN CURSOR c1 IS SELECT TRAFFIC_CUST_ID,ROUTERNAME INTO CUST_ID,ROUTERNAME_N FROM INTERFACE_ATTL

我不熟悉oracle和存储过程。我正在尝试使用游标获取来获取行,并出现以下错误:

create or replace
PROCEDURE get_new
AS
    CUST_ID varchar2(100);
    ROUTERNAME_N VARCHAR2(100); 
BEGIN
    CURSOR c1 IS
    SELECT TRAFFIC_CUST_ID,ROUTERNAME INTO CUST_ID,ROUTERNAME_N
    FROM INTERFACE_ATTLAS
    WHERE rownum > 3;

    my_ename INTERFACE_ATTLAS.TRAFFIC_CUST_ID%TYPE;
    my_salary INTERFACE_ATTLAS.ROUTERNAME%TYPE;

    LOOP
        FETCH c1 INTO my_ename;
        FETCH c1 INTO my_salary;
        EXIT WHEN c1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(my_ename);
    end loop;
end;

您可能应该在专用部分(即开始之前)声明游标和变量my_ename和my_salary,然后打开游标:

PLS-00103: Encountered the symbol "C1" when expecting one of the following:
:= . ( @ % ;

您必须在开始之前声明游标。您将在游标声明中使用no INTO子句。然后必须打开光标。然后你会把我的名字,我的薪水,一个接一个地,你会把行,而不是列。其中rownum>3不返回任何行。因为你不想要第一排,你也永远不会得到第二排、第三排和第四排

您可以使用隐式游标,它更容易处理,无需显式打开、获取和关闭:

IS
    CUST_ID varchar2(100);
    ROUTERNAME_N VARCHAR2(100);
    C1 sys_refcursor;
    my_ename INTERFACE_ATTLAS.TRAFFIC_CUST_ID%TYPE;
    my_salary INTERFACE_ATTLAS.ROUTERNAME%TYPE;
BEGIN
    OPEN C1 for
    SELECT ...
改写如下:

BEGIN
  FOR rec IN
  (
    select traffic_cust_id, routername 
    from interface_attlas
    where rownum <= 3
  ) LOOP
     DBMS_OUTPUT.PUT_LINE(rec.traffic_cust_id || ': ' || rec.salary);
  END LOOP;
END;
不要忘记打开和关闭光标。由于rownum>3,它总是不打印任何内容;您想键入:rownum<3;,不是吗

create or replace
PROCEDURE get_new
AS
    my_ename INTERFACE_ATTLAS.TRAFFIC_CUST_ID%TYPE;
    my_salary INTERFACE_ATTLAS.ROUTERNAME%TYPE;
    CURSOR c1 IS
    SELECT TRAFFIC_CUST_ID,ROUTERNAME
    FROM INTERFACE_ATTLAS
    WHERE rownum > 3;
BEGIN
  open c1;    
    LOOP
        FETCH c1 INTO my_ename, my_salary;
        EXIT WHEN c1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(my_ename);
    end loop;
  close c1;
end;
游标应该在声明部分声明。然后必须在开始和结束部分打开。在声明部分,您不能为变量赋值。取值时,不能从光标中随机选择值

修改代码:

create or replace
PROCEDURE get_new
AS
    CUST_ID varchar2(100);
    ROUTERNAME_N VARCHAR2(100); 
BEGIN
    CURSOR c1 IS
    SELECT TRAFFIC_CUST_ID,ROUTERNAME INTO CUST_ID,ROUTERNAME_N
    FROM INTERFACE_ATTLAS
    WHERE rownum > 3;

    my_ename INTERFACE_ATTLAS.TRAFFIC_CUST_ID%TYPE;
    my_salary INTERFACE_ATTLAS.ROUTERNAME%TYPE;

    LOOP
        FETCH c1 INTO my_ename;
        FETCH c1 INTO my_salary;
        EXIT WHEN c1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(my_ename);
    end loop;
end;

没有显示错误,但没有显示数据。正如我所说:由于rownum>3,它总是不打印任何内容;如果只想查看两条记录,则必须将rownum>3更改为rownum<3;如果要查看表中的每条记录,则必须将其删除
create or replace
PROCEDURE get_new
AS
   no mean --CUST_ID varchar2(100);
  no means -- ROUTERNAME_N VARCHAR2(100); 

    CURSOR c1 IS
    SELECT deptno,job
    FROM emp;

    my_ename emp.deptno%TYPE;
    my_salary emp.job%TYPE;

BEGIN
    open c1;

    LOOP

       fetch c1 into my_ename,my_salary;
       -- FETCH c1 INTO my_ename;
        --FETCH c1 INTO my_salary;
        EXIT WHEN c1%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(my_ename);
    end loop;
end;

execute get_new.