【发布时间】:2016-01-20 23:48:27
【问题描述】:
我正在使用 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 Cavehere 和here 学习了如何执行它并查看 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 块中这样做,并且效果很好。这里的那条线有什么问题?想不通。
【问题讨论】:
-
引用游标与普通游标不同;您在其他块中到底在做什么 - 使用普通游标的 rowtpe? You can't do this,但我不确定这样做对你有什么帮助。而且我不完全确定您的问题是什么-只是为什么会出现该错误,或者您是否正在寻找如何在网格视图中获取参考光标?还是别的什么?
-
This answer 还展示了一种通过代码编辑器对话框在网格中获取结果的方法。这可能是其中一个问题的重复,但不确定是哪个问题。
-
@AlexPoole:我想我确实明确了我一直在尝试做的事情:
I'd like to execute the stored procedure in an anonymous PL/SQL block and see the results in a grid, but it has not been successful. -
是的,我说我知道如何通过 SQL Developer GUI 界面执行它,你说的代码编辑器对话框:
I know how to execute it in SQL Developer GUI interface and see the results. -
是的,但您问的唯一实际问题是“这里的那行有什么问题?”这似乎与网格部分无关。我链接的第二个问题是否有助于网格输出?
标签: oracle plsql sys-refcursor oracle-cursor recordtype