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;
SQL 和 PL/SQL 也不相同。要在过程中执行 SQL,解析器需要 INTO 子句来存储 sql 语句返回的值。在PL/SQL
中,有理由执行SQL语句。您想稍后使用结果集进行处理。不只是检索什么都不做。
此外,在任何生产系统中使用 select *
都是一个坏主意。您不想在应用程序屏幕上转储 table 的所有列数据。不过还有很多其他原因,不在本题范围内。
您需要像下面这样修改您的 SQL -
SELECT column_name INTO variable FROM table_name
有几种方法可以通过PL/SQL中的SQL语句获取数据。您需要在此处详细说明您的要求并缩小到具体步骤。
如果您正在学习这些概念,我建议您先阅读 Oracle 文档。尝试理解这些概念,如果您发现任何问题,请准备一个测试用例,用文字解释您的问题,然后 post 提出问题。太宽泛的问题很难回答,而且大多被认为超出范围。
我对 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;
SQL 和 PL/SQL 也不相同。要在过程中执行 SQL,解析器需要 INTO 子句来存储 sql 语句返回的值。在PL/SQL
中,有理由执行SQL语句。您想稍后使用结果集进行处理。不只是检索什么都不做。
此外,在任何生产系统中使用 select *
都是一个坏主意。您不想在应用程序屏幕上转储 table 的所有列数据。不过还有很多其他原因,不在本题范围内。
您需要像下面这样修改您的 SQL -
SELECT column_name INTO variable FROM table_name
有几种方法可以通过PL/SQL中的SQL语句获取数据。您需要在此处详细说明您的要求并缩小到具体步骤。
如果您正在学习这些概念,我建议您先阅读 Oracle 文档。尝试理解这些概念,如果您发现任何问题,请准备一个测试用例,用文字解释您的问题,然后 post 提出问题。太宽泛的问题很难回答,而且大多被认为超出范围。