如何在oracle存储过程中获取游标数据
我不熟悉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
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.