在 pl/sql 中正确使用游标?
properly using cursors in pl/sql?
我正在尝试这样输出:
In the case of a valid employee or employees:
Enter value for sv_firstname: chris
Enter value for sv_lastname: miller
Employee ID: 41822 Description: Cashier Pay Rate: .63
Employee ID: 80809 Description: Butcher Pay Rate: .26
PL/SQL procedure successfully completed.
这是我目前得到的:
DECLARE
CURSOR emp_cursor IS
Select e.empid, j.description, j.payrate from
employee e, job j where j.jobcode = e.jobcode AND
lower(lastname) = lower(lname) and
lower(firstname) = lower(fname);
fname employee.FIRSTNAME%TYPE:='&fname';
lname employee.LASTNAME%TYPE:='&lname';
emp employee.EMPID%TYPE;
descript job.DESCRIPTION%TYPE;
p_rate job.payrate%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp,descript,p_rate;
DBMS_OUTPUT.PUT_LINE(fname||' '||lname);
DBMS_OUTPUT.PUT_LINE('Employee Number: ' || emp);
DBMS_OUTPUT.PUT_LINE('Description: ' || descript);
DBMS_OUTPUT.PUT_LINE('Pay Rate: ' || p_rate);
EXIT WHEN emp_cursor%NOTFOUND;
END LOOP;
Close emp_cursor;
END;
/
这是我得到的错误
错误报告-
ORA-06550: line 5, column 11:
PL/SQL: ORA-00920: invalid relational operator
ORA-06550: line 3, column 4:
PL/SQL: SQL Statement ignored
ORA-06550: line 10, column 15:
PLS-00103: Encountered the symbol "," when expecting one of the following:
:= . ( @ % ; not null range default character
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
我弄明白了谢谢
DECLARE
fname employee.FIRSTNAME%TYPE:='&fname';
lname employee.LASTNAME%TYPE:='&lname';
emp employee.EMPID%TYPE;
descript job.DESCRIPTION%TYPE;
p_rate job.payrate%TYPE;
CURSOR emp_cursor IS
Select e.empid, j.description, j.payrate from
employee e, job j where j.jobcode = e.jobcode AND
lower(lastname) = lower(lname) and
lower(firstname) = lower(fname);
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp,descript,p_rate;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Employee Number: ' || emp);
DBMS_OUTPUT.PUT_LINE('Description: ' || descript);
DBMS_OUTPUT.PUT_LINE('Pay Rate: ' || p_rate);
END LOOP;
if emp_cursor%ROWCOUNT<1 THEN
DBMS_OUTPUT.PUT_LINE(fname||' '||lname||' does not exist');
END IF;
Close emp_cursor;
END;
/
你目前的主要问题是你在变量之前有游标声明;它需要反过来,而且你的出口在错误的地方。
至少运行:
DECLARE
fname employee.FIRSTNAME%TYPE:='&fname';
lname employee.LASTNAME%TYPE:='&lname';
emp employee.EMPID%TYPE;
descript job.DESCRIPTION%TYPE;
p_rate job.payrate%TYPE;
CURSOR emp_cursor IS
Select e.empid, j.description, j.payrate from
employee e, job j where j.jobcode = e.jobcode AND
lower(lastname) = lower(lname) and
lower(firstname) = lower(fname);
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp,descript,p_rate;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(fname||' '||lname);
DBMS_OUTPUT.PUT_LINE('Employee Number: ' || emp);
DBMS_OUTPUT.PUT_LINE('Description: ' || descript);
DBMS_OUTPUT.PUT_LINE('Pay Rate: ' || p_rate);
END LOOP;
Close emp_cursor;
END;
/
它不会以您想要的格式生成输出,但您现在应该可以试一试了。您还应该考虑使用 ANSI 连接语法而不是 Oracle 的旧的逗号分隔语法。在这里使用绑定变量而不是替换变量可能更简单。
我正在尝试这样输出:
In the case of a valid employee or employees:
Enter value for sv_firstname: chris
Enter value for sv_lastname: miller
Employee ID: 41822 Description: Cashier Pay Rate: .63
Employee ID: 80809 Description: Butcher Pay Rate: .26
PL/SQL procedure successfully completed.
这是我目前得到的:
DECLARE
CURSOR emp_cursor IS
Select e.empid, j.description, j.payrate from
employee e, job j where j.jobcode = e.jobcode AND
lower(lastname) = lower(lname) and
lower(firstname) = lower(fname);
fname employee.FIRSTNAME%TYPE:='&fname';
lname employee.LASTNAME%TYPE:='&lname';
emp employee.EMPID%TYPE;
descript job.DESCRIPTION%TYPE;
p_rate job.payrate%TYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp,descript,p_rate;
DBMS_OUTPUT.PUT_LINE(fname||' '||lname);
DBMS_OUTPUT.PUT_LINE('Employee Number: ' || emp);
DBMS_OUTPUT.PUT_LINE('Description: ' || descript);
DBMS_OUTPUT.PUT_LINE('Pay Rate: ' || p_rate);
EXIT WHEN emp_cursor%NOTFOUND;
END LOOP;
Close emp_cursor;
END;
/
这是我得到的错误
错误报告-
ORA-06550: line 5, column 11:
PL/SQL: ORA-00920: invalid relational operator
ORA-06550: line 3, column 4:
PL/SQL: SQL Statement ignored
ORA-06550: line 10, column 15:
PLS-00103: Encountered the symbol "," when expecting one of the following:
:= . ( @ % ; not null range default character
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
我弄明白了谢谢
DECLARE
fname employee.FIRSTNAME%TYPE:='&fname';
lname employee.LASTNAME%TYPE:='&lname';
emp employee.EMPID%TYPE;
descript job.DESCRIPTION%TYPE;
p_rate job.payrate%TYPE;
CURSOR emp_cursor IS
Select e.empid, j.description, j.payrate from
employee e, job j where j.jobcode = e.jobcode AND
lower(lastname) = lower(lname) and
lower(firstname) = lower(fname);
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp,descript,p_rate;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Employee Number: ' || emp);
DBMS_OUTPUT.PUT_LINE('Description: ' || descript);
DBMS_OUTPUT.PUT_LINE('Pay Rate: ' || p_rate);
END LOOP;
if emp_cursor%ROWCOUNT<1 THEN
DBMS_OUTPUT.PUT_LINE(fname||' '||lname||' does not exist');
END IF;
Close emp_cursor;
END;
/
你目前的主要问题是你在变量之前有游标声明;它需要反过来,而且你的出口在错误的地方。
至少运行:
DECLARE
fname employee.FIRSTNAME%TYPE:='&fname';
lname employee.LASTNAME%TYPE:='&lname';
emp employee.EMPID%TYPE;
descript job.DESCRIPTION%TYPE;
p_rate job.payrate%TYPE;
CURSOR emp_cursor IS
Select e.empid, j.description, j.payrate from
employee e, job j where j.jobcode = e.jobcode AND
lower(lastname) = lower(lname) and
lower(firstname) = lower(fname);
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp,descript,p_rate;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(fname||' '||lname);
DBMS_OUTPUT.PUT_LINE('Employee Number: ' || emp);
DBMS_OUTPUT.PUT_LINE('Description: ' || descript);
DBMS_OUTPUT.PUT_LINE('Pay Rate: ' || p_rate);
END LOOP;
Close emp_cursor;
END;
/
它不会以您想要的格式生成输出,但您现在应该可以试一试了。您还应该考虑使用 ANSI 连接语法而不是 Oracle 的旧的逗号分隔语法。在这里使用绑定变量而不是替换变量可能更简单。