我希望创建一个简单的存储过程,以返回名为dba_users的表中所有用户名的列表。
我正在使用的选项是:
SELECT username FROM dba_users
当我使用以下语法创建一个PROCEDURE时,它会被创建,但无法执行:
CREATE OR REPLACE PROCEDURE user_list_display
IS
BEGIN
SELECT username FROM dba_users
END;
为此,我得到了
ORA-00900: invalid SQL statement:
EXECUTE user_list_display;
答案 0 :(得分:1)
您最好使用cursor
与dbms_output.put_line
:
SQL> set serveroutput on;
SQL> CREATE OR REPLACE PROCEDURE user_list_display IS
BEGIN
FOR c in ( SELECT username FROM dba_users )
LOOP
dbms_output.put_line(c.username);
END LOOP;
END;
/
SQL> exec user_list_display;
答案 1 :(得分:0)
在Oracle12c中,您可以使用DBMS_SQL.RETURN_RESULT
。
CREATE OR REPLACE PROCEDURE user_list_display
IS
v_cursor SYS_REFCURSOR;
BEGIN
OPEN v_cursor FOR SELECT username FROM dba_users;
DBMS_SQL.RETURN_RESULT ( v_cursor );
END;
/
然后执行
EXEC user_list_display;
在较低版本中,从SQL * Plus(或在SQL Developer中作为脚本执行),您可以使用REFCURSOR
OUT
变量和PRINT
来显示结果。
CREATE OR REPLACE PROCEDURE user_list_display( output OUT SYS_REFCURSOR )
IS
BEGIN
OPEN output FOR SELECT username FROM dba_users;
END;
/
只要您想查看输出,就可以运行这3行。
VARIABLE output REFCURSOR
EXEC user_list_display(:output)
PRINT output