我正在使用 Oracle XE 的 HR 数据库学习 PL/SQL。
我创建了以下存储过程:
CREATE OR REPLACE PROCEDURE get_employees( p_country_id IN CHAR
, p_emp OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_emp FOR
SELECT e.first_name
,e.last_name
,e.department_id
,d.department_name
,l.city
,l.state_province
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id
INNER JOIN locations l
ON d.location_id = l.location_id
WHERE l.country_id = p_country_id;
END;
我知道如何在 SQL Developer GUI 界面中执行它并查看结果。我还在这里和这里从Justin Cave那里学到了如何执行它并查看 SQL*Plus 样式的结果,如下所示:
VARIABLE CE REFCURSOR;
EXEC GET_EMPLOYEES('US', :CE);
PRINT CE;
我想在匿名 PL/SQL 块中执行存储过程并在网格中查看结果,但它没有成功。
就像 Justin Cave 所建议的那样,以下执行得很好,但没有显示结果:
DECLARE
C_EMP SYS_REFCURSOR;
BEGIN
GET_EMPLOYEES('US', C_EMP);
END;
以下将失败:
DECLARE
C_EMP SYS_REFCURSOR;
L_REC C_EMP%ROWTYPE; --THIS LINE FAILS.
BEGIN
GET_EMPLOYEES('US', C_EMP);
-- LOOP AND FETCH GOES HERE.
END;
错误消息说:
PLS-00320:此表达式类型的声明不完整或格式错误
我不明白。我一直在其他一些匿名 PL/SQL 块中这样做,并且效果很好。这里的那条线有什么问题?想不通。