select 存储过程 plsql

select stored proc plsql

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

我从一个简单的开始:

select * from test_table;

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

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

无效。预期 "INTO" 是我收到的错误消息。现在,我已经看到 SQL 服务器代码的语法示例,它只是将 select 语句推入 proc 并且它立即运行,但这里似乎不是这种情况。

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

在你的例子中,如果你想 return 记录集,你会做这样的事情:

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

有关示例,请参阅 this link

您好,欢迎来到 SO。
我假设您看到的完整错误是 PLS-00428: an INTO clause is expected in this SELECT statement 并且它是正确的,您必须在存储过程中有一个 INTO 语句。
对于与 SELECT INTO 语句相关的语法,我推荐 this link。
对于您的代码,我推荐这个(我已经从您的 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 列。您不能 select 将多个记录或列放入其中。您需要引用 BULK COLLECT 功能才能做到这一点。有关这方面的示例,请随时阅读 here.

select * from test_table;

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

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

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

SELECT column_name INTO variable FROM table_name

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

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