在oracle 12c中创建一个简单的存储过程

时间:2018-02-05 15:35:58

标签: sql oracle stored-procedures oracle12c

我希望创建一个简单的存储过程,以返回名为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;

2 个答案:

答案 0 :(得分:1)

您最好使用cursordbms_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