【问题标题】:Create a simple store procedure in oracle 12c在 oracle 12c 中创建一个简单的存储过程
【发布时间】:2018-07-15 12:22:30
【问题描述】:

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

【问题讨论】:

  • @PM77-1,你可以使用ASISplsql_procedure_source
  • @WernfriedDomscheit - 不知道。谢谢。
  • 请原谅我的问题,但是 - 将简单的 SELECT username FROM dba_users 放入 过程 的目的是什么?您期望得到什么好处?
  • 对于一个简单的选择,除了了解如何正确操作之外没有其他目的。我刚刚开始使用 oracle,我需要编写一个存储过程,其中包含一组更复杂的选择、插入等来测试某个产品。目前,我只想学习如何做一个简单的,因为我尝试的所有选项都失败了。

标签: sql oracle stored-procedures oracle12c


【解决方案1】:

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

【讨论】:

  • 谢谢!这是最好和最简单的解决方案。
【解决方案2】:

在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多