【问题标题】:select stored proc plsql选择存储过程 plsql
【发布时间】:2015-04-01 11:33:11
【问题描述】:

我对 Oracle 中的存储过程语法有点困惑。

我从一个简单的开始:

select * from test_table;

它起作用了,然后我把它放在一个proc中:

CREATE OR REPLACE PROCEDURE example
IS
BEGIN
   select * from test_table;
END;

不起作用。预期的“INTO”是我收到的错误消息。现在,我已经看到了 SQL Server 代码的语法示例,它们只是将一个 select 语句推入一个 proc 中并且它可以立即工作,但这里似乎并非如此。

【问题讨论】:

  • 正确。如果您只想运行查询,请运行查询。在存储过程中,您需要对数据做一些事情——以某种方式处理它。您可以模拟 SQL Server 方法的最接近方法是在 12c 数据库中,使用以下语法:声明 V_cursor SYS_REFCURSOR;开始打开 ​​v_cursor for select * from employees; dbms_sql.return_result(v_cursor);结尾; / 这将执行查询并返回结果。 plsql 过程中的相同原理。
  • 不要跳入编程,首先考虑需求,然后分析接近所需输出的方法。欢迎来到 Stack Overflow,欢迎来到 Oracle。您会发现 Oracle 和 SQL Server 之间有很多不同之处。

标签: sql database oracle stored-procedures plsql


【解决方案1】:

T-SQL 和 PL/SQL 是完全不同的语言。特别是,对于 PL/SQL,您必须将结果选择到某个变量或游标中。根据您计划对记录数据执行的操作 - 在过程中处理 - 或返回给调用者,将驱动您必须执行的操作。

在你的例子中,如果你想返回记录集,你可以这样做:

CREATE OR REPLACE PROCEDURE example (
                      p_recordset OUT SYS_REFCURSOR) AS 
BEGIN 
  OPEN p_recordset FOR
    select * from test_table;
END example ;

有关示例,请参阅 this link

【讨论】:

  • 所以它会将结果放入一个记录集,那么你如何执行 proc 以便它显示记录集?我不介意对 Oracle 看起来真的很天真,因为我是,但 SQL Server 似乎只是按照给定的方式执行此操作,不需要变通。只是有点混乱。
  • 取决于您使用的客户端语言。你没说。在这一点上,你需要自己做更多的研究。
  • 我正在使用 PL/SQL 和 Oracle 11。
【解决方案2】:

您好,欢迎来到 SO。
我假设您看到的完整错误是 PLS-00428: an INTO clause is expected in this SELECT statement 并且它是正确的,您必须在存储过程中有一个 INTO 语句。
我推荐this 链接以获取与SELECT INTO 语句相关的语法。
对于您的代码,我建议这样做(我已从您的 test_table 示例更改为 dba_user):

CREATE OR REPLACE PROCEDURE example
IS
l_username VARCHAR(25);
BEGIN
   select username INTO l_username from dba_users where user_id=1;
END;
/

注意:INTO 子句适用于 1 行中的 1 列。您不能在其中选择多个记录或列。您需要参考 BULK COLLECT 功能来执行此操作。有关示例,请随时阅读here

【讨论】:

    【解决方案3】:

    从 test_table 中选择 *;

    SQLPL/SQL 也不相同。要在过程中执行 SQL,解析器需要 INTO 子句来存储 sql 语句返回的值。在PL/SQL 中,执行SQL 语句是有原因的。您想稍后使用结果集进行处理。不只是检索而不做任何事情。

    此外,在任何生产系统中使用select * 也是一个坏主意。您不想在应用程序屏幕上转储表的所有列数据。然而,还有很多其他的原因不在这个问题的范围内。

    你需要像下面这样修改你的 SQL -

    SELECT column_name INTO variable FROM table_name

    在 PL/SQL 中有几种方法可以通过 SQL 语句获取数据。您需要在此处详细说明您的要求并缩小到具体步骤。

    如果您正在学习这些概念,我建议您首先开始阅读 Oracle 文档。试着理解这些概念,如果你发现任何问题,然后准备一个测试用例,用文字解释你的问题,然后发布一个问题。太宽泛的问题很难回答,而且大多被认为超出了范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-24
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 2022-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多